常见的编码
常见的编码
1. ASCII
- 最常见的编码,没啥可说的,注意他有十进制和十六进制两种。
2. HTML 编码
字符实体编码,即在 HTML 中对字符实体进行编码(转义),不让它起作用。
第一种编码形式是实体名称,以
&
开头,例如 
表示空格。第二种编码形式是实体编号,以
&#
开头,后接 ASCII(ISO-8859-1)、Windows-1252 和 ISO-8859-1 的特殊符号等,常见格式如下:&#十进制
&#x十六进制
可以发现,就单单的空格,也分好几种;不换行空格、半角空格、全角空格等。这些空格的实体编号各不相同。详见:
3. URL 编码
- 对特殊符号进行编码,格式是
%16进制 ASCII
。例如空格是%20
。
4. JS 编码(用于 XSS,把 JS 的语句进行编码,也就是 <script>
标签中的内容编码)
- 第一种,十六进制编码:
\x 16 进制 ASCII
,例如<
可以表示成\x3c
。 - 第二种,八进制编码:
\x 8 进制 ASCII
。 - 第三种,Unicode 编码:
\u 后接 Unicode 编码
。 - PS:Unicode 编码中开头的部分和 ASCII 重合,但是 Unicode 编码是四位十六进制数,而 ASCII 是两位。
5. Hex 编码(数据库中)
- 本质就是十六进制编码。
- 格式:
0x 16 进制编码
。 - hex 结果和 base16 的结果相同。
和编码有关的渗透
1. URL 中 IDNA 编码导致的绕过
- 最初的来源是 Blackhat 2019 的会议上:
https://i.blackhat.com/USA-19/Thursday/us-19-Birch-HostSplit-Exploitable-Antipatterns-In-Unicode-Normalization.pdf - IDN:
国际化域名(Internationalized Domain Name,IDN)又名特殊字符域名,是指部分或完全使用特殊文字或字母组成的互联网域名,包括中文、法语、阿拉伯语、希伯来语或拉丁字母等非英文字母,这些文字经过多字节万国码编码而成。在域名系统中,国际化域名使用 punycode 转写并以 ASCII 字符串存储。 - 使用 IDNA 编码后,域名可以出现中文等字符。
- 但是有些 Unicode 字符经过 IDNA 编码再经过 UTF-8 解码后,就会变成常见的字符,例如:℆ 经过 IDNA 编码再 UTF-8 解码后变成 c/u。又例如: 这些字符在经过处理后都会变成字母 C。
- 例题:[SUCTF 2019]Pythonginx 1
2. PHP 的 JSON 编码
PHP 的
json_decode()
方法会自动将 Unicode 编码转换成对应字符。例如:1
2
3$a = '{"poc":"\u0070\u0068\u0070"}';
$b = json_decode($a, true);
var_dump($b);结果如下:
例题:[HarekazeCTF2019]encode_and_encode 1
常见的编码
https://endlessshw.top/Network_Security/Misc/Encode/Encode/