命令注入漏洞medium级别
本帖最后由 bailancheng 于 2019-10-16 22:53 编辑命令注入漏洞medium级别
medium级别的防御:
$substitutions = array('&&' => '' , ';' => '', );
定义一个数组并赋值给变量$substitutions,数组中包括2个键:&&和;,它们对应的值都是NULL。
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
用str_replace函数对$target变量中的字符进行替换,替换的方法是将array_keys( $substitutions )替换成$substitutions,也就是将&&和;都替换成空值。
通过定义黑名单,对敏感字符进行过滤。
黑名单不完整,漏洞仍然存在。
high级别命令注入漏洞:
$octet = explode(".", $target);
通过explode函数以“.”为分隔符将$target变量中的IP地址进行分割,分割后会得到一个数组,并赋值给变量$octet。
if ((is_numeric($octet)) && (is_numeric($octet)) && (is_numeric($octet)) && (is_numeric($octet)) && (sizeof($octet) == 4))
用is_numeric函数依次判断$octet数组中的每个值是否是数字型数据,并且还使用sizeof函数判断$octet数组中元素的个数是否是4个。
常见防范措施:
对传入的命令进行严格过滤;
在后台对应用的权限进行控制(比如可以给 PHP 建立单独的账号,控制 PHP 的启动权限)。
漏洞防御:
EscapeShellCmd()函数
把字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义,如管道符(|)、分号(;)、重定向(>)、从文件读入(<)等
Re: 命令注入漏洞medium级别
楼主总结得很清晰,medium级别的黑名单确实不够完整,攻击者很容易用`&`、`|`、`%0a`等方式绕过。high级别用`is_numeric`和拆分为四段来校验IP地址,思路更加严谨,不过也要注意如果传入的IP地址末尾有空格或其他不可见字符,`explode`后数组长度可能还是会符合条件。另外,使用`EscapeShellCmd()`确实能减少很多风险,但不同环境下的实现细节也需要留意。感谢分享这个实战案例。Re: 命令注入漏洞medium级别
感谢分享!Medium 级别的黑名单过滤确实不够完善,只过滤了 `&&` 和 `;`,像管道符 `|`、换行符、反引号等仍然可能被利用。High 级别直接验证 IP 的格式和数字类型,安全性高多了。你提到的权限控制和 `EscapeShellCmd()` 函数也是很好的补充思路。Re: 命令注入漏洞medium级别
感谢分享,分析得很清楚。medium级别那个黑名单确实不完整,除了&&和分号,像管道符、换行符、`&`、`|`之类的都还能绕过。high级别用了分割加数字校验,安全性高了不少,但也得注意如果IP本身可以被伪造绕过的话可能还有隐患。EscapeShellCmd这个函数在PHP里是`escapeshellcmd`吧?不过它主要是防特殊字符被解析成新命令,实际用的时候还得配合`escapeshellarg`处理参数。楼主有没有测试过这些方法的实际绕过案例?
页:
[1]