看我如何通过JWT绕过+文件上传漏洞拿下$23000赏金

导语:本文分享了一起通过JWT认证机制缺陷配合文件上传功能,最终实现任意文件覆写的完整攻击链。该漏洞为研究者带来了总计23000美元的赏金,其中任意文件覆写单项获得20000美元。


一、背景

目标站点使用 JSON Web Token(JWT) 作为认证机制。用户登录主站后会获得一个普通用户的JWT令牌。

通过对目标进行详细侦察(包括JavaScript文件分析、Burp Suite抓包、 Wayback Machine历史端点收集以及子域名枚举),我发现了一个管理后台子域名 admin.test.com

阅读后台的 app.js 文件(约20万行代码)后,确认其使用JWT认证,并发现了一个名为 test-dashboard 的realm(认证域)。

二、认证绕过(JWT Realm篡改)

2.1 原理

jwt.io 解码普通用户令牌后,发现其中包含 realm=test-user 字段。由于服务端仅验证JWT签名是否有效,未对realm进行严格校验,我尝试将realm值修改为 test-dashboard

2.2 利用步骤

  1. 登录主站 test.com 获取普通用户JWT
  2. 拦截登录API请求 /api/v1/login,修改请求体中的realm值

构造请求:

POST /api/v1/login HTTP/1.1
Host: accounts.test.com
Content-Type: application/json

{"email":"youremail@gmail.com","password":"<password>","realm":"test-dashboard"}
JWT realm篡改对比

解码修改后的JWT,可见realm已被成功篡改为 test-dashboard

JWT解码结果

使用篡改后的JWT令牌,成功登录管理后台。但厂商认为管理后台仅为前端React应用,实际API有独立认证,因此将漏洞等级从严重降至中危:

厂商反馈

三、授权头绕过(Bearer关键字删除)

3.1 Fuzzing发现

为提升漏洞严重程度,我继续深入分析。由于已能控制JWT中的realm,需找到能操作API的方式。

对管理后台 /upload 接口进行 fuzzing 测试。默认情况下ffuf使用GET方法,切换为POST后发现了该上传接口。

3.2 关键发现

在Fuzzing Authorization: Bearer 时,删除 Bearer 关键字后收到200响应。

构造请求(删除Bearer):

POST /upload HTTP/1.1
Host: admin.test.com
Authorization: <JWT>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypxxxxxx

------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="destination"gallery/
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="file"; filename="poc.txt"
Content-Type: Text/plainh4x0r-dz POC 
------WebKitFormBoundarypxxxxxx--

成功获得上传响应:

文件上传成功

四、文件路径发现

上传成功后面临新问题:如何找到文件存储路径?

通过分析Burp Suite历史记录和响应头,发现返回的href指向:https://xxxxxxxx.cloudfront.net/gallery/xxxxxxxxx

其中 gallery 与上传请求中 destination 参数值相同。访问 https://XXXXXXXXX.cloudfront.net/gallery/poc.txt 确认文件可被访问。

由于上传功能托管于Amazon CloudFront CDN,无法直接上传WebShell,单独报告此漏洞严重程度较低。

五、任意文件覆写(Arbitrary File Overwrite)

5.1 漏洞原理

Amazon S3在默认配置下存在任意文件覆写风险。当S3桶允许上传已有文件名时,攻击者可覆盖关键文件。

分析发现 xxxxxxxx.cloudfront.net 用于托管主站的JavaScript、HTML、Windows软件及PDF文件。这意味着我可以修改这些文件内容。

5.2 攻击利用

主站通过CloudFront CDN加载资源文件。攻击者可利用任意文件覆写:

  • 修改JavaScript文件,插入恶意代码实现存储型XSS
  • 篡改可执行文件(.exe)或PDF,植入木马控制用户主机
CloudFront托管文件

初始POC文件内容:

初始POC

通过以下请求覆写 poc.txt 内容为 “Arbitrary File Overwrite”:

POST /upload HTTP/1.1
Host: admin.test.com
Authorization: <JWT>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypxxxxxx

------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="destination"gallery/
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="file"; filename="poc.txt"
Content-Type: Text/plainArbitrary File Overwrite 
------WebKitFormBoundarypxxxxxx--
文件覆写成功

命令行验证确认文件内容已被成功覆写:

命令行验证

六、漏洞总结与赏金

漏洞类型赏金金额
管理后台UI访问(JWT realm篡改)$3,000
任意文件覆写$20,000
总计$23,000
最终赏金

七、关键发现

  • JWT realm字段可被篡改:部分应用仅验证JWT签名,不校验claim值的合法性
  • Authorization头Bearer关键字可省略:部分服务端对认证头格式校验不严格
  • S3/CloudFront默认配置存在文件覆写风险:即使无法上传WebShell,通过覆写现有资源文件同样可造成严重危害
  • Fuzzing是挖掘此类漏洞的关键手段:本文中删除”Bearer”关键字的发现即源于系统化fuzzing测试

版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容