Command Injection 命令注入
一、什么是命令注入
命令注入是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。
原理:web应用在调用这些函数执行系统命令的时候,在没有做好过滤用户输入的情况下,如果用户将自己的输入作为系统命令的参数拼接到命令行中,就会造成命令注(命令执行)的漏洞。
##二、命令注入相关的特殊字符
; 前后命令依次执行 注意前后顺序,若更变目录,则必须在“一句”指令内
|| 前命令执行失败后才执行后命令 -
&& 前命令执行成功后才执行后命令 -
& 前台执行后任务,后台执行前任务 如 a&b&c 则显示c的执行信息,a b在后台执行
| 管道,只输出后者的命令 当第一条命令失败时,它仍然会执行第二条命令
(反引号,仅linux) 即命令替换,echodate
,输出系统时间 使用反引号运算符的效果与函数shell_exec()相同,但在激活了安全模式或者关闭了shell_exec()时是无效的
$(command) 这是命令替换的不同符号。与反引号效果一样。echo $(date),输出系统时间. 按理说更推荐用这种方法,而不是反引号。
三、命令注入测试
实验环境:DVWA
3.1 DVWA-LOW等级下的命令注入
第一步:在command injection中输入IP地址
结果与在本机使用ping命令完全一致,说明这里可以让我们执行ping命令。
第二步:源码分析
对输入的ip地址进行ping操作,源码只让我们进行ping操作,没有其他动作,但它给了我们一个利用系统命令的平台。
第三步:输入一个命令拼接符号再加上需要执行的命令
这里我想查询一下用户名
命令注入成功,可以看到用户名为adminstrator
3.2 DVWA-medium等级下的命令注入
第一步:在command injection中输入IP地址
与low等级一致
第二步:分析源码看看和Low等级有什么区别
源码分析:发现在Low等级源码的基础上添加了一个黑名单,把‘&&’字符和‘;’字符过滤掉了,但我们可以使用黑名单之外的命令连接符命令注入
第三步:使用源码中黑名单之外的连接符进行注入
这里使用&进行注入
注入成功;
3.3 DVWA-high等级下的命令注入
第一步:在command injection中输入IP地址
同上
第二步:源码分析
发现还是一样的套路,只是过滤字符过滤得更多了。但仔细观察发现有一个过滤是’| ‘,这个过滤是加了空格的,说明这个过滤其实是没用的,只需要’|’后面直接加入参数,不保留空格,我们依然可以用这个命令连接符进行命令注入
第三步:使用连接符进行注入
命令:127.0.0.1 |ipconfig
注入成功
3.4 DVWA-impossible等级下的命令注入
第一步:在command injection中输入IP地址
同上
第二步:源码分析
这里防止命令注入的思路是白名单,也就是说对输入进行过滤,只允许输入ip地址。
将输入根据点分成4段,每一段都判断一下是不是数字,总共是不是4段,如果是的话,再用点把4段数字拼接起来,因此不存在命令注入。
安全防护:
1.token机制:同之前的暴力破解一样,使用了token机制(基于token的身份验证),由于token值,每次交互都是随机的,客户端和服务端都为随机值。
2.stripslashes()函数:过滤字符串中的反斜杠
3.explode()函数:将所有的字符串打散成为数组
4.is_numeric() 函数:用于检测变量是否为数字或数字字符串
第三步:使用命令连接符进行注入
这里我使用的是||
命令:127.0.0.1||ipconfig
提示错误:输入了无效ip;注入失败
四、命令注入的防御
到目前为止,防止操作系统命令注入漏洞最有效的方法是永远不要从应用层代码调用操作系统命令。
如果认为使用用户提供的输入调用操作系统命令是不可避免的,则必须执行强输入验证。一些有效验证的例子包括:
- 对允许值的白名单进行验证。
- 验证输入是否为数字。
- 验证输入是否只包含字母数字字符,不包含其他语法或空白。
版权归原作者 橘子~ 所有, 如有侵权,请联系我们删除。