一、命令执行漏洞
命令执行漏洞是指可以随意执行系统命令,属于高危漏洞之一,也属于代码执行范围内就好比说一句话木马<?php @eval($_POST[cmd]);?>
二、分类
1、代码过滤不严或无过滤
2、系统漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,例如:http、ssh、dhcp等
3、调用第三方组件,例如PHP — exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec(),java — struts 2,thinkphp(老牌的PHP框架)
- system() 输出并返回最后一行shell结果。
- exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
- passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
- popen()、proc_open() 不会直接返回执行结果,而是返回一个文件指针
三、&&、&、|、||
windows支持:
- command1 && command2 #command1执行成功了才会执行command2
- command1 & command2 #不管command1是否执行成功,command2都会执行
- command1 | command2 #直接执行command2
- command1 || command2 #command1执行失败了,才会执行command2
Linux支持:
- command1 ; command2 #command1执行完执行command2
- command1 && command2 #command1执行成功了才会执行command2
- command1 & command2 #不管command1是否执行成功,command2都会执行
- command1 | command2 #将command1的输出结果作为command2的输入的内容(管道符)
- command1 || command2 #command1执行失败了,才会执行command2
四、实验环境
1、DVWA服务器:Windows Server 2003(192.168.247.129),启动phpStudy
2、测试机:物理机Windows 10,远程登录DVWA
五、实验步骤
安全等级:Low
1、查看安全等级LOW的命令注入源码
源码分析:
- 首先判断目标主机的操作系统,如果是Windows,则执行第一个命令;若是linux,指定ping目标IP四次,因为linux中ping命令是一直执行的,只有加了-c参数,指定发送的次数才能停止。
- 可以看到在接收用户输入的地方,对用户的输入的内容没有做任何的处理。不难看出这就是一个典型的命令注入漏洞,而且是最容易的。
2、命令注入漏洞(在服务器上执行命令并返回)
- 127.0.0.1
- 127.0.0.1 && dir //文件路径
- 127.0.0.1 | ipconfig //网卡
- 127.0.0.1 | arp -a //查看arp缓存表
- 127.0.0.1 | regedit //打开注册表
- 127.0.0.1 | netstat -ano //端口信息
如果命令执行结果出现乱码,可按Alt键,改变文字编码。
安全等级:Medium
1、查看源码
源码分析:
- $target = str_replace( array_keys( $substitutions ), $substitutions, $target );如果用户输入的内容中含有&&或;会将其替换为空。其他的部分基本和安全等级为LOW时相差不大。Str_replace()函数,以其他字符替换字符串中的一些字符(区分大小写)。
- 这里的源码对用户的输入进行了初步的过滤,过滤掉了一些能够同时执行命令的符号,但是我们知道,拥有同样作用的符号不止&&和;。所以依然可以进行命令注入。
2、命令执行漏洞
执行命令 — 127.0.0.1 && dir , 失败。
3、绕过方法
- 127.0.0.1 & dir
- 127.0.0.1 | dir
- 127.0.0.1 &&& arp -a
- 127.0.0.1 &;& arp -a
安全等级:High
1、查看源码
源码分析:
- 这个级别的源码和安全等级为medium级别的源码相差不大,只是将更多的符号加入黑名单。
- 总之,只是做黑名单的话,还是不够安全的。只要黑名单不够完整,就不是很安全。即使你认为名单已经很完整了。可能还有你不知道的存在可以利用。
2、命令执行漏洞
- 127.0.0.1 && arp -a
- 127.0.0.1 & arp -a
- 127.0.0.1 | arp -a
3、绕过方法
- 127.0.0.1 |ipconfig
安全等级:Impossible
1、查看源码
源码分析:
- explode()函数,将字符串变为数组。这里将我们输入的IP以 . 进行拆分,变成数组。
- 然后判断数组中的每个值是否为数字,且是否是四个对象。
- 如果结果为true的话,就会将这四组数通过 . 连接起来,执行ping命令。这样就杜绝了所有命令注入。
2、命令执行