命令注入原理与防御

从输入拼接、命令执行、参数处理和安全编码角度理解命令注入原理,并总结白名单、转义、参数化、权限最小化等防御方法。

写在前面:合法学习边界

本文讲解命令注入的原理和防御。请不要在真实系统上构造命令拼接、提权或利用系统命令。所有示例都应在自建靶场、授权测试环境中学习。

一、命令注入的本质

命令注入的本质是:程序把用户输入拼接到系统命令里,操作系统把输入当成命令的一部分执行了。

例如:

1
2
input = "127.0.0.1"
command = "ping -c 1 " + input

如果输入:

1
127.0.0.1; id

就可能变成:

1
ping -c 1 127.0.0.1; id

结果是多执行了一条命令。

二、常见触发点

1
2
3
4
5
6
ping 工具
文件路径参数
命令执行接口
下载/转换工具
网络诊断功能
批量管理脚本

常见危险字符:

1
2
3
4
;
&&
||
|

还有换行符、反引号、括号等。

三、为什么容易被忽略

很多系统认为“只有管理员才能访问”,所以没有做输入校验。但管理员接口也常被弱口令、SSRF、未授权访问或 XSS 打进来。

命令注入的危害往往比 SQL 注入更直接:

1
2
3
4
5
执行系统命令
读取文件
提权
下载工具
修改配置

影响与危害

命令注入能造成:

1
2
3
4
服务器命令执行(RCE)
读取敏感文件
反弹 Shell
内网横向渗透

风险等级:严重。

四、防御方法

1. 白名单

优先使用白名单而不是黑名单。

例如只允许 IP 地址:

1
只允许 IPv4 格式

2. 参数化调用

不要直接拼接 shell 字符串,改用参数数组调用。

3. 最小权限

不要让 Web 服务拥有过高权限。

4. 禁用不必要的命令

不要给普通用户执行敏感命令的能力。

5. 输入校验

限制长度、格式、字符集。

6. 日志与告警

监控异常命令参数、异常进程、异常子进程。

修复

1
2
3
4
5
禁止拼接 shell 命令,改用参数化 API
对可执行命令做白名单
对特殊字符(; | & $ `)做严格校验
进程以最小权限运行
修复后复测:注入命令不再执行

验证操作步骤

1
2
3
4
第 1 步:找命令执行入口(ping/搜索/导出功能)
第 2 步:送 ;id、| whoami、`id` 等分隔符组合
第 3 步:看命令输出是否回显 —— 回显即确认
第 4 步:换命令验证影响面(授权内)

五、报告中的正确写法

示例:

1
2
3
发现:/api/diag 接口的 host 参数会拼接到 ping 命令,且未过滤分号。
风险:可能导致命令执行、文件读取、权限提升或服务器控制。
建议:使用参数化调用;限制输入格式;最小权限运行;增加异常命令告警。

六、小结

命令注入的核心是“输入进入了命令执行路径”。防御时要优先使用白名单和参数化调用,而不是依赖简单替换。