目录
说明:
1. Base64
Base64编码的字符集通常包括:
Base64的工作原理:
Base64编码在安全渗透中的应用场景
常见的Base64编码绕过场景
如何防范Base64绕过攻击
2. URL编码(Percent Encoding)
URL编码与安全渗透的关系
示例:
Python实现URL编码
输出结果:
如何防范URL编码绕过攻击
3. HTML实体编码
核心目标:
示例:基本字符转义
示例:用户输入转义
何时使用HTML实体编码?
工具与函数
绕过编码的渗透技巧(及防御)
通过未过滤的上下文绕过
4. Hex编码(十六进制编码)
Python实现Hex编码
Hex编码与数学运算
数字转字符串
自定义数字转字符串函数
5. UTF-8/Unicode编码
UTF-8/Unicode实体编码与安全渗透的关系
实际案例
6. JSON编码
JSON编码与安全渗透的关系
以下是几个与JSON编码相关的安全渗透场景:
JSON注入攻击的案例
7. 二进制编码
二进制编码的案例
二进制编码与安全渗透的关系
二进制编码在安全领域中的案例
二进制编码、ASCII、Unicode、Hex、UTF-8、JSON、HTML实体编码和Base64编码 的详细比较表格
编码特点总结:
总结:
说明:
- 编码(encode)的目的不是为了让别人看到后解不出来,而是代表信息的另外一种表达方式。
- 将原始信息转化为编码信息进行传输,可以解决一些特殊字符、不可见字符的传输问题。接收者将编码信息再转化成原始信息,转化的过程称之为解码(decode)。
- 在CTF中,编码的用处不仅仅是单独出题,很多情况下其也会作为题目的一部分,掌握各类编码的转化技巧是学习密码学的基础。
1. Base64
- Base64编码是一种用于将二进制数据转换为文本数据的编码方式。
- 它是将每三个字节的二进制数据(即24位)分成四组,每组6位(即每个字符)。
- 然后,这些6位的数值会映射到64个字符集(包括字母、数字和一些特殊字符)。
- 最终,Base64编码生成的是由可打印字符组成的字符串,常用于在需要将二进制数据(如图像、文件、密钥等)传输时,避免使用不兼容的字符集。
- 特性:将二进制数据转换为可打印ASCII字符(A-Z, a-z, 0-9, +, /),填充字符为
=
。编码后数据膨胀约33%。- 应用场景:
- 电子邮件附件传输。
- 隐藏敏感数据(如凭证、密钥)。
- 在HTTP协议中嵌入二进制数据(如图片)。
- 安全领域:
- 数据隐蔽(非加密,需配合加密使用)。
- 防止传输过程中的数据损坏。
Base64编码的字符集通常包括:
- 大写字母(A-Z)
- 小写字母(a-z)
- 数字(0-9)
- 加号(+)和斜杠(/)
- 等号(=)用于填充,使编码后的字符数量为4的倍数。
Base64的工作原理:
- 将输入的字节数据分成3字节一组,若不足3字节,则用0补齐。
- 每3字节(24位)数据被分成4个6位的组(即6位的二进制数值)。
- 每个6位数值映射到Base64字符集中的一个字符。
- 如果输入数据不足3字节,使用
=
填充,使得编码结果的字符长度为4的倍数。
例如,字符串 "Man" 的Base64编码过程:
- ASCII码:M (77), a (97), n (110)
- 二进制表示:
01001101 01100001 01101110
- 分成4个6位组:
010011 010110 000101 101110
- 对应Base64字符:
TWFu
所以 "Man" 的Base64编码是 TWFu。
Base64编码在安全渗透中的应用场景
Base64编码常用于在网络上传输非文本数据(如图像、文件等)。它也被用于绕过某些安全控制措施,尤其是在Web应用的输入验证和过滤中。由于Base64编码后的数据仅包含ASCII字符,这使得它能够绕过一些只对特定字符(如<
、>
、&
等)进行过滤的机制。
常见的Base64编码绕过场景
-
跨站脚本攻击(XSS)绕过:
- 背景:许多Web应用会对用户输入进行HTML字符过滤,以防止跨站脚本(XSS)攻击。
- 然而,某些应用可能仅对常见的HTML标签字符进行过滤,而忽视了Base64编码后的数据。
- 攻击方式:攻击者可以将恶意JavaScript脚本通过Base64编码的方式绕过过滤。例如,攻击者将一个XSS脚本
alert('XSS')
转换为Base64编码,得到:
YWxlcnQoJ1hTUyc1Jyk=
然后将其嵌入到网页或请求参数中。某些应用解码后会执行该JavaScript代码,导致XSS攻击。
-
SQL注入(SQL Injection)绕过:
- 背景:SQL注入攻击通常依赖于插入恶意SQL命令,通常包括特殊字符(如
'
、--
等),这些字符可能会被Web应用过滤掉。 - 攻击者可以通过Base64编码来绕过过滤。
- 攻击方式:攻击者将SQL注入语句(如
' OR 1=1 --
)进行Base64编码,得到:
- 背景:SQL注入攻击通常依赖于插入恶意SQL命令,通常包括特殊字符(如
J29yIDE9MSAtLQ==
然后将编码后的数据传递给应用程序。如果应用没有对Base64编码进行解码和检查,攻击者可以成功执行SQL注入攻击。
-
命令注入(Command Injection)绕过:
- 背景:命令注入攻击旨在通过输入恶意命令控制系统。许多应用会过滤掉特殊字符,如分号
;
或管道符|
。 - 攻击者可以通过Base64编码将这些字符传递给系统。
- 攻击方式:攻击者通过将命令注入payload(例如
; ls -la
)编码为Base64格式:
- 背景:命令注入攻击旨在通过输入恶意命令控制系统。许多应用会过滤掉特殊字符,如分号
OiBscyAtbGE=
然后将其传递给Web应用,若应用没有对Base64解码后的内容进行适当过滤或验证,攻击者能够执行命令。
-
路径穿越(Directory Traversal)攻击绕过:
- 背景:路径穿越攻击尝试通过操控文件路径,访问系统的敏感文件。
- 攻击者可以使用Base64编码绕过路径过滤限制。
- 攻击方式:攻击者可以将路径穿越字符(如
../
)进行Base64编码,得到:
Li4v
然后将编码后的路径传递给Web应用,如果应用未能对解码后的路径进行适当检查,攻击者能够访问系统敏感文件。
如何防范Base64绕过攻击
-
严格输入验证:对所有用户输入进行严格的过滤和验证。不要仅依赖于对字符的过滤,而是应当使用安全框架进行输入验证和清理。
-
适当的输出编码:对于输入的内容,在输出到Web页面时使用HTML实体编码,避免直接将用户输入作为HTML内容渲染。
-
Base64解码和检查:在接收任何编码数据时(如URL参数、HTTP请求体等),应该先解码Base64数据,然后检查是否存在潜在的恶意内容。解码后仍然需要对内容进行适当的过滤和转义。
-
Web应用防火墙(WAF):使用Web应用防火墙可以帮助识别并防止Base64编码的绕过攻击,特别是针对SQL注入和XSS攻击。
-
最小权限原则:确保Web应用和系统中只有最小必要的权限,限制攻击者通过命令注入或路径穿越等攻击行为访问敏感资源。
通过理解和防范Base64编码绕过攻击,可以增强Web应用和系统的安全性,防止安全渗透攻击。
2. URL编码(Percent Encoding)
- URL编码用于浏览器和网站之间的数据交换,主要解决特殊字符在传输过程中可能引发的问题。
- 其规则是将特殊字符转换为
%
后跟两位十六进制值。
- 特性:用
%
后跟两位十六进制值替换特殊字符(如空格转为%20
)。- 应用场景:
- URL参数传递。
- 表单数据提交(
application/x-www-form-urlencoded
)。- 安全领域:
- 防止URL注入攻击(如路径遍历、SQL注入)。
- 避免解析歧义。
URL编码与安全渗透的关系
URL编码简介:URL编码(又叫百分号编码)是一种将非ASCII字符或特殊字符(如空格、斜杠等)转换为可在URL中安全传输的格式的机制。
例如,空格字符会被编码为
%20
,斜杠/
会被编码为%2F
,等号=
会被编码为%3D
。URL编码的作用:URL编码的主要目的是确保URL中包含的字符在网络传输过程中不会导致歧义或错误,因为URL中某些字符(如
?
,&
,=
,#
等)有特殊意义,可能会影响URL的解析。
URL编码能够确保这些字符作为数据传输而不是控制字符。
URL编码与安全渗透的关系:在安全渗透测试中,攻击者常常利用URL编码来绕过Web应用的输入过滤和验证。
URL编码常常用于尝试避开特定字符的过滤机制,比如通过编码“危险字符”来绕过跨站脚本(XSS)或SQL注入的过滤规则。
由于Web应用在解析URL时通常会自动解码这些编码字符串,攻击者能够利用这一特性传递恶意payload,进行各种攻击。
示例:
- flag{url_encode_1234_!@#$}
- flag%7Burl_encode_1234_%21%40%23%24%7D
- 在url编码和解码的时候,只需要关注“%”的内容,每当遇到“%”的时候,连带“%”的三个字符对应着明文的一个字符。
- Python中可以使用urllib中的两个函数来进行urlencode:import urllib
Python实现URL编码
import urllib
print(urllib.quote("flag{url_encode_1234_!@#$}"))
d = {'name': 'bibi@flappypig.club', 'flag': 'flag{url_encode_1234_!@#$}'}
print(urllib.urlencode(d))
输出结果:
flag%7Burl_encode_1234_%21%40%23%24%7D
flag=flag%7Burl_encode_1234_%21%40%23%24%7D&name=bibi%40flappypig.club
- 第一个quote函数可以直接对字符串进行url编码,可以使用unquote函数进行解码;
- urlencode 函数能对字典模式的键值对进行url编码。
如何防范URL编码绕过攻击
-
严格输入验证:无论是否进行URL编码,所有用户输入都应进行严格的输入验证。避免接受未经处理的HTML、JavaScript代码、SQL命令等,并且对于特殊字符进行适当的过滤和转义。
-
输出编码:确保输出到浏览器或服务器的内容经过适当的编码。比如HTML输出时,应对特殊字符进行HTML实体编码,防止恶意脚本执行。
-
使用安全框架和库:现代的Web框架(如Django、ASP.NET等)通常具有内建的安全机制,能有效防止SQL注入、XSS等攻击。使用这些框架可以大大减少手动处理编码问题的风险。
-
URL解码控制:服务器应确保对URL中的编码部分进行解码时使用正确的解码机制,避免错误地处理恶意编码内容。
通过了解URL编码与安全渗透的关系,可以识别潜在的漏洞并采取措施防范各种攻击,保障Web应用的安全性。
3. HTML实体编码
- HTML实体编码(HTML Entity Encoding)是一种将特殊字符转换为预定义实体(Entity)的机制,以确保这些字符在HTML文档中被正确显示,而非被解析为代码。
- 例如,字符
<
会被编码为<
,字符>
会被编码为>
。
- 例如,字符
- 特性:将危险字符替换为实体形式(如
<
→<
,>
→>
)。- 应用场景:
- 网页渲染用户输入内容。
- 防御跨站脚本(XSS)攻击。
- 安全领域:
- Web安全(XSS防护)。
核心目标:
-
防止解析歧义:避免浏览器将用户输入的内容误认为HTML标签或脚本。
-
防御注入攻击:阻止恶意用户通过输入特殊字符注入代码(如XSS攻击)。
示例:基本字符转义
原始字符 | 实体编码 | 用途 |
---|---|---|
< | < | 避免被解析为HTML标签起始符 |
> | > | 避免被解析为HTML标签结束符 |
& | & | 避免被解析为实体编码起始符 |
" | " | 避免破坏HTML属性值的引号 |
' | ' 或 ' | 避免破坏单引号包裹的属性值 |
示例:用户输入转义
未编码的输入
用户评论:<script>alert('XSS攻击!')</script>
编码后的输出:
用户评论:<script>alert('XSS攻击!')</script>
此时,浏览器会直接显示文本内容,而不会执行脚本。
何时使用HTML实体编码?
-
输出到HTML内容时:在将用户输入、数据库数据或第三方内容插入HTML正文或属性时。
-
避免在存储时编码:保留原始数据,仅在展示时动态编码,以适应不同场景(如导出为文本、JSON等)。
工具与函数
语言/框架 | 编码函数 | 示例 | |
---|---|---|---|
PHP | htmlspecialchars() | htmlspecialchars($input, ENT_QUOTES, 'UTF-8') | |
Python (Django) | 模板自动转义或 escape 过滤器 | `{{ user_input | escape }}` |
JavaScript | 手动替换或库(如he ) | he.encode(userInput, { useNamedReferences: true }) | |
Java (Spring) | Thymeleaf模板引擎自动转义 | <div th:text="${userInput}"></div> |
绕过编码的渗透技巧(及防御)
通过未过滤的上下文绕过
-
场景:
即使对HTML内容编码,若将用户输入插入到<script>
标签或事件处理程序中,仍需额外处理。 -
攻击载荷:
<a href="#" onclick="用户输入">点击</a>
-
若用户输入为
alert(1)
,会导致代码执行。 -
防御:
根据上下文选择编码方式:-
JavaScript上下文:使用
\uXXXX
Unicode转义。 -
HTML属性:同时编码空格和括号,如
 
替代空格。
-
4. Hex编码(十六进制编码)
在信息传输过程中,有些字符可见,有些不可见。为了使传输过程更加规范,可以将信息编码为十六进制(hex),传输完成后再解码为原始信息。Hex编码是最常用的编码方式之一,它将信息转换为十六进制形式,适用于计算机存储和数据处理。
- 特性:将每个字节转换为两个十六进制字符(如
0x41
→41
)。- 应用场景:
- 调试二进制数据(如内存转储)。
- 二进制协议数据传输(如MAC地址)。
- 安全领域:
- 数据完整性校验(如哈希值表示)。
Python实现Hex编码
s = "flag"
print(s.encode("hex"))
结果: 666c6167
每个字符的ASCII码被转换为对应的十六进制值。
Hex编码与数学运算
密码学中的大部分操作都是基于数学计算的,因此需要将字符串转换为数字。
Hex编码可以作为字符串到十进制数字的中转工具。
s = "flag"
t = s.encode("hex")
print(int(t, 16))
输出结果: 1718378855
对于单字符,可以使用ord
函数直接获取ASCII值
print(int("a".encode("hex"), 16))
print(ord("a"))
数字转字符串
解密运算结束后,需要将数字转换回字符串:
num = 584734024210391580014049650557280915516226103165
print(hex(num))
print(hex(num)[2:-1])
print(hex(num)[2:-1].decode("hex"))
输出结果:
输出结果:
0x666c61677b746869735f69735f615f666c61677d1
666c61677b746869735f69735f615f666c61677d
flag{this_is_a_flag}
自定义数字转字符串函数
def num2str(num):
tmp = hex(num)[2:].replace("L", "")
if len(tmp) % 2 == 0:
return tmp.decode("hex")
else:
return ("0" + tmp).decode("hex")
print(num2str(584734024210391580014049650557280915516226103165))
输出结果:
flag{this_is_a_flag}
5. UTF-8/Unicode编码
-
Unicode 是一种字符编码标准,旨在为世界上几乎所有语言的字符提供一个唯一的编码。它包括多种不同的字符集,涵盖了从常见的拉丁字母到各种符号、汉字、甚至表情符号等。
-
Unicode的目标是解决传统字符编码标准无法支持多语言问题,实现跨平台、跨语言的文本交换。
-
-
UTF-8 是Unicode的一种编码方式,它可以用变长字节(1到4个字节)来表示Unicode字符。
-
UTF-8与ASCII兼容,因此,它可以无缝地与现有的系统和协议兼容,同时又支持几乎所有语言字符的表示。它的优点是灵活性和兼容性。
-
- 特性:可变长编码,支持多语言字符,兼容ASCII。
- 应用场景:
- 多语言文本处理。
- 国际化应用程序。
- 安全领域:
- 防御Unicode注入攻击(如目录遍历
%C0%AF
)。- 同形字攻击(如
а
(西里尔) vsa
(拉丁))。
UTF-8/Unicode实体编码与安全渗透的关系
-
UTF-8编码漏洞:在安全渗透测试中,UTF-8编码有时会被用作绕过传统输入过滤或字符编码解析机制的手段。一些Web应用没有正确处理UTF-8编码输入,可能导致跨站脚本(XSS)、SQL注入或命令注入等安全漏洞。攻击者可以通过插入特定的字符、实体编码、Unicode编码等方式来绕过过滤。
-
Unicode绕过过滤:攻击者通过将恶意脚本或SQL命令以Unicode编码进行传输(如
<script>alert(1)</script>
),可以绕过防护系统的输入验证或输出编码,从而实施跨站脚本攻击(XSS)。 -
Web应用中的Unicode编码注入:Unicode编码注入攻击涉及将特定字符(如斜杠或引号)用Unicode表示(例如,
\u002F
表示斜杠/
),使得应用无法正确解析并过滤这些字符,进而导致攻击成功。
实际案例
XSS(跨站脚本攻击):假设某个网站没有正确处理用户输入,允许用户在输入框中插入脚本。如果输入框没有做充分的字符过滤,攻击者可以提交如下的Unicode编码字符:
<script>alert('XSS')</script>
SQL注入(SQL Injection):攻击者可能利用UTF-8编码注入SQL命令,通过使用Unicode字符编码来绕过SQL查询语句中的过滤机制。例如,攻击者可能通过输入:
' OR 1=1; --
\u0027 OR 1=1; --
文件路径穿越:攻击者可能通过输入Unicode编码的路径穿越字符(如 ..
),绕过文件路径的限制,从而访问敏感文件。例如,攻击者将 ..
用 Unicode 编码 \u002E\u002E\u002F
来绕过目录结构限制。
6. JSON编码
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。JSON使用一种简单的文本格式来表示结构化的数据,通常用于客户端与服务器之间的数据交换。
JSON格式的数据通常由以下几部分组成:
- 对象:一组键值对(类似字典或哈希表)。
- 数组:有序的值集合(类似于列表或数组)。
- 值:可以是字符串、数字、布尔值、数组、对象或
null
。
JSON的基本语法:
- 数据在键值对之间通过冒号分隔。
- 键与值之间用逗号分隔。
- 键必须是字符串。
- JSON的基本数据类型有字符串、数字、布尔值、数组、对象和
null
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"],
"address": {
"street": "123 Main St",
"city": "Anytown"
}
}
- 特性:转义特殊字符(如
"
→\"
,换行符→\n
)。- 应用场景:
- API数据传输(如
Content-Type: application/json
)。- 安全领域:
- 防止JSON注入(如恶意脚本插入)。
JSON编码与安全渗透的关系
- JSON编码本身并不是一种攻击方式,而是作为一种数据交换格式被广泛使用。
- 但在安全渗透过程中,攻击者可能会利用JSON编码相关的漏洞发起攻击,尤其是在Web应用程序中。
- JSON编码和Web安全有一些潜在的联系,特别是在输入验证和数据解析环节。
以下是几个与JSON编码相关的安全渗透场景:
-
JSON注入攻击 JSON注入攻击是指攻击者将恶意的数据嵌入JSON格式的请求或响应中,以达到修改应用行为或绕过应用逻辑的目的。攻击者通常试图通过操控JSON数据,破坏系统的正常行为,或者通过操控数据内容来窃取信息。
-
不安全的JSON解析 一些应用程序会直接解析用户提交的JSON数据,如果没有足够的输入验证或反序列化保护,攻击者可能通过构造恶意的JSON数据来控制程序的执行。例如,攻击者可能通过在JSON中嵌入恶意的脚本,尝试引发跨站脚本(XSS)攻击。
-
跨站请求伪造(CSRF)和JSON 在某些情况下,攻击者可以通过伪造JSON请求,诱使受害者执行未授权的操作。例如,攻击者可能构造一个伪造的JSON数据包,冒充合法请求,触发不必要的状态更改或信息泄露。
JSON注入攻击的案例
XSS(跨站脚本攻击)通过JSON注入
假设一个Web应用程序使用JSON来传输用户输入数据,但没有对数据进行适当的转义和验证。攻击者可以提交包含JavaScript代码的JSON数据,例如:
{ "username": "<script>alert('XSS')</script>" }
命令注入
如果一个应用程序将JSON数据中的字段直接传递给系统命令或数据库查询,攻击者可能通过注入恶意的命令执行数据,例如:
{ "username": "admin; rm -rf /" }
7. 二进制编码
- 二进制编码是一种将信息表示为二进制数(0和1)的方式。
- 在计算机中,所有的数据和指令都可以通过二进制来表示,因为计算机的基本工作原理依赖于数字电路的开关状态,而开关状态可以用两种状态表示,通常是“开”与“关”,或“1”和“0”。
- 因此,二进制成为计算机处理和存储数据的基础。
- 特性:直接处理原始字节流(无字符转换)。
- 应用场景:
- 网络协议(如TCP/UDP数据包)。
- 文件存储(如可执行文件)。
- 安全领域:
- 缓冲区溢出攻击。
- 反序列化漏洞。
二进制编码的案例
ASCII编码
ASCII编码是将字符映射为二进制数的一种方法。例如,字母"A"的ASCII码是65,表示为二进制数:01000001
。
IP地址的二进制表示
一个IPv4地址由4个字节组成,每个字节是8位二进制。例如,IP地址192.168.1.1
的二进制表示是:
11000000.10101000.00000001.00000001
图像文件
图像文件(如JPEG、PNG等)也使用二进制编码来表示图像数据,实际上,图像中的每个像素的颜色通常通过RGB(红、绿、蓝)模式转换为二进制数来存储。
二进制编码与安全渗透的关系
在安全渗透中,二进制编码扮演着重要角色,尤其在攻击时,攻击者需要操控二进制数据以绕过安全防护。以下是几个与安全渗透相关的二进制编码应用场景:
-
缓冲区溢出攻击
缓冲区溢出攻击常常涉及恶意代码注入,其中攻击者通过输入精心构造的二进制数据,使得程序的控制流被修改,从而执行攻击者指定的恶意操作。例如,攻击者可以通过特定的二进制数据覆盖程序的返回地址,进而实现远程代码执行。 -
编码绕过防火墙和检测系统
安全防火墙或入侵检测系统(IDS)通常会检查传入的请求,以识别恶意活动。在某些情况下,攻击者通过二进制编码或其他编码方式(如Base64编码)对数据进行编码,以绕过这些安全系统,隐藏恶意代码。例如,攻击者可能会将恶意负载(如JavaScript代码)通过Base64编码并传递,以避免被检测到。 -
命令注入
在命令注入攻击中,攻击者可以将恶意命令嵌入到用户输入的字段中。如果目标系统未正确验证输入,攻击者可能会通过精心构造的二进制命令执行任意命令,通常以绕过安全过滤器为目标。
二进制编码在安全领域中的案例
-
恶意软件加密和编码
恶意软件经常利用二进制编码将其代码加密或混淆,以便逃避病毒扫描软件的检测。例如,一些勒索软件会将其负载编码成Base64格式,甚至使用自定义二进制加密算法,以确保病毒不会被反病毒软件及时发现。 -
Web应用程序攻击:XSS(跨站脚本攻击)
在某些情况下,攻击者可能会通过二进制编码绕过输入验证,将恶意脚本隐藏在表单输入中。例如,攻击者可以通过将JavaScript代码进行二进制编码,然后在Web页面中插入该二进制编码,从而在用户的浏览器中执行恶意脚本。 -
二进制协议漏洞利用
某些通信协议(例如SMB、FTP等)使用二进制协议传输数据。攻击者通过分析和构造恶意的二进制数据包,可能利用协议中的漏洞发起攻击,如信息泄露、远程执行代码等。
二进制编码、ASCII、Unicode、Hex、UTF-8、JSON、HTML实体编码和Base64编码 的详细比较表格
编码类型 | 编码表示方式 | 特点与用途 | 如何一眼识别 | 在安全领域的应用场景 | 安全特性 |
---|---|---|---|---|---|
二进制编码 | 仅由 0 和 1 组成 | 表示计算机内部数据,基础编码方式,适用于低级别硬件操作 | 只包含 0 和 1 ,如:10101101 或 110101 | 缓冲区溢出攻击,利用二进制数据操控内存或程序流 | 容易直接操作计算机底层数据,常用于攻击载体注入。 |
ASCII | 7 位(或扩展为 8 位)字符 | 标准字符编码,表示英文字母、数字和符号。每个字符对应一个数字值 | 由字符组成的字符串,且字符都是基本的英文字符。例如:A , 123 , ! | XSS(跨站脚本),通过在用户输入中注入ASCII字符进行恶意代码执行 | 仅适用于英文字符,容易被传统过滤器检测。 |
Unicode | 多种编码方式(UTF-8, UTF-16等) | 支持全球所有语言的字符,包含更广泛的字符集 | 以 \u 后跟 4 位十六进制数表示,例如:\u0041 (代表字母"A") | 编码绕过,通过Unicode字符绕过过滤器进行攻击 | 支持多种语言和特殊符号,有时会被用来绕过输入验证。 |
Hex(十六进制) | 使用0-9, A-F表示数字 | 将二进制数据转换为易读的格式,每两个字符表示一个字节 | 由 0-9 和 A-F 组成,通常以 0x 前缀,例如:0x41 表示 A | 命令注入,通过操控十六进制数据进行注入攻击 | 可以将二进制数据表示为易读的格式,常用于绕过过滤。 |
UTF-8 | 多字节编码(1到4字节) | 变长字符编码,用于表示Unicode字符,兼容ASCII | ASCII字符部分与ASCII相同,非ASCII字符以 0x 开头的字节表示,如 0xE4 | XSS和HTML注入,通过UTF-8编码绕过过滤和输入验证 | 兼容ASCII,广泛使用,容易被攻击者用来绕过安全措施。 |
JSON | 使用 {} 和 [] 结构 | 用于数据交换,采用键值对格式,支持多种数据类型(字符串、数字、数组等) | 数据以 {} 包裹表示对象,[] 表示数组,键值对形式:"key": "value" | JSON注入,攻击者修改JSON数据,绕过身份验证或输入过滤 | 易受恶意数据操控,可能用于伪造响应、绕过验证。 |
HTML实体编码 | 使用 & 和 ; 包裹字符 | 将特殊字符(如 < , > , & 等)转为HTML实体,防止浏览器解析为标签 | 以 & 开始,以 ; 结束,例如:< , & , © | XSS攻击,利用HTML实体编码绕过输入过滤和执行恶意脚本 | 防止HTML标签被解析,但有时能被用作绕过XSS防护。 |
Base64编码 | 使用 A-Z, a-z, 0-9, + , / | 将二进制数据转换为可打印字符的编码,常用于URL、电子邮件等 | 由 A-Z, a-z, 0-9 和 + , / 组成,通常以 = 填充,长度是4的倍数,例如:U29mdXQgRGV2 | 编码绕过和数据泄露,通过Base64编码绕过传输层的安全检测 | 可用于数据隐匿或绕过安全检测,特别在传输敏感数据时。 |
编码特点总结:
- 二进制编码:用于计算机内部的基本表示,适用于低级别硬件或内存操作。在攻击中常用于缓冲区溢出等攻击手段。
- ASCII:适用于英文字符集,易于在传统过滤器中检测和防范。常见于老旧系统,注入攻击如XSS可能使用ASCII字符。
- Unicode:支持全球所有字符的编码,字符集更广。攻击者通过Unicode字符可以绕过一些过滤器,尤其是在Web应用中。
- Hex(十六进制):用于将二进制数据转换为可读格式,广泛应用于调试和反向工程。在渗透测试中,常用于绕过输入过滤和注入攻击。
- UTF-8:支持全球字符的编码方式,且兼容ASCII。在Web应用中常用于处理多语言数据,XSS和HTML注入常涉及UTF-8字符编码。
- JSON:用于数据交换,易于被人类读取。在安全领域常见于注入攻击,攻击者通过操控JSON数据绕过安全控制。
- HTML实体编码:将特殊字符转为实体编码,防止它们被浏览器误解析为HTML标签。常用于防止XSS攻击,但也可能被攻击者利用绕过防护。
- Base64编码:将二进制数据转换为ASCII字符,常用于电子邮件或URL传输。在渗透测试中,常用来绕过安全过滤或进行数据隐匿。
总结:
在安全领域中,这些编码类型通常被攻击者用来绕过输入过滤、防火墙或入侵检测系统(IDS)。例如,XSS攻击常涉及HTML实体编码、UTF-8编码或Base64编码来避免被检测到,而JSON注入则是攻击者通过操控JSON格式的数据进行攻击。通过理解这些编码及其特点,可以帮助开发者和安全专家更好地防范编码相关的攻击。
喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。