命令注入漏洞与防护
字数 990 2025-11-03 18:01:32
命令注入漏洞与防护
1. 漏洞描述
命令注入(Command Injection)是一种安全漏洞,攻击者通过应用程序向操作系统传递恶意命令并执行。当应用程序未对用户输入进行严格过滤,直接将输入拼接到系统命令中时,攻击者可利用特殊字符(如;、|、&等)注入非法命令,从而控制服务器。
2. 漏洞产生场景
- 示例场景:一个网络设备管理页面提供"ping测试"功能,用户输入IP地址后,后端执行命令
ping <用户输入>。 - 危险操作:若用户输入
8.8.8.8; cat /etc/passwd,拼接后的命令变为:
系统会先执行ping,再执行ping 8.8.8.8; cat /etc/passwdcat命令泄露敏感文件。
3. 漏洞原理分析
- 根本原因:用户输入被当作命令的一部分而非数据传递给系统Shell(如Bash、Cmd)。
- 关键问题:
- 应用程序直接调用系统命令执行函数(如PHP的
system()、Python的os.system())。 - 未对输入中的命令分隔符进行转义或过滤。
- 应用程序直接调用系统命令执行函数(如PHP的
4. 攻击手法举例
假设后端代码为:
$ip = $_POST['ip'];
system("ping -c 4 " . $ip); // 直接拼接输入
攻击者可能输入:
8.8.8.8 && rm -rf /(删除文件)127.0.0.1 | whoami(执行后续命令)$(cat /etc/shadow)(命令替换)
5. 防护方案
原则:永远不信任用户输入,避免直接拼接命令。
-
方案1:输入白名单验证
- 只允许输入特定格式(如IP地址、域名)。
- 示例:使用正则表达式验证
^[0-9.]{7,15}$确保输入仅为IP地址。
-
方案2:使用安全的API替代命令拼接
- 例如:用PHP的
filter_var($ip, FILTER_VALIDATE_IP)验证IP合法性后,直接调用网络库而非系统命令。
- 例如:用PHP的
-
方案3:转义或过滤危险字符
- 对输入中的
;、|、&等字符进行转义(如escapeshellarg()函数)。 - 示例:
$ip = escapeshellarg($_POST['ip']); system("ping -c 4 " . $ip); // 输入会被单引号包裹,视为整体数据
- 对输入中的
-
方案4:最小权限原则
- 运行应用程序的操作系统账户应限制权限(如禁止读写敏感目录)。
6. 进阶防护:纵深防御
- 部署WAF(Web应用防火墙)检测可疑命令模式。
- 对服务器进行安全加固,限制系统命令的执行环境(如使用容器隔离)。
总结
命令注入漏洞的危害极大,防护核心是将用户输入与命令分离,通过白名单、转义或使用安全API确保输入仅作为数据处理,而非可执行代码。