WordPress插件Forminator未认证短代码执行漏洞(poc已公开)CVE-2026-92229
YGnight
YGnight
night安全
2026年9月24日 08:00
四川
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一、漏洞描述
Forminator Forms 是一个WordPress的表单插件,联系表单、支付收款、测验和投票等,插件声明需要 WordPress 6.4 起。近期被爆出存在未授权任意段代码执行漏洞,漏洞产生的入口挂在 WordPress 的 admin-ajax.php 上,注册钩子时同时挂了 nopriv 分支,不检查有没有登录。
受影响区间是 1.57.2 及之前所有版本,1.57.3 修掉,发布时间 9 月 17 日。
站点得开着测验模块才踩到这条分支,只摆一个联系表单的不在命中范围内。
| CVE 编号 | CVE-2026-92229 |
| 漏洞类型 | 未认证任意短代码执行,CWE-94 |
| 影响组件 | Forminator Forms 插件测验模块的 quizzes/front/front-action.php 结果渲染,以及 abstracts/abstract-class-front-action.php 的 POST 数据入口 |
| 受影响版本 | 1.57.2 及之前全部版本 |
| 修复版本 | 1.57.3,WordPress 插件仓库 changeset 3700724 |
| 请求入口 | /wp-admin/admin-ajax.php,action 为 forminator\_submit\_form\_quizzes 与 forminator\_submit\_preview\_form\_quizzes |
| 触发前提 | 站点启用了测验模块,攻击方能从页面解析出测验答案,或手工填入 answers 参数 |
| 危害面 | 以站点已注册短代码的执行结果为上限,取决于同装的插件与主题 |
| CVSS | 9.1,CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
二、漏洞原理
WordPress 的 AJAX 钩子留了两套。
WordPress 给 admin-ajax.php 的请求留了两套钩子,wp\ajax\ 走登录用户,wp\ajax\_nopriv\ 对所有人开放,Forminator 两个都挂上了。
表单提交那一段卡着 nonce 校验,看着像把外人挡在外面。
插件自己留了一个取 nonce 的接口,同样挂在 nopriv 上,任何人 POST 一次带 action 与 form\_id 的请求就能换到有效值。
// library/abstracts/abstract-class-front-action.php 1.57.2
139 add\_action( 'wp\_ajax\_forminator\_get\_nonce', array( $this, 'get\_nonce' ) );
140 add\_action( 'wp\_ajax\_nopriv\_forminator\_get\_nonce', array( $this, 'get\_nonce' ) );
1217 public function get\_nonce() {
1218 $form\_id = filter\_input( INPUT\_POST, 'form\_id', FILTER\_VALIDATE\_INT );
1219 wp\_send\_json\_success( wp\_create\_nonce( 'forminator\_submit\_form' . $form\_id ) );
1220 } // 返回的正是 54 行那次校验要用的值
拿到这个 nonce,再拼一个 action 为 forminator\_submit\_form\_quizzes 的 POST 请求就够了。
测验答案能从页面 HTML 里抠出来。预览接口同走一条路,action 换成 forminator\_submit\_preview\_form\_quizzes,还不用落库。
再看 current\_url 这条线。
所有 POST 字段进来只过一遍通用的递归清洗,current\_url 没有专属处理。
// library/abstracts/abstract-class-front-action.php 1.57.2
973 $post\_data = Forminator\_Core::sanitize\_array( $\_POST );
// library/modules/quizzes/front/front-action.php 1.57.2
60 if ( empty( self::$prepared\_data['current\_url'] ) ) {
61 self::$prepared\_data['current\_url'] = forminator\_get\_current\_url();
62 }
岔子出在测验结果的渲染。
社交分享那一段把 current\_url 塞进了 data-url 属性,外面套的是 WordPress 自带的 esc\_url。
// library/modules/quizzes/front/front-action.php 1.57.2
835 <ul class=\"forminator-social--icons\"
836 data-message=\"<?php echo esc\_textarea( $result\_message ); ?>\"
837 data-url=\"<?php echo esc\_url( self::$prepared\_data['current\_url'] ); ?>\">
869 $knowledge\_result\_html = ob\_get\_clean();
870 $knowledge\_result\_html = do\_shortcode( $knowledge\_result\_html );
esc\_url 管方括号,转的是主机名之后那一段。
本地按 WordPress 6.4 的 esc\_url 实现复算了一遍,位移一个字符就翻样。
// 本地复算,未在本站点 WordPress 上执行
https://target/[caption]x[/caption] -> https://target/%5Bcaption%5Dx%5B/caption%5D
https://target[caption]x[/caption] -> https://target[caption]x[/caption%5D
https://target[shortcode] -> https://target[shortcode]
载荷往前挪,落在 parse\_url 认作主机名的地方,方括号就整段留着。
真正要命的还在下面一行。
第 870 行把整段结果 HTML 丢进了 do\_shortcode。
这个函数按方括号标记的写法去找站点注册过的短代码,跑一遍回调,拿返回值替换原文。
分享属性里那点内容,就此从一段装饰用的地址变成了会执行的东西。
能跑到什么程度,看站点还装了哪些插件与主题。
1.57.3 改了两处。
// library/modules/quizzes/front/front-action.php 1.57.3
<?php echo wp\_kses\_post( wpautop( do\_shortcode( $text ), true ) ); ?>
// 870 行那次对整段缓冲的 do\_shortcode 整行删除
// library/abstracts/abstract-class-front-action.php 1.57.3
$post\_data = self::sanitize\_post\_current\_url( $post\_data );
protected static function sanitize\_post\_current\_url( $post\_data ) {
if ( empty( $post\_data['current\_url'] ) ) {
return $post\_data;
}
$current\_url = esc\_url\_raw( wp\_unslash( $post\_data['current\_url'] ) );
$current\_url = strip\_shortcodes( $current\_url );
$post\_data['current\_url'] = $current\_url;
return $post\_data;
}
短代码的执行范围从整段 HTML 缩到结论文字那一块。
current\_url 在进业务之前先做一次地址归一,再用 strip\_shortcodes 把短代码捞掉。
官方在注释里交代了为何没直接删方括号,查询串里的数组写法与 IPv6 字面地址都用得上。
三、修复建议
升到 1.57.3 或更高
近期值得重点关注的漏洞预警
【紧急漏洞预警】nacos爆出权限绕过漏洞,可以创建管理员账户,经过分析有点出处(已复现,exp脚本已编写)
WordPress插件Authorizer存在权限提升漏洞(POC已公开)CVE-2026-81294
WordPress插件MStoreAPI存在认证绕过漏洞(POC已公开)CVE-2026-13447
CakePHP爆出SQL注入漏洞(POC已公开)CVE-2026-77635
Node.js模块proxy-addr爆出严重漏洞CVE-2026-90711
Langflow爆出代码执行漏洞CVE-2026-17633 (POC已公开)
Apache CVE-2026-42536,补它只用一行,洞龄十四年
【紧急】搜狗输入法爆出远程代码执行漏洞CVE-2026-51990 ,已被在野利用
【紧急】无需登录就能获取 GitLab 的任意文件数据(附POC)
【紧急】JumpServer堡垒机被公布Access Key泄露漏洞,可以实现提权
Spring Cloud Azure公布严重漏洞 无需任何权限即可取得登录会话
【漏洞POC已公开】Linux RDS 爆出提权漏洞 一块内存放两次,root就到手了
13 行补丁,堵住Linux能拿 root 的内核洞(EXP已公开)
48 字节,换走一台 Windows 的 SYSTEM(CVE-2026-62735漏洞POC已公开)
【漏洞预警】linux删个网桥就能提权root?目前没有补丁(POC已公开)
【漏洞预警】自己注册个号,就能搬空别人的 Magento 订单和支付卡(POC已公开)
【漏洞预警】Next.js 爆出新漏洞,不用登录实现命令执行(POC已公开)
【漏洞补丁绕过预警】Redis CVE-2026-23479变种高危漏洞,EXP已公开
【漏洞补丁绕过】超 30 万 WordPress 站点受影响,Forminator 文件上传漏洞(附POC)
【漏洞预警】Exchange爆出RCE漏洞,利用Exchange 帮另一台 Exchange 开门(POC已公开)
【漏洞预警】不用登录,一个请求就能让 GeoServer 乖乖执行命令(POC已公开)
【漏洞预警】Keycloak不登录就能接管任意账户,双重验证也拦不住
【漏洞预警】 8月WebLogic公布了9个漏洞,有一个需要重点关注
【漏洞预警】近期MongoDB 公布了5个漏洞,最严重的一个可以不认证、远程就能拿下你电脑
【0DAY漏洞】 全球5G手机芯片厂商之一的紫光展锐SOC存在RCE漏洞,影响数十家手机厂商,还未发布补丁
【漏洞告警】安卓 14 到 16 全中招,通讯录 SQL 注入漏洞正在抄家(POC已公开)
【漏洞预警】不用输密码,对方已经接管你的Mac:官方补丁公布macOS存在未鉴权RCE漏洞
【0day漏洞预警】MariaDB 13 爆 9.8 分 RCE 链:最低 USAGE 权限就能远程执行命令
VMware 爆 5 个洞,两个 9.8 不用密码就能打穿 vCente
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论