About
命令注入或命令执行漏洞是指可以执行系统或者应用指令(CMD 命令或者 bash 命令)的漏洞,主要是由于 WEB 应用基于一些函数的参数过滤不严导致。
我们可以先输入127.0.0.1
这个 IP 地址:
可以看到这是一个经典的 Ping 命令。解决乱码我们有两个方案:
- 在
DVWA-master\dvwa\includes
目录下找到dvwaPage.inc.php
文件中所有的charset=utf-8
,修改charset=gb2312
,即可; - 或修改系统区域设置,增加 UTF-8 支持。
对于命令执行漏洞,我们有一些常见的连接符总结:
连接符 | 举例 | 效果 |
---|---|---|
; |
A;B |
先执行 A,再执行 B |
& |
A&B |
先执行 A 再执行 B,如果 A 执行失败,还会继续执行 B |
| |
A|B |
先执行 A 再执行 B,不管 A 成功与否都会去执行 B |
&& |
A&&B |
A 执行成功,然后才会执行 B |
|| |
A||B |
A 执行失败,然后才会执行 B |
命令执行漏洞的防御方式:
- 尽量不去执行外部的应用程序或命令;
- 使用自定义函数或函数库实现外部应用程序或命令的功能;
- 在执行
system
、eval
等命令执行功能的函数前,校验参数内容;
Object
通过 RCE 远程查找操作系统上 web 服务的用户,以及机器的主机名。
001 Low
由于服务器是搭建在 Windows10 上的,我们尝试输入0.0.0.0 & whoami & hostname
,得到如下结果:
观察源码可知:
参数由 POST 请求得到,并且开发者没有对输入进行任何形式的安全检查,就直接放入shell_exec()
函数了。
002 Medium
观察源代码:
该级别下仅仅是增加了&&
和;
的替换,我们前面介绍了 4 个命令连接符,没被替换的连接符依旧能成功注入。比如输入0.0.0.0 & type index.php
后:
003 High
观察源代码:
在该等级下,开发者对输入的 IP 先trim
掉开头和结尾的空白符,然后进行模式替换,把大部分的连接符给替换成空字符串。
但我们注意观察,subsitutions
变量中的|
是带了一个空格的,如果我们输入:0.0.0.0 |dir ..
也能执行成功: