IPBUF安全漏洞报告
English
CVE-2026-21871 CVSS 6.1 中危

CVE-2026-21871 NiceGUI ui.navigate.history XSS跨站脚本漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2026-21871
漏洞类型
XSS跨站脚本攻击
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
NiceGUI

相关标签

暂无标签

漏洞概述

CVE-2026-21871是NiceGUI框架中的一个存储型跨站脚本(XSS)安全漏洞。NiceGUI是一个基于Python的现代UI框架,用于快速构建Web用户界面。该漏洞影响NiceGUI从2.13.0到3.4.1的所有版本。漏洞的根本原因在于ui.navigate.history.push()和ui.navigate.history.replace()这两个历史记录导航方法的实现中,当开发者将攻击者可控的字符串传递给这些方法时,如果URL参数被嵌入到生成的JavaScript代码中而没有进行适当的字符转义处理,恶意构造的载荷可以突破预期的字符串上下文,在受害者的浏览器中执行任意JavaScript代码。攻击者可以利用此漏洞窃取用户会话Cookie、劫持用户账户、进行钓鱼攻击或在用户浏览器中执行恶意操作。由于该漏洞需要用户交互才能触发(UI:R),攻击者通常需要诱导用户访问包含恶意载荷的页面或点击特定链接。值得注意的是,如果应用程序不将任何不可信的输入传递给ui.navigate.history.push/replace方法,则不会受到此漏洞影响。该漏洞已于2026年1月8日披露,并在版本3.5.0中得到修复。

技术细节

该漏洞属于存储型XSS(Stored XSS)或DOM-based XSS类型,具体取决于攻击向量的传递方式。漏洞产生的核心原因是NiceGUI在实现浏览器历史记录API包装器(ui.navigate.history.push和ui.navigate.history.replace)时,直接将传入的URL参数拼接到生成的JavaScript代码中,而没有对特殊字符进行充分的转义处理。攻击者可以通过构造特殊的URL字符串,利用JavaScript字符串字面量的语法特性,突破字符串边界并注入任意JavaScript代码。例如,当传入的URL包含单引号或双引号时,如果这些字符未被正确转义,攻击者可以提前关闭字符串字面量,然后添加任意JavaScript语句。由于这些方法通常在页面导航或状态更新时被调用,恶意代码会在用户浏览器中执行,影响范围包括但不限于:窃取用户认证令牌、读取页面内容、修改DOM结构或重定向用户到钓鱼网站。攻击的触发条件是用户访问包含恶意载荷的页面或与触发历史记录更新的UI元素进行交互。由于CVSS评分考虑了网络攻击向量(AV:N)和低攻击复杂度(AC:L),攻击者可以在无需特殊权限的情况下远程利用此漏洞,但需要诱导用户进行特定操作(UI:R)。

攻击链分析

STEP 1
步骤1
攻击者识别目标NiceGUI应用程序中使用了ui.navigate.history.push()或ui.navigate.history.replace()的代码路径
STEP 2
步骤2
攻击者构造恶意载荷,包含绕过字符串上下文的特殊字符(如单引号、反斜杠、分号等),例如:'); alert(document.cookie); //
STEP 3
步骤3
攻击者通过URL参数、API请求或其他用户可控的输入渠道将恶意载荷注入到应用程序中
STEP 4
步骤4
应用程序将攻击者提供的字符串直接传递给ui.navigate.history.push/replace方法,该方法将参数嵌入到生成的JavaScript代码中而未进行适当转义
STEP 5
步骤5
生成的JavaScript代码类似:history.pushState({},'','https://example.com/'); alert(document.cookie); //'),恶意代码被注入
STEP 6
步骤6
受害者在浏览器中访问触发该历史记录更新的页面或点击相关UI元素
STEP 7
步骤7
恶意JavaScript代码在受害者浏览器中执行,攻击者可窃取Cookie、会话令牌或执行其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-21871 PoC - NiceGUI XSS in ui.navigate.history.push/replace # This PoC demonstrates how attacker-controlled input can lead to XSS from nicegui import app, ui # Vulnerable code pattern (affected versions 2.13.0 - 3.4.1) # DO NOT USE - This is for educational purposes only @app.get('/vulnerable') def vulnerable_page(): # Simulating attacker-controlled input (e.g., from URL parameter) attacker_url = "https://example.com/'); alert(document.cookie); //" # This will embed the payload into JavaScript without proper escaping ui.navigate.history.push(attacker_url) ui.label('Page content') # Attack vector explanation: # 1. Attacker crafts a malicious URL with XSS payload # 2. Payload: '); alert(document.cookie); // # 3. When pushed to history, it becomes: # history.pushState({}, '', "https://example.com/'); alert(document.cookie); //"); # 4. This breaks out of the string and executes arbitrary JS # Example of triggering the vulnerability: # ui.button('Navigate', on_click=lambda: ui.navigate.history.push( # "https://evil.com/'); malicious_code(); //" # )) # Safe alternative (patched in version 3.5.0): # from nicegui import ui # ui.navigate.history.push(safe_url) # Proper escaping is applied

影响范围

NiceGUI >= 2.13.0 且 < 3.5.0
NiceGUI 2.13.0
NiceGUI 2.14.0
NiceGUI 2.15.0
NiceGUI 3.0.0
NiceGUI 3.1.0
NiceGUI 3.2.0
NiceGUI 3.3.0
NiceGUI 3.4.0
NiceGUI 3.4.1

防御指南

临时缓解措施
如果无法立即升级到修复版本,可采取以下临时缓解措施:首先,确保不将任何来自用户输入或第三方来源的未验证数据传递给ui.navigate.history.push()或ui.navigate.history.replace()方法。其次,实施严格的输入验证,仅允许白名单中的安全字符。如果必须使用动态URL,应在传递给历史记录API之前对所有特殊字符进行JavaScript字符串转义(使用反斜杠转义单引号、双引号等)。此外,配置Web应用防火墙(WAF)规则来检测和阻止包含XSS特征的请求。最后,考虑实施严格的Content Security Policy(CSP)策略以限制脚本执行来源。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表