命令注入新玩法:巧借环境渗透测试目标
字数 1388 2025-08-18 11:37:53

命令注入高级利用技术:环境渗透与选项注入

0x00 引言

本文介绍了一种非标准的命令注入技术,通过巧妙利用目标环境实现命令注入,而非传统的命令分隔符或命令替换符注入。这种技术在常规命令注入讨论中较少被提及,但具有实际应用价值。

0x01 案例背景

漏洞场景

  • 目标执行file命令,接受两个参数f1f2
  • 输入经过多重过滤:
    1. 正则过滤引号(防止写webshell)
    2. 过滤常见命令分隔符(;)和命令替换符($()
    3. 过滤常见命令(lscat
    4. 使用引号包裹所有输入

防御措施分析

$f1 = preg_replace("/\'|\"|;|\$\(|`|ls|cat/", "", $_GET['f1']);
$f2 = preg_replace("/\'|\"|;|\$\(|`|ls|cat/", "", $_GET['f2']);
$cmd = "file '" . $f1 . "' '" . $f2 . "'";
system($cmd);

0x02 突破思路

1. 正则表达式审计

审查正则表达式时关注四个关键点:

a) 多行模式修饰符(/m)

  • 问题:当用于允许字符时可能产生逻辑漏洞
  • 示例:IP验证可能被换行符绕过

b) 遗漏匹配对象末尾的换行符

  • 问题:某些模式会忽略字符串末尾的换行符
  • 示例:preg_replace("/[^a-z0-9]/i", "", $input)可能漏过滤末尾换行符

c) 允许空白字符

  • 问题:可能遗漏换行符等空白字符
  • 示例:preg_replace("/[^a-z0-9\s]/i", "", $input)中的\s包含换行符

d) 误写反斜杠匹配模式

  • 关键发现:正则中\\实际应为\\\\
  • 影响:无法正确过滤反斜杠

2. 引号逃逸技术

a) 闭合手法

  • 原理:添加引号与原有引号配对闭合
  • 示例:file "foo" ";id;"file "foo"";id;""

b) 转义手法

  • 原理:使用反斜杠转义引号
  • 示例:file "foo\" ";id #"

3. 命令选项注入

当无法直接注入命令时,可注入命令选项:

file命令选项分析

  • -f选项:从文件中读取文件列表
  • 利用方式:file "foo\" " -f /etc/passwd #"

0x03 完整攻击链

  1. 利用正则漏洞:反斜杠未被正确过滤
  2. 引号逃逸:使用反斜杠转义引号
  3. 选项注入:注入-f选项读取文件
  4. 路径猜解:使用通配符模式匹配未知文件路径

攻击示例

f1=foo\&f2= -f .f1a9_/.fl?g_15_here.txt bar #

0x04 非预期解法

正则过滤缺陷深入分析

  • 错误正则:/\\|\n/实际被解释为/\|\n/
  • 结果:只过滤|\n组合,单独换行符\n未被过滤

直接命令注入

f1=foo\&f2=%0a/bin/gr[d-f]p+-r+.+.+%23

解释:

  • %0a:换行符(命令分隔符)
  • /bin/gr[d-f]p:匹配grep命令
  • -r . .:递归搜索当前目录

0x05 实际赏金案例

场景描述

  • 目标使用zip命令打包目录
  • 用户可控制归档文件名
  • 严格过滤命令分隔符和替换符
  • 禁止出口流量

利用方法

发现zip命令的-T--unzip-command选项可执行命令:

zip archive.zip -T -TT "id"

0x06 防御建议

  1. 正确编写正则表达式

    • 使用\\\\匹配反斜杠
    • 明确处理换行符
  2. 参数处理

    • 使用白名单而非黑名单
    • 避免将用户输入直接拼接至命令
  3. 命令执行替代方案

    • 使用语言原生API而非系统命令
    • 如必须使用命令,应严格限制参数
  4. 深度防御

    • 限制命令选项
    • 实施最小权限原则

0x07 总结

本文展示了命令注入的高级利用技术,重点包括:

  • 正则表达式审计技巧
  • 引号逃逸方法
  • 命令选项注入技术
  • 非预期解法的发现思路
  • 实际漏洞赏金案例的应用

这些技术扩展了传统命令注入的利用思路,强调了环境分析和深度审计的重要性。

命令注入高级利用技术:环境渗透与选项注入 0x00 引言 本文介绍了一种非标准的命令注入技术,通过巧妙利用目标环境实现命令注入,而非传统的命令分隔符或命令替换符注入。这种技术在常规命令注入讨论中较少被提及,但具有实际应用价值。 0x01 案例背景 漏洞场景 目标执行 file 命令,接受两个参数 f1 和 f2 输入经过多重过滤: 正则过滤引号(防止写webshell) 过滤常见命令分隔符( ; )和命令替换符( $() ) 过滤常见命令( ls 、 cat ) 使用引号包裹所有输入 防御措施分析 0x02 突破思路 1. 正则表达式审计 审查正则表达式时关注四个关键点: a) 多行模式修饰符(/m) 问题:当用于允许字符时可能产生逻辑漏洞 示例:IP验证可能被换行符绕过 b) 遗漏匹配对象末尾的换行符 问题:某些模式会忽略字符串末尾的换行符 示例: preg_replace("/[^a-z0-9]/i", "", $input) 可能漏过滤末尾换行符 c) 允许空白字符 问题:可能遗漏换行符等空白字符 示例: preg_replace("/[^a-z0-9\s]/i", "", $input) 中的 \s 包含换行符 d) 误写反斜杠匹配模式 关键发现:正则中 \\ 实际应为 \\\\ 影响:无法正确过滤反斜杠 2. 引号逃逸技术 a) 闭合手法 原理:添加引号与原有引号配对闭合 示例: file "foo" ";id;" → file "foo"";id;"" b) 转义手法 原理:使用反斜杠转义引号 示例: file "foo\" ";id #" 3. 命令选项注入 当无法直接注入命令时,可注入命令选项: file命令选项分析 -f 选项:从文件中读取文件列表 利用方式: file "foo\" " -f /etc/passwd #" 0x03 完整攻击链 利用正则漏洞 :反斜杠未被正确过滤 引号逃逸 :使用反斜杠转义引号 选项注入 :注入 -f 选项读取文件 路径猜解 :使用通配符模式匹配未知文件路径 攻击示例 0x04 非预期解法 正则过滤缺陷深入分析 错误正则: /\\|\n/ 实际被解释为 /\|\n/ 结果:只过滤 |\n 组合,单独换行符 \n 未被过滤 直接命令注入 解释: %0a :换行符(命令分隔符) /bin/gr[d-f]p :匹配 grep 命令 -r . . :递归搜索当前目录 0x05 实际赏金案例 场景描述 目标使用 zip 命令打包目录 用户可控制归档文件名 严格过滤命令分隔符和替换符 禁止出口流量 利用方法 发现 zip 命令的 -T 和 --unzip-command 选项可执行命令: 0x06 防御建议 正确编写正则表达式 使用 \\\\ 匹配反斜杠 明确处理换行符 参数处理 使用白名单而非黑名单 避免将用户输入直接拼接至命令 命令执行替代方案 使用语言原生API而非系统命令 如必须使用命令,应严格限制参数 深度防御 限制命令选项 实施最小权限原则 0x07 总结 本文展示了命令注入的高级利用技术,重点包括: 正则表达式审计技巧 引号逃逸方法 命令选项注入技术 非预期解法的发现思路 实际漏洞赏金案例的应用 这些技术扩展了传统命令注入的利用思路,强调了环境分析和深度审计的重要性。