Command Injection
命令执行产生原因
命令执行漏洞是指应用有时需要调用一些执行系统命令的函数如: system()、exec()、 shell exec()、eval()、 passthru0,代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
分类
利用条件
常见连接符
目录
low级别源码分析
medium级别源码分析
high级别源码分析
impossible级别源码分析
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系统下:
&&:只有当第一个命令执行成功时,才会执行后面的命令。
与low级别相比,增加了黑名单机制,将“&&”、“;" 这两种符号过滤掉,但忽略了符号“&”;
而str_replace把”&&” 、”;”替换为空字符,可以想办法进行绕过,因此依旧存在漏洞可以利用。
漏洞利用
发现&表示:当第一个命令执行失败时,第二个命令依旧正常执行。
”127.0.0.1&;&net user”中的”;”会被替换为空字符,这样就变成了”127.0.0.1&&net user” ,执行成功!
很明显,与medium级别相比,虽然在黑名单中增加了过滤内容,但由于黑名单本身的局限性,依旧存在绕过。
漏洞利用
仔细观察过滤符号,发现“| ”符号后面多了一个空格的位置,因此可以使用“|”符号进行利用。
“|”是管道符,表示将expression 1的输出作为expression 2的输入,并且只打印expression 2执行的结果。
(详情见:https://docs.microsoft.com/en-us/cpp/cpp/bitwise-inclusive-or-operator-pipe?view=vs-2019)
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进行了严格的限制,只有如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。