一,什么是命令执行漏洞:
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
二,利用条件:
1,应用调用执行命令的函数
2,将用户输入作为系统命令的参数拼接到命令中
3,没有对用户输入过滤或者过滤不严格
三,漏洞危害:
1,攻击者可以执行命令获取想要的信息
2,攻击者可以拿下服务器等
四,例子:
例子一:
代码:
1
2
3
4
5
6
|
<?php $arg = $_GET [ 'cmd' ];
if ( $arg ) {
system( "$arg" );
}
?> |
访问:http://127.0.0.1/mingling/simple1.php?cmd=ping%20127.0.0.1
也就是执行了“ping 127.0.0.1”命令
例子二:
1
2
3
4
5
6
|
<?php $arg = $_GET [ 'cmd' ];
if ( $arg ) {
system( "ping -c 3 $arg" );
}
?> |
访问:http://192.168.25.107/simple2.php?cmd=127.0.0.1;pwd
执行了pwd命令
例子三:
1
2
3
4
5
6
7
8
|
<?php $arg = $_GET [ 'cmd' ];
if ( $arg ) {
system( "ls -al \"$arg\"" );
}
?>
|
访问:http://192.168.25.107/simple3.php?cmd=/home%22;ifconfig%22
执行了ifconfig命令
例子四:
1
|
<?php eval ( $_REQUEST [ 'code' ]);?>
|
当访问:http://192.168.25.107/simple4.php?code=phpinfo();
注意后面的分号,当然后面也可以跟一句话木马。
例子五:
1
2
3
4
5
|
<?php $fun = $_GET [ 'fun' ];
$par = $_GET [ 'par' ];
$fun ( $par );
?> |
当访问:http://192.168.25.107/simple5.php?fun=system&par=whoami
其实就相当于是执行了:
1
|
system( "whoami" )
|
五:修复方案:
-
尽量少用执行命令的函数或者直接禁用
-
参数值尽量使用引号包括
-
在使用动态函数之前,确保使用的函数是指定的函数之一
-
在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
如:
1
2
3
4
5
6
|
<?php $arg = $_GET [ 'cmd' ]; // $arg = addslashes($arg);
$arg = escapeshellcmd ( $arg ); //拼接前就处理
if ( $arg ) {
system( "ls -al '$arg'" );
}?>
|
escapeshellcmd( )逃脱字符串中任何可能用来哄骗(trick)shell命令的字符串,此函数用来确定资料传送到exec( )或system( )之前,由使用者输入的任何资料已经逃脱,标准的用法如下
1
2
3
4
5
|
Example : <?php system( EscapeShellCmd ( $cmd ));
?> |
六:参考链接:
1,http://haojiawei.xyz/2017/03/15/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E/
2,http://www.jianshu.com/p/1e706f13b088
本文转自 天道酬勤VIP 51CTO博客,原文链接:http://blog.51cto.com/tdcqvip/1959586