From fced3cb71e27c4813bec3d9e9da508a6fce37ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=BE=E5=B3=B6=E9=A3=8E=E8=B5=B7=E6=99=82?= Date: Thu, 25 Sep 2025 03:20:37 +0800 Subject: [PATCH] Add files via upload --- Chapter2/2-1.md | 60 +++++++++++++++++ Chapter2/2-2.md | 52 +++++++++++++++ Chapter2/2-3.md | 78 ++++++++++++++++++++++ Chapter2/2-4.md | 81 +++++++++++++++++++++++ Chapter2/2-5.md | 10 +++ Chapter2/2-6.md | 159 +++++++++++++++++++++++++++++++++++++++++++++ Chapter2/README.md | 19 ++++++ 7 files changed, 459 insertions(+) create mode 100644 Chapter2/2-1.md create mode 100644 Chapter2/2-2.md create mode 100644 Chapter2/2-3.md create mode 100644 Chapter2/2-4.md create mode 100644 Chapter2/2-5.md create mode 100644 Chapter2/2-6.md diff --git a/Chapter2/2-1.md b/Chapter2/2-1.md new file mode 100644 index 0000000..0810986 --- /dev/null +++ b/Chapter2/2-1.md @@ -0,0 +1,60 @@ +### 输出到 href 属性的 XSS 如何防御 + +**1. 严格的白名单验证** + +这是最安全、最推荐的防御方法。**不要**试图去黑名单过滤,因为攻击者总能找到绕过的方法。相反,你应该只允许那些已知安全的协议和域名 + +- **只允许安全的协议**:只接受 `http` 和 `https` 协议。所有其他协议,特别是 `javascript:`、`data:`、`vbscript:` 等,都应该被拒绝 +- **示例**: + - **安全**:`https://www.example.com` + - **不安全**:`javascript:alert(1)` + +**实现方式**: 在后端代码中,你可以使用正则表达式或内置的 URL 解析函数来检查协议。例如,在 PHP 中可以这样做: + +```php +function is_safe_url($url) { + $parsed_url = parse_url($url); + if (!isset($parsed_url['scheme'])) { + // 如果没有协议头,可能是相对路径,视为安全 + return true; + } + // 只允许 http 或 https 协议 + return in_array($parsed_url['scheme'], ['http', 'https']); +} + +$user_input_url = $_GET['url']; +if (is_safe_url($user_input_url)) { + // URL 安全,进行输出 + echo 'Click Here'; +} else { + // URL 不安全,拒绝或使用默认值 + echo 'Click Here'; +} +``` + +**2. 对所有 URL 进行 HTML 实体编码** + +这是防御 XSS 的基本操作,但它**不足以**防御 `href` XSS。你仍然需要执行它,因为它能防止其他类型的 XSS 攻击htmlspecialchars()` 或 `htmlentities()` 可以将 `<`、`>`、`"` 等特殊字符转换为实体,防止它们被解释为 HTML 标签 + +- **正确做法**:将 URL 进行白名单验证后,再进行 HTML 实体编码 + + - **示例**: + + ```php + $safe_url = "https://example.com/page?param="; + echo 'Click Here'; + ``` + + - **结果**:浏览器渲染为 `Click Here`。即使 URL 中包含恶意代码,它也不会被执行。但如果 URL 是 `javascript:alert(1)`,单独使用 `htmlspecialchars()` 是无效的 + +**3. CSP** + +CSP 是一个强大的安全策略,可以从根本上限制页面可以加载和执行的资源。你可以设置一个 CSP 规则,明确禁止 `javascript:` 协议的 URI + +- **在 HTTP 响应头中添加**: `Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none';` + + 这条规则**不直接**阻止 `href` 中的 `javascript:`,但它可以与**不安全的内联脚本**(`unsafe-inline`)策略结合使用。一个更严格的 CSP 策略可以禁止内联脚本,从而让 `javascript:` 协议失效 + +- **一个更有效的 CSP 规则**: `Content-Security-Policy: default-src 'self'; script-src 'self';` + + 这条规则禁止了所有内联脚本,包括 `javascript:` 协议,从而提供了额外的保护层。不过,这可能会对你的网站功能造成影响,需要在部署前进行全面测试 \ No newline at end of file diff --git a/Chapter2/2-2.md b/Chapter2/2-2.md new file mode 100644 index 0000000..4fafa78 --- /dev/null +++ b/Chapter2/2-2.md @@ -0,0 +1,52 @@ +### XSS 绕过方式 + +**1. 大小写混淆绕过** + +许多过滤规则是针对特定大小写模式的,比如 `` 可以尝试写成 `alert(1)` + +**3. 使用编码绕过** + +许多过滤器会试图拦截特定字符,比如尖括号 `< >` 和引号 `"` `'`。你可以使用 HTML 实体编码、URL 编码或者其他编码方式来绕过 + +- **URL 编码:** + - `(` 编码为 `%28` + - `)` 编码为 `%29` + - ` ` 编码为 `%20` + +**4. 标签和属性嵌套绕过** + +有些过滤器可能只过滤顶层的脚本标签,但忽略嵌套的标签。你可以尝试在标签内部使用其他标签或者属性来注入,例如: + +- `Click Me` +- `` +- `` + +**5. 事件处理器绕过** + +除了最常见的 `onload` 和 `onerror` 事件,还有很多其他事件可以用来触发脚本,例如: + +- `onmouseover` +- `onmouseout` +- `onclick` +- `onfocus` +- `onblur` +- `onchange` + +例如:`` 或 `