vBulletin模板引擎的致命算术:一个正则表达式引发的预认证RCE"

admin 2026-10-17 12:26:11 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

vBulletin 模板引擎的致命算术:一个正则表达式引发的预认证RCE

幻泉之洲

2026年7月29日 10:12
北京

在小说阅读器读本章

去阅读

vBulletin 6.2.2 之前的版本中,模板运行时方法 runMaths 因过滤不严格将用户输入丢进 eval(),攻击者无需登录就能通过一个巧妙构造的 {vb:math} 标签执行任意 PHP 代码。这不是理论风险——公开的 PoC 已完整演示了如何借助 XOR 和古老的 phpfuck 技巧,把一串看似人畜无害的数学表达式变成操作系统命令执行的跳板。

一个本不该出现的 eval

出问题的代码在 /includes/vb5/template/runtime.php 的 runMaths 方法里。这个方法本意是处理模板中的 {vb:math} 宏,用来做一些简单的动态计算。常见的用法大概是计算页码、统计数字,或者格式化日期之类。

但它的实现方式让人捏一把汗。它把从模板传入的 $str 参数用一段正则“清洗”后,直接喂给了 eval():

$str = preg\_replace('#([^+\-\=/\(\)\d\^<>&|\.]\)#', '', $str);
// ...
$status = @eval(\"\$str = $str;\");

正则的意思是:只保留数字、数学运算符、括号和二进制位运算符(包括 ^``&``|``<``> 等),其余字符全部删掉。看起来好像把危险函数调用、引号、分号这类东西都挡在了门外,但实际效果跟纸糊的一样。

XOR 成了打开大门的钥匙

PHP 的弱类型和位运算特性在这里变成了一把万能钥匙。因为 XOR(^)在允许列表中,攻击者可以利用 phpfuck 技术——一种通过 XOR 两个不可见字符来拼出任意 ASCII 字符的技巧——绕过正则限制,在只能使用数字和运算符的条件下构造出完整的函数调用。

举个例子,你看到的可能是 ((1)^(2)) 和一堆异或组合,但在 PHP 眼里,这就是一串合法变量名或函数名。phpfuck 的核心正是:用 1 和 2 这些看似无害的数字,异或出 s、y、s、t、e、m……最终拼出 system。然后再通过类似方式构造括号和参数,实现 system('任意命令')。

这种绕过方式并不新鲜,在 CTF 比赛里经常出现。但被用在一个拥有数十万装机量的成熟 CMS 里,就暴露出一个很可怕的问题:开发者在写这行 eval 的时候,显然低估了“只能输入数字和运算符”这种限制的脆弱性。

最致命的是:不需要登录

通常这种模板层面的注入需要管理员登录后台去编辑模板。但 vBulletin 有一个公开的路由 ajax/render/[template_name],允许未认证用户渲染指定模板,并且会解析其中的 {vb:math} 标签。换句话说,攻击者根本不用拿到任何权限,只需要向目标 vBulletin 站点发送一个精心构造的 POST 请求,指定模板名为 pagenav(分页导航),并把 pagenav[pagenumber] 参数赋值为我们的 phpfuck payload,就可以触发 runMaths 里的 eval。

pagenav 模板里正好有这么一段:

{vb:set pagenav.currentpage, {vb:raw pagenav.pagenumber}}

{vb:raw} 会原样输出用户传入的 pagenumber,然后 {vb:set} 计算时就可能经过 runMaths,于是攻击链就形成了。整个过程没有认证检查,没有 CSRF 令牌校验。

PoC 告诉我们:这是实打实的 RCE

SSD Secure Disclosure 公布的 Exploit 脚本用不了几行代码。它拼 payload 的核心逻辑就是遍历要执行的命令字符串,把每个字符的 ASCII 码用数字异或表示,然后通过 pagenav[pagenumber] 注入,最后在返回内容里抓取命令输出。我在自己搭建的测试环境里跑了一下,成功率接近 100%,速度也很快——每次命令执行延迟不过一两秒。

说实话,这种漏洞放在 2026 年有点离谱。PHP 社区从十几年前就反复警告避免使用 eval(),尤其是和用户输入有任何间接接触时。vBulletin 不是第一个在这上面栽跟头的项目,但这次影响的版本跨度大——6.2.1 及之前、6.1.6 及之前全部中招,而很多站点因为定制化或怕兼容性问题并不会第一时间升级。

修复简单,但暴露的问题不简单

官方在 vBulletin 6.2.2 和 6.1.6 的安全补丁里已经移除了 eval(),改用更安全的数学表达式解析器。补丁本身很小,但我觉得更值得关注的是这次事故反映出的开发习惯:为了图省事,把模板逻辑和代码执行边界模糊化,最终让一个纯展示层的东西变成了命令执行入口。

如果你现在还在用老版本,别等了,立马更新。补丁地址:https://forum.vbulletin.com/forum/vbulletin-announcements/vbulletin-announcements\_aa/4509404-vbulletin-6-2-2-is-available。如果因为各种原因不能更新,至少用 WAF 规则拦截 ajax/render/pagenav 路由,并严格过滤 pagenav[pagenumber] 参数值中的非数字字符——但这只是临时的止血带,真正的问题在 runMaths 本身。

一个小建议:别再把模板引擎当脚本解释器了

模板引擎的职责是分离逻辑和视图,不是给视图开一扇执行代码的后门。类似 {vb:math} 这种功能看似方便,多数时候只是为了算个页码,根本用不到图灵完备的表达式。用白名单函数库或者沙箱化 DSL 替代 eval(),代价不高,却能从根本上堵死这类漏洞。vBulletin 这次的教训够深刻了。


参考资料

[1] https://ssd-disclosure.com/vbulletin-runtime-template-runmaths-preauth-rce/


苹果iOS26.6修复了内核代码执行、根权限和沙盒逃逸的缺陷" 网络安全文章

苹果iOS26.6修复了内核代码执行、根权限和沙盒逃逸的缺陷"

苹果发布iOS26.6和iPadOS26.6安全更新,修复了包括内核代码执行、root权限提升和沙箱逃逸在内的多个严重漏洞。最严重的是AVEVideoEncoder组件中的缓冲区溢出漏洞(CVE-2026-64747),可导致恶意应用以内核权限执行任意代码。此外还修复了MediaRemote组件的root权限提升漏洞(CVE-2026-43723)以及GameCenter和libc组件的沙箱逃逸漏洞。建议用户尽快通过设置完成更新。
Ferret揭示南非攻击者因Agent自主决策失误导致针对会计行业攻击全面泄露" 网络安全文章

Ferret揭示南非攻击者因Agent自主决策失误导致针对会计行业攻击全面泄露"

本文披露南非攻击者利用AIAgent对美国会计行业发起钓鱼攻击并致全面泄露的事件。该Agent在自动化构建C2时,因自主决策失误将工作区暴露于公网,导致密码、密钥及操作日志全部泄露。文章详细还原了攻击链与画像,指出AIAgent缺乏约束会反噬攻击者自身,建议安全团队加强开放目录监控,并强调AI攻击工具必须引入目录隔离机制以防范自主决策带来的反噬风险。
Chrome扩展监控ChatGPT、Claude、Gemini及其他平台上的AI对话" 网络安全文章

Chrome扩展监控ChatGPT、Claude、Gemini及其他平台上的AI对话"

安全研究人员发现Chrome扩展PromptOptimizer-SecondBrain(版本2.3.1)存在严重隐私风险。该插件宣称零数据收集,但实际上会强制截获用户在ChatGPT、Claude、Gemini等主流AI平台上的所有对话。插件安装后无需用户操作即自动启动,强制覆盖用户设置以开启数据采集。截获的数据经AES-GCM加密后传输至远程服务器,但加密密钥由服务商控制,其有能力解密所有数据。建议立即卸载该插件,并检查其他AI助手类插件的权限。
评论:0   参与:  0