Command Injection
Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。
PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。
四个安全级别:low、medium、high、disabled、impossible
- low级别源码分析
stristr()函数:搜索字符串在另一字符串中的第一次出现。该函数是二进制安全的,不区分大小写的;
如需进行区分大小写的搜索,使用 strstr() 函数。
下面语法:可通过w3school搜索
php_uname(mode) :返回了运行 PHP 的操作系统的描述。(详情见:https://www.php.net/manual/zh/function.php-uname.php)
服务器通过判断操作系统,执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。
漏洞利用
window和linux系统都可以用&&来执行多条命令。
&&表示逻辑”与”操作,如果前后两个条件都满足,返回布尔值true;否则返回false。
(详细用法见:https://docs.microsoft.com/en-us/cpp/cpp/logical-and-operator-amp-amp?view=vs-2019)
在windows系统下:
在Linux系统下:
&&:只有当第一个命令执行成功时,才会执行后面的命令。
- medium源码分析
与low级别相比,增加了黑名单机制,将“&&”、“;" 这两种符号过滤掉,但忽略了符号“&”;
而str_replace把”&&” 、”;”替换为空字符,可以想办法进行绕过,因此依旧存在漏洞可以利用。
漏洞利用
- 使用符号&
发现&表示:当第一个命令执行失败时,第二个命令依旧正常执行。
- 绕过方式
”127.0.0.1&;&net user”中的”;”会被替换为空字符,这样就变成了”127.0.0.1&&net user” ,执行成功!
- high级别源码分析
很明显,与medium级别相比,虽然在黑名单中增加了过滤内容,但由于黑名单本身的局限性,依旧存在绕过。
漏洞利用
仔细观察过滤符号,发现“| ”符号后面多了一个空格的位置,因此可以使用“|”符号进行利用。
“|”是管道符,表示将expression 1的输出作为expression 2的输入,并且只打印expression 2执行的结果。
(详情见:https://docs.microsoft.com/en-us/cpp/cpp/bitwise-inclusive-or-operator-pipe?view=vs-2019)
- impossible级别源码分析
stripslashes(string)
stripslashes()函数:删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。
(详情见:https://www.php.net/manual/zh/function.stripslashes.php)
explode(separator,string,limit)
(详情见:https://www.w3school.com.cn/php/func_string_explode.asp;https://www.php.net/manual/zh/function.explode.php)
is_numeric(string)
(详情见:https://www.w3cschool.cn/php/php-is_numeric.html;https://www.php.net/manual/zh/function.is-numeric.php;https://www.runoob.com/php/php-is_numeric-function.html)
impossible级别代码增加了Anti-CSRF token,同时对参数ip进行了严格的限制,只有如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。