命令注入是一种安全漏洞,允许攻击者在易受攻击的应用程序内执行任意命令。当应用程序将不安全的、用户提供的数据传递给系统 shell 时,攻击者可以注入额外的命令,这些命令将以易受攻击应用程序的权限执行。
有关相关的注入技术,请参阅 SQL 注入(针对特定数据库的注入)或 服务器端模板注入(针对模板引擎的注入)。
当应用程序将用户可控的数据合并到操作系统执行的命令中时,就会发生命令注入。如果应用程序没有正确验证或清理此输入,攻击者就可以插入命令分隔符或修饰符来执行任意命令。
来源:Command Injection/README.md46-66
命令注入漏洞通常发生在应用程序使用 system()、exec() 或类似函数将用户输入直接串联到命令字符串中来执行 shell 命令时。
如果攻击者输入类似 8.8.8.8; cat /etc/passwd 的内容,实际执行的命令将是:ping -c 4 8.8.8.8; cat /etc/passwd。
来源:Command Injection/README.md51-65
命令注入的最简单形式涉及插入一个完整的命令,该命令将由系统 shell 执行。
来源:Command Injection/README.md67-77
来源:Command Injection/README.md80-96
参数注入允许攻击者在只能将参数附加到现有命令时获得命令执行。
| 程序 | 注入向量 |
|---|---|
| Chrome | chrome '--gpu-launcher="id>/tmp/foo"' |
| SSH | ssh '-oProxyCommand="touch /tmp/foo"' foo@foo |
| psql | `psql -o' |
来源:Command Injection/README.md98-119
可以使用以下方法将命令注入到其他命令中
original_cmd_by_server `cat /etc/passwd` original_cmd_by_server $(cat /etc/passwd)来源:Command Injection/README.md139-151
应用程序通常会实现过滤器来防止命令注入。以下是绕过这些过滤器的技术
当空格被过滤时,可以使用几种替代方法
使用 $IFS(内部字段分隔符):
使用花括号扩展:
使用输入重定向:
来源:Command Injection/README.md155-175
命令可以跨越多行
URL 编码形式:cat%20/et%5C%0Ac/pa%5C%0Asswd
来源:Command Injection/README.md196-219
来源:Command Injection/README.md242-343
字符过滤器绕过的示例
来源:Command Injection/README.md242-304
在实现命令执行后,攻击者通常需要从目标系统提取数据。
此技术逐个字符地提取数据,使用时间延迟来确定字符猜测是否正确
来源:Command Injection/README.md354-373
此技术使用 DNS 查询来泄露数据,而 DNS 查询通常不太可能被监控或阻止
基于 DNS 的外泄在线工具
来源:Command Injection/README.md375-391
多语言命令注入 payload 在多种上下文中都是有效且可执行的,例如在不同的引号类型中。
示例 1
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
此 payload 在没有引号、单引号和双引号的上下文中均有效。
来源:Command Injection/README.md393-406
对于可能因超时机制而被终止的长期运行命令,请使用 nohup 使进程在父进程退出后继续运行
来源:Command Injection/README.md421-428
在类 Unix 系统中,-- 符号表示命令选项的结束
当您需要确保注入后的参数不被作为选项处理时,这会很有用。
来源:Command Injection/README.md430-432
| 工具 | 描述 |
|---|---|
| commixproject/commix | 自动一体化操作系统命令注入和利用工具 |
| projectdiscovery/interactsh | 一个 OOB 交互收集服务器和客户端库 |
来源:Command Injection/README.md40-43
有几个实验室可供练习命令注入技术