IPBUF安全漏洞报告
English
CVE-2025-67724 CVSS 5.4 中危

CVE-2025-67724 Tornado HTTP Reason Phrase 头注入与XSS漏洞

披露日期: 2025-12-12

漏洞信息

漏洞编号
CVE-2025-67724
漏洞类型
HTTP头注入/XSS
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Tornado

相关标签

CVE-2025-67724TornadoHTTP头注入XSS跨站脚本Web框架Python中危漏洞头注入安全漏洞

漏洞概述

CVE-2025-67724是Tornado Web框架中的一个中危安全漏洞,影响版本6.5.2及以下版本。该漏洞源于Tornado在处理HTTP响应状态码的原因短语(Reason Phrase)时未进行适当的转义处理。当应用程序通过RequestHandler.set_status方法或tornado.web.HTTPError异常设置自定义状态码原因短语时,用户提供的未过滤数据会被直接插入到HTTP响应头或HTML错误页面中。攻击者可利用此漏洞在HTTP响应头中注入恶意字符(如换行符),实现HTTP响应拆分攻击,或在HTML页面中注入JavaScript代码实现跨站脚本攻击(XSS)。由于该漏洞利用需要用户交互(UI:R)且攻击复杂度较低(AC:L),攻击者可通过诱使受害者访问特制链接或提交特定请求来触发漏洞。在Web应用场景中,任何允许用户控制HTTP状态码或错误信息的Tornado应用都可能受到此漏洞影响。

技术细节

Tornado是一个流行的Python异步Web框架,广泛用于构建高性能Web应用和API服务。该漏洞的核心问题在于Tornado的RequestHandler.set_status()方法和HTTPError类在处理reason参数时缺少输入验证和输出编码。具体来说,当开发者调用set_status(404, reason=user_input)时,如果user_input包含特殊字符如换行符(\r\n),攻击者可以注入额外的HTTP头或构造完整的HTTP响应,从而实现HTTP响应拆分攻击。此外,当Tornado生成默认错误页面时,reason字段会被直接嵌入到HTML响应中而未进行HTML转义,攻击者可注入<script>标签等XSS payload。攻击者需要构造包含恶意reason短语的值,并通过社会工程学手段诱使目标用户访问恶意链接或提交特定请求。由于该漏洞影响HTTP响应的完整性(I:L)和机密性(C:L),可能导致会话劫持、敏感信息泄露或进一步的攻击链构建。

攻击链分析

STEP 1
信息收集
攻击者识别目标应用使用Tornado框架,并发现存在接受用户输入的HTTP端点
STEP 2
漏洞探测
攻击者构造包含特殊字符(如<、>、\r、\n)的reason参数值,测试是否存在输入验证
STEP 3
恶意载荷构造
根据攻击目标,构造XSS payload(<script>标签)或HTTP头注入载荷(换行符+恶意头)
STEP 4
诱骗用户访问
通过钓鱼邮件、恶意链接或社交工程手段,诱使目标用户访问构造的恶意URL
STEP 5
漏洞利用
用户浏览器解析包含恶意reason的HTTP响应,触发XSS执行或完成HTTP响应拆分攻击
STEP 6
攻击效果达成
攻击者实现会话劫持、敏感信息窃取或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import tornado.ioloop import tornado.web import tornado.httpclient class VulnerableHandler(tornado.web.RequestHandler): def get(self): # Vulnerable: user input used directly in reason phrase without escaping reason = self.get_argument('reason', 'Not Found') # XSS payload: <script>alert('XSS')</script> # Header injection payload: test\r\nSet-Cookie: evil=true self.set_status(404, reason=reason) self.write(f'<html><body><h1>404 {reason}</h1></body></html>') class VulnerableApp(tornado.web.Application): def __init__(self): handlers = [ (r'/vulnerable', VulnerableHandler), ] super().__init__(handlers) if __name__ == '__main__': app = VulnerableApp() app.listen(8888) tornado.ioloop.IOLoop.current().start() # Attack vectors: # 1. XSS: GET /vulnerable?reason=<script>alert(document.cookie)</script> # 2. Header Injection: GET /vulnerable?reason=test%0D%0ASet-Cookie:%20malicious=1 # 3. HTTP Response Splitting: Craft malicious reason to inject additional HTTP responses

影响范围

Tornado < 6.5.3
Tornado 6.5.2
Tornado 6.5.1
Tornado 6.5.0
Tornado 6.4.x
Tornado 6.3.x
Tornado 6.2.x及更低版本

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 对所有传入set_status()和HTTPError的reason参数进行严格过滤,只允许字母、数字和空格;2) 自定义错误处理器,对所有动态内容进行HTML实体转义;3) 避免在错误响应中直接展示用户输入;4) 配置反向代理添加额外的安全层;5) 限制用户可控的HTTP状态码范围。

参考链接

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