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 - 临时防护措施:
加强安全意识 :防范钓鱼链接传播
启用 WAF/IPS 规则 :设置"自定义防火墙规则",阻止含 HTML 标签的GET/POST请求
启用内容安全策略 :在网站HTTP响应头中添加CSP,限制内联脚本执行
免责声明:本文仅用于安全研究目的,未经授权不得用于非法渗透测试活动。