AhaChat Messenger WordPress漏洞 | CVE-2025-14316 复现&研究

0x0 背景介绍

AhaChat Messenger Marketing WordPress插件1.1及之前版本未对某参数进行过滤和转义便直接输出到页面,导致存在反射型跨站脚本漏洞,该漏洞可被用于攻击高权限用户(如管理员)攻击者可通过构造恶意链接或AJAX请求,在受害者浏览器中执行任意JavaScript代码

0x1 环境搭建

1.1、Ubuntu24+Docker搭建配置

bash 复制代码
#!/bin/bash

# 检查并安装依赖
if ! command -v unzip &> /dev/null; then
    echo "[*] 安装依赖工具..."
    apt update && apt install -y unzip wget curl
fi

echo "[*] 阶段1/5:创建漏洞复现目录..."
mkdir -p ahachat-xss-vuln && cd ahachat-xss-vuln || { echo "[x] 创建目录失败"; exit 1; }
echo "[+] 工作目录: $(pwd)"

echo "[*] 阶段2/5:生成 docker-compose.yml..."
cat > docker-compose.yml <<EOF
services:
  db:
    image: mysql:8.0
    container_name: ahachat-db
    environment:
      MYSQL_ROOT_PASSWORD: vuln-root-pass
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: vuln-user-pass
    volumes:
      - db_data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password

  wordpress:
    image: wordpress:php7.4-apache
    container_name: ahachat-wp
    ports:
      - "8089:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: vuln-user-pass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_plugins:/var/www/html/wp-content/plugins
    depends_on:
      - db
volumes:
  db_data:
  wp_plugins:
EOF

echo "[*] 阶段3/5:启动 Docker 环境..."
docker compose up -d

echo "[*] 等待服务启动(约60秒)..."
for i in {1..12}; do
    echo -n "."
    sleep 5
done
echo -e "\n[+] 服务启动完成"

echo "[*] 等待 WordPress 安装页面就绪..."
until [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8089/wp-admin/install.php)" = "200" ]; do
    sleep 2
done
echo "[+] WordPress 已就绪"

echo "[*] 阶段4/5:下载并部署 AhaChat Messenger Marketing v1.1..."

PLUGIN_URL="https://downloads.wordpress.org/plugin/ahachat-messenger-marketing.1.1.zip"
PLUGIN_ZIP="ahachat-messenger-marketing.1.1.zip"

rm -rf ahachat-messenger-marketing "$PLUGIN_ZIP"

# 下载
if ! wget -q "$PLUGIN_URL" -O "$PLUGIN_ZIP"; then
    echo "[-] 下载失败,尝试备用镜像..."
    if ! wget -q "https://downloads.wordpress.org/plugin/ahachat-messenger-marketing.1.1.zip" -O "$PLUGIN_ZIP"; then
        echo "[!] 插件下载失败,请检查网络或插件是否仍可用"
        exit 1
    fi
fi

# 解压
unzip -q "$PLUGIN_ZIP"

# 验证插件目录存在
if [ ! -d "ahachat-messenger-marketing" ]; then
    echo "[-] 插件目录未生成,解压失败"
    ls -la  # 调试:看看当前目录有什么
    exit 1
fi

# 复制到容器
docker cp ahachat-messenger-marketing ahachat-wp:/var/www/html/wp-content/plugins/

# 修复权限
docker exec ahachat-wp chown -R www-data:www-data /var/www/html/wp-content/plugins/ahachat-messenger-marketing

# 清理本地
rm -rf "$PLUGIN_ZIP" ahachat-messenger-marketing

# 验证
if docker exec ahachat-wp test -f /var/www/html/wp-content/plugins/ahachat-messenger-marketing/ahachat.php; then
    echo "[+] AhaChat Messenger Marketing 插件部署成功!"
else
    echo "[-] 插件主文件 ahachat.php 未找到,部署失败"
    docker exec ahachat-wp ls -l /var/www/html/wp-content/plugins/ahachat-messenger-marketing/ || true
    exit 1
fi

echo "=============================================="
echo " CVE-2025-14316 漏洞环境部署完成!"
echo "  - 访问站点: http://localhost:8089"
echo "  - 首次访问时请完成 WordPress 安装"
echo "    * 站点标题: CVE-2025-14316-Demo"
echo "    * 用户名: admin"
echo "    * 密码: 自定义强密码(务必记住)"
echo "    * 邮箱: cve-2025-14316@local.test"
echo ""
echo "  - 安装后登录后台 → 插件 → 启用 'AhaChat Messenger Marketing'"
echo "  - 漏洞点: POST /wp-admin/admin-ajax.php?action=ahachat_parse_edit_list_product"
echo "  - 使用 PoC HTML 测试反射型 XSS"
echo "=============================================="

0x2 漏洞复现

2.1、手动复现步骤

  • 模拟点击钓鱼链接
bash 复制代码
https://github.com/Kai-One001/cve-/blob/main/AhaChat_CVE-2025-14316.html
  • 发包测试-需权限

2.2、复现流量特征 (PCAP)

  • 语句插入响应中

  • 同上一样可渲染

0x3 漏洞原理分析

3.1、入口文件分析

  • 插件主文件ahachat.php中定义了文件加载逻辑:
php 复制代码
public function includeFiles()
        public function includeFiles()
        {
            require_once AHACHAT_WP_DIR . 'includes/facebook-api/'.AHACHAT_PREFIX.'facebook_api.php';
            require_once AHACHAT_WP_DIR . 'includes/facebook-api/'.AHACHAT_PREFIX.'api.php';
            require_once AHACHAT_WP_DIR . 'includes/facebook-api/'.AHACHAT_PREFIX.'rule.php';
            require_once AHACHAT_WP_LIB_PATH . AHACHAT_PREFIX . 'posttype-add-to-cart-user.php';
            require_once AHACHAT_WP_LIB_PATH . AHACHAT_PREFIX . 'post-list-email.php';
            require_once AHACHAT_WP_LIB_PATH . AHACHAT_PREFIX . 'settings.php';
            require_once AHACHAT_WP_LIB_PATH . AHACHAT_PREFIX . 'functions.php';
            require_once AHACHAT_WP_LIB_PATH . AHACHAT_PREFIX . 'cartback_reminder.php';
            require_once AHACHAT_WP_LIB_PATH . AHACHAT_PREFIX . 'plugins.php';
            require_once AHACHAT_WP_LIB_PATH . AHACHAT_PREFIX . 'ajax_cart.php';
        }
define('AHACHAT_WP_LIB_PATH', AHACHAT_WP_DIR . 'includes' . '/');
  • 关键漏洞文件路径:/wp-content/plugins/ahachat/includes/ahachat_ajax_cart.php

3.2、AJAX 接口 XSS

php 复制代码
#无需登录即可调用
add_action('wp_ajax_nopriv_ahachat_parse_edit_list_product', array( $this, 'ahachat_parse_edit_list_product'));
#漏洞代码
        public function ahachat_parse_edit_list_product()
        {

            if (isset($_POST["list_product"])) {

                $show_these_pages = explode(',', $_POST["list_product"]);

                foreach ($show_these_pages as $key => $display_page) { ?>

                    <span data-post_id="<?php echo $display_page; ?>">[product] - <?php echo get_the_title($display_page); ?><span
                                class="ahachat_popup_dashboard_menu_remove"><img class="remove_list_product"
                                                                             style="position: absolute;"
                                                                             src="<?php echo AHACHAT_WP_PLUGIN_PATH . 'assets/images/'.AHACHAT_PREFIX.'remove.png'; ?>"></span></span>

                <?php }

                die();

            }

        }
  • 所无需登录即可调用
  • 输入可控: $_POST["list_product"] 用户完全可控
  • 处理过程:explode(',', ...) 仅按逗号分割,无类型校验
  • 输出转义:<?php echo $display_page; ?> 直接输出到HTML属性data-post_id
  • 无任何转义:未使用 esc_attr()、intval() 或其他过滤

3.3、构造请求

  • 请求统一入口:/wp-admin/admin-ajax.php
  • 请求方法和参数:-isset($_POST["list_product"])
  • 构造载荷:<span data-post_id="<?php echo $display_page; ?>">
  • POC构造目的:能插入到<span data-post_id="123"><script>alert(1)</script>">

3.4、其它发现

  • 在查询时发现includes/ahachat_functions.php文件也有相同的代码风格,不过没有进行下一步的分析了,感兴趣可以自行查看下
php 复制代码
        <input type="hidden" name="ahachat_click_order_" id="ahachat_click_order_" class=""
               value="<?php echo isset($_REQUEST['multi-product-add']) ? $_REQUEST['multi-product-add'] : ''; ?>">

        <input type="hidden" name="ahachat_reminder_" id="ahachat_reminder_" class=""
               value="<?php echo isset($_REQUEST['reminder']) ? $_REQUEST['reminder'] : ''; ?>">

        <input type="hidden" name="ahachat_user_checkout_" id="ahachat_user_checkout_" class=""
               value="<?php echo isset($_REQUEST['user']) ? $_REQUEST['user'] : ''; ?>">
               
function ahachat_custom_product_link() {
    if (empty( $ _REQUEST['multi-product-add'])) { return; }
     $ product_ids = explode(',',  $ _REQUEST['multi-product-add']); // 用户控制
    // ... 添加商品逻辑 ...
    // 若失败,不重定向,继续渲染页面
}

// 在 checkout 页面输出:
<input type="hidden" name="ahachat_click_order_" value="<?php echo isset( $ _REQUEST['multi-product-add']) ?  $ _REQUEST['multi-product-add'] : ''; ?>">
  • $_REQUEST['multi-product-add'] 被直接 echo 到 HTML 属性值中
  • 未使用 esc_attr() 转义
  • 当参数包含 "> 可闭合属性并注入标签

3.5、触发条件

  • 访问 包含 ahachat_add_filed_check_when_user_click_btn_fb() 函数的页面 (如 /checkout/
  • 页面必须渲染该 <input> 字段(WooCommerce checkout 默认满足)
  • 可能的需求:WooCommerce结账页渲染时(需购物车非空)

0x4 修复建议

修复方案

  1. 暂无最新版本: 确认最新版是否仍为1.1
  2. 临时防护措施:
    加强安全意识 :防范钓鱼链接传播
    启用 WAF/IPS 规则 :设置"自定义防火墙规则",阻止含 HTML 标签的GET/POST 请求
    启用内容安全策略 :在网站HTTP响应头中添加CSP,限制内联脚本执行

免责声明:本文仅用于安全研究目的,未经授权不得用于非法渗透测试活动。

相关推荐
杨_晨1 小时前
大模型微调训练FAQ - Loss与准确率关系
人工智能·经验分享·笔记·深度学习·机器学习·ai
她说..2 小时前
验签实现方案整理(签名验证+防篡改+防重放)
java·经验分享·spring boot·java-ee·bladex
源代码•宸2 小时前
Leetcode—144. 二叉树的前序遍历【简单】
经验分享·算法·leetcode·面试·职场和发展·golang·dfs
熊猫钓鱼>_>2 小时前
【开源鸿蒙跨平台开发先锋训练营】Day 8:鸿蒙 Next + React Native 实战:打造丝滑的四Tab底部导航体验
react native·开源·list·tab·harmonyos·鸿蒙·next
三水不滴2 小时前
从原理、场景、解决方案深度分析Redis分布式Session
数据库·经验分享·redis·笔记·分布式·后端·性能优化
AllData公司负责人3 小时前
【亲测好用】云原生数据平台能力演示
数据库·云原生·开源
熊猫钓鱼>_>5 小时前
【开源鸿蒙跨平台开发先锋训练营】Day 7:开源鸿蒙开发第一阶段复盘与技术深度总结
react native·华为·开源·harmonyos·arkts·openharmony·rnoh
时光慢煮12 小时前
【Flutter × OpenHarmony】跨端开发实现全局Toast提示卡片
flutter·华为·开源·openharmony
开源能源管理系统12 小时前
MyEMS开源能源管理系统助力贵金属冶炼行业生产
开源·能源·能源管理系统·零碳工厂·贵金属加工