1. Command Injection简介
(1)命令执行概念
命令执行漏洞是指可以随意执行系统命令,属于高危漏洞之一,也属于代码执行范围内;PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一;就好比说一句话木马<?php @eval($_POST['cmd']);?>
(2)分类
- 代码过滤不严或无过滤;
- 系统漏洞造成的命令执行,bash破壳漏洞,该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,例如:http,ssh,dhcp;
- 调用第三方组件,例如:php(system(),shell_exec(),exec(),eval()),Java(struts2),thinkphp(老牌的PHP框架);
(3) && 和 & 和 |
&&:command1 && command2
第一个命令执行成功后才会执行第二个命令,否则不执行;
& :command1 & command2
不管前面的命令是否执行成功,后面的命令都会执行;
| : command1 | command2
只执行后面的命令,不执行前面的命令,而且是前面的命令执行成功后才会去执行后面的命令;
2. Command Injection(命令行注入)
实验环境
(1)Windows服务器:Windows Server 2003,IP地址:192.168.37.128;
(2) 测试机:Windows7物理机(开启代理,代理服务器为burpsuit)
实验过程
安全级别:Low
(1)设置安全级别
(2)查看源码
(3)源码分析
stristr(string,search,before_search)
string 必需。规定被搜索的字符串。 search 必需。规定要搜索的字符串。
如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。
before_search 可选。默认值为 "false" 的布尔值。
如果设置为 "true",它将返回 search 参数第一次出现之前的字符串部分。
php_uname(mode)
这个函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s ”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。
可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,从而导致了严重的命令注入漏洞;
(4)实验操作
命令行执行漏洞
127.0.0.1
127.0.0.1&&ipconfig
127.0.0.1&ipconfig
127.0.0.1| calc
127.0.0.1| netstat -ano
安全级别:Medium
(1)设置安全级别;
(2)查看源码;
(3)源码分析
Medium级别相比Low级别的代码,服务器端对ip参数做了一定过滤,把”&&” 、”;”替换为空;
Medium级别的过滤方式本质上采用的是黑名单机制,相比白名单依旧存在安全问题;
(4)实验过程
4.1> 尝试使用&&,被过滤;
4.2> 服务器过滤了&&,并未过滤&;
4.3> 服务器过滤了&&,并未过滤 | ;
绕过方法
4.4> 绕过方法1 : 采用&&&的方式;
4.5> 绕过方法2 : 采用&;&的方式;
安全级别:High
(1)设置安全级别;
(2)查看源码
(3)源码分析
'&' => '',
';' => '',
'| ' => '', #“| ”后面有个空格;
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '
服务器对IP参数做了限制,过滤了如上字符,将如上字符都替换为空;
注:源码中是将“| ”替换为空,并不是“|”,所以可以采用“|”的方式绕过;
(4)实验过程
4.1> 尝试采用"&","| "......等方式实现命令行注入;
绕过方式
4.2> 绕过方法“|”;
安全级别:Impossible
(1)设置安全级别;
(2) 查看源码;
(3)源码分析;
在Impossible级别中,代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,杜绝了命令注入漏洞;
(4)实验过程;