您当前位置: 首页 » 敏感函数 » escapeshellarg()

escapeshellarg()

2017年2月21日 | 发表评论(0) 查看评论

这里说是escapeshellarg()+escapeshellcmd()缺陷更合适。escapeshellcmd()已经介绍过一次了

escapeshellarg把字符串转码为可以在 shell 命令里使用的参数

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。

这两个函数本身是没什么问题的,但是如果放在一起用,就可能产生一些非预想的结果。

先来一段代码

输出

172.17.0.2′ -v -d a=1
‘172.17.0.2”’ -v -d a=1′
‘172.17.0.2”’ -v -d a=1′

来分析一下具体流程:

1.$a传入的参数是172.17.0.2′ -v -d a=1

2.经过escapeshellargs()处理后成为‘172.17.0.2” -v -d a=1’  即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。

3.经过escapeshellcmd()处理后成为‘172.17.0.2”’ -v -d a=1′  这是因为escapeshellcmd对以及最后那个不配对儿的引号进行了转义

4.最后执行的是 ‘172.17.0.2”’ -v -d a=1′,由于中间的被解释为而不再是转义字符,所以后面的’没有被转义,与再后面的’配对儿成了一个空白连接符。

所以可以简化为 172.17.0.2 -v -d a=1’,即向172.17.0.2发起请求,POST 数据为a=1’。

这样就能绕过过滤进行注入。

审计实例:phpmailer漏洞

PHPMailer 对之前的漏洞做了如下补丁:

Alt text

 

即对输入使用escapeshellarg处理,最新版本中使用之前的 payload 攻击是失败的,例如:a( -OQueueDirectory=/tmp -X/var/www/html/x.php )@a.com,但是经小伙伴的测试,在最新版中可以使用这个 payload:a'( -OQueueDirectory=/tmp -X/var/www/html/x.php )@a.com,结果如下:

访问http://www.am0s.com/1.php?x=a%27(%20-OQueueDirectory=/tmp%20-X/var/www/html/x.php%20)@a.com,shell 成写入:

根据调试的结果,我们可以看到参数确实被escapeshellarg处理过了:

我们看一下mail的代码:https://github.com/php/php-src/blob/PHP-5.6.29/ext/standard/mail.c

可见参数在mail中又经过了escapeshellcmd的处理,将整个过程进行简化形成上面的代码

分类:

敏感函数

| 标签: