概述
命令注入(Command Injection)是一种常见的安全漏洞,主要发生在应用程序将用户输入的数据拼接到系统命令中执行,且未做充分过滤与校验的场景。攻击者通过精心构造的输入,能够注入恶意命令并在服务器上执行,导致数据泄露、系统瘫痪甚至服务器被攻陷。
漏洞原理
命令注入通常发生在Web应用调用操作系统命令时。开发者为了实现某些功能,比如文件操作、调用脚本或执行系统命令,而直接拼接用户输入的数据到命令字符串中,并调用如system()、exec()、popen()等接口执行。例如:
import os
user_input = input("请输入文件名:")
os.system("ls " + user_input)
如果user_input直接由用户输入并拼接到命令中,攻击者可以输入如; rm -rf /等恶意内容,导致服务器文件被删除。
漏洞危害
- 未授权执行操作系统命令
- 服务器敏感文件泄露或被删除
- 系统服务被破坏甚至失控
- 攻击者获得服务器权限,进入内网等更严重后果
漏洞利用案例
示例1:
假设Web应用支持通过参数查询文件:
http://example.com/scan.php?ip=127.0.0.1
后端代码将ip参数直接拼接到命令:
<?php
$ip = $_GET['ip'];
system("ping $ip");
?>
攻击者利用注入:
http://example.com/scan.php?ip=127.0.0.1;cat%20/etc/passwd
真实执行命令:
ping 127.0.0.1;cat /etc/passwd
这样不但执行了ping,还读取了/etc/passwd文件内容,造成敏感信息泄露。
防御与修复建议
- 严禁直接拼接用户输入到系统命令行中。
尽量使用参数化接口,如
subprocess.run()并传递参数数组,避免shell命令拼接。
- 对用户输入做充分的合法性校验和过滤。
只允许可接受的字符、模式、类型等,严格限制输入格式。
- 最小权限原则。
限制应用程序帐户权限,只能访问必要资源,即使被利用危害也有限。
- 使用安全API。
选择不调用Shell的API,或使用自带过滤机制的接口,如Python的
subprocess.run的args列表参数。
- 关闭/限制危险函数。
比如PHP中禁用
exec、system、shell_exec等函数。
- 代码审计与安全测试。
对涉及系统命令执行的代码进行审查和渗透测试。
参考资料