【简介】Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。
命令注入
有些应用中,可能允许使用者向后台操作系统发送命令并执行,例如测试同网站的连接(ping命令),这种功能一般通过如PHP中的exec、shell_exec和ASP中的wscript.shell等函数实现。命令注入(command injection)漏洞指的是在这些功能中,由于对操作者的输入或返回的输出结果控制不严导致能够让恶意操作者利用管道符等将恶意系统命令拼接在正常命令之后并执行拿到输出结果。
通常来说,由应用程序传递操作系统命令会赋有和应用一样的权限,所以如果没有合理防御机制会给系统带来很大危害。
命令注入和代码注入不同,代码注入的目的在于将外部代码注入应用程序本身,并随程序执行;命令攻击的对象是服务器的宿主机。
DOS在一行中执行多条命令需使用的符号:
&&:只有当前面的命令执行成功才执行后面的命令
&:无论怎样总执行后面的命令
||:只有当前面的命令执行失败才执行后面的命令
|:将前面命令执行的输出作为后面命令执行的输入
安全等级 - Low
将DVWA的安全等级切换到Low。
① 选择【Command Injection】,输入dvwa的IP地址,显示Ping包信息,但是代码是乱的。
② 虚拟机中找到dwva的安装目录,找到并打开dvwa\includes\dvwaPage.inc.php文件。
③ 将所有的utf-8替换为gb2312,保存文件。
④ 再次Ping dvwa的IP地址,显示就正常了,点击【View Source】。
⑤ 从源代码可以看出:
stristr(string,search,before_search) 函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回 FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符),可选参数before_true为布尔型,默认为"false" ,如果设置为 "true",函数将返回 search 参数第一次出现之前的字符串部分。
php_uname(mode) 函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s ”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。
可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。
⑥ 在操作系统中,"&“、”&&“ 、”|“ 、”||" 都可以作为命令连接符使用,输入 192.168.1.199 & ipconfig ,在ping完后再执行ipconfig命令查看ip信息,可以看到成功执行了。
⑦ 输入 192.168.1.199 & net user ,可以查看到系统用户,当然还有很多命令可以执行。
安全等级 - Medium
将安全等级升级为中级。
① 从源代码可以看出,代码增加了对 && 和 ;的过滤,但并未过滤&、|、||。
② 仍然可以用 192.168.1.99 & whoami 查看到想要的信息。
③ 甚至用 &;& 也是可以的,因为过滤一次后 &;& 相当于 &&,输入 192.168.1.199 &;& net view ,仍然可以看到执行后的结果。
安全等级 - High
将安全等级升级为高级。
① 从源代码可以看出,代码把黑名单机制更加扩大了。但是我们可以看到代码中把 "|" 替换成了空白符,"|"却没有被过滤掉。
② 仍然可以用 192.168.1.99 |net user 查看到想要的信息,”|”是管道符,意思是将前者处理后的结果作为参数传给后者。
安全等级 - Impossible
将安全等级升级为不可能。
① 从源代码可以看出:
stripslashes(string) 函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。
explode(separator,string,limit) 函数把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目。
is_numeric(string) 函数检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE。
可以看到代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。
FortiWeb 防护
FortiWeb可以阻止这一类的攻击。
① 访问192.168.1.128,也就是经过FortiWeb保护的DVWA,安全选择Low,输入 192.168.1.199 & ipconfig,点击【Submit】。
② FortiWeb VM弹出阻止页面。
③ 在FortiWeb VM的【日志和报表】-【日志访问】-【攻击】,可以根据消息ID查找到消息日志,详细的介绍了命令注入被阻止的信息。