php system漏洞,命令执行漏洞

命令执行

应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、

passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令

拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

利用条件

应用调用执行系统命令的函数

将用户输入作为系统命令的参数拼接到了命令行中

没有对用户输入进行过滤或过滤不严

漏洞分类

代码层过滤不严

商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用:

system("/bin/program --arg $arg");

系统的漏洞造成命令注入

bash破壳漏洞(CVE-2014-6271)

调用的第三方组件存在代码执行漏洞

如WordPress中用来处理图片的ImageMagick组件

JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)

ThinkPHP命令执行

漏洞危害

继承Web服务程序的权限去执行系统命令或读写文件

反弹shell

控制整个网站甚至控制服务器

进一步内网渗透

等等

漏洞可能代码(以system为例)

1. system("$arg"); //直接输入即可

2. system("/bin/prog $arg"); //直接输入;ls

3. system("/bin/prog -p $arg"); //和2一样

4. system("/bin/prog --p=\"$arg\""); //可以输入";ls;"

5. system("/bin/prog --p='$arg'"); //可以输入';ls;'

在Linux上,上面的;也可以用|、||代替

;前面的执行完执行后面的

|是管道符,显示后面的执行结果

||当前面的执行出错时执行后面的

在Windows上,不能用;可以用&、&&、|、||代替

&前面的语句为假则直接执行后面的

&&前面的语句为假则直接出错,后面的也不执行

|直接执行后面的语句

||前面出错执行后面的

漏洞利用

示例一

$arg = $_GET['cmd'];

if ($arg) {

system("$arg");

}

?>

![command_execution1.png](http://upload-images.jianshu.io/upload_images/2461408-c5fd85bd2c9a1b61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* 示例二

> ```php

$arg = $_GET['cmd'];

if ($arg) {

system("ping -c 3 $arg");

}

1e706f13b088

command_execution2.png

示例三

$arg = $_GET['cmd'];

if ($arg) {

system("ls -al "$arg"");

}

![command_execution3.png](http://upload-images.jianshu.io/upload_images/2461408-d33aa1fbbe776039.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

注:若引号被转义,则可以用\`id\`来执行

* 示例四

> ```php

$arg = $_GET['cmd'];

if ($arg) {

system("ls -al '$arg'");

}

1e706f13b088

command_execution4.png

其他

代码执行:

在cmd.php中的代码如下:

eval($_REQUEST['code']);

?>

提交http://localhost/cmd.php?code=phpinfo() 后就会执行phpinfo()

动态函数调用

在cmd.php中的代码如下:

$fun = $_GET['fun'];

$par = $_GET['par'];

$fun($par);

?>

提交http://localhost/cmd.php?fun=system&par=net user,

最终执行的是system("net user")

漏洞修复

尽量少用执行命令的函数或者直接禁用

参数值尽量使用引号包括

在使用动态函数之前,确保使用的函数是指定的函数之一

在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义

$arg = $_GET['cmd'];

// $arg = addslashes($arg);

$arg = escapeshellcmd($arg); //拼接前就处理

if ($arg) {

system("ls -al '$arg'");

}

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值