夜雨聆风学习资料网

ARTICLE · 1069273

WordPress插件Forminator未认证短代码执行漏洞(poc已公开)CVE-2026-92229

WordPress插件Forminator未认证短代码执行漏洞(poc已公开)CVE-2026-92229

一、漏洞描述

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就到手了
Tenda光猫爆出严重漏洞,目前无补丁(POC已公布
13 行补丁,堵住Linux能拿 root 的内核洞(EXP已公开)
48 字节,换走一台 Windows 的 SYSTEM(CVE-2026-62735漏洞POC已公开)
【漏洞预警】linux删个网桥就能提权root?目前没有补丁(POC已公开)
【漏洞预警】Linux三年前补上的洞,又一次被挖开了
【情报】支付宝8.2亿数据泄露?给同事说一声,别自己吓自己
【漏洞预警】自己注册个号,就能搬空别人的 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已公开)
【漏洞预警】紧急排查,SMB服务再曝新漏洞,利用脚本已公开
【漏洞预警】不用输密码,对方已经接管你的Mac:官方补丁公布macOS存在未鉴权RCE漏洞
【0day漏洞预警】MariaDB 13 爆 9.8 分 RCE 链:最低 USAGE 权限就能远程执行命令
VMware 爆 5 个洞,两个 9.8 不用密码就能打穿 vCente

相关学习资料