目录
合规免责声明
渗透测试中编码加密应用流程图
思维导图编辑
一、URL 编码:渗透测试中最常用的字符 “伪装术”
1. 核心原理
2. 渗透测试核心场景
(1)WAF 字符过滤绕过
(2)SQL 注入参数传递
(3)XSS 载荷隐藏
3. 工具操作指南
(1)BurpSuite 编码操作
(2)在线工具编码(应急场景)
(3)命令行编码(Kali Linux)
4. 避坑要点
二、Base64:渗透测试中的 “载荷隐身衣”
1. 核心原理
2. 渗透测试核心场景
(1)Webshell 载荷隐藏
(2)文件上传绕过
(3)API 参数绕过
(4)函数拼接绕过
3. 工具操作指南
(1)命令行编码解码(Linux/Mac)
(2)BurpSuite 编码操作
(3)在线工具(应急场景)
4. 避坑要点
三、MD5:渗透测试中的 “密码破解利器”
1. 核心原理
2. 渗透测试核心场景
(1)密码哈希破解
(2)碰撞攻击绕过校验
(3)数据篡改检测
3. 工具操作指南
(1)Hashcat 破解 MD5(Kali Linux)
(2)在线哈希破解(应急场景)
(3)命令行计算 MD5 哈希(验证场景)
4. 避坑要点
合规免责声明
本文所讲解的 URL 编码、Base64 编码、MD5 加密相关技术,仅用于授权的网络安全渗透测试、漏洞排查、安全加固等合法合规场景。禁止将相关技术用于未经授权的攻击、入侵、数据窃取等违法犯罪行为。所有操作需遵守《网络安全法》《数据安全法》等相关法律法规,因违规使用本文技术导致的一切法律责任,均由使用者自行承担。
渗透测试中编码加密应用流程图
思维导图![]()
一、URL 编码:渗透测试中最常用的字符 “伪装术”
1. 核心原理
URL 编码(也叫百分号编码)的核心是将 URL 中非 ASCII 字符、特殊字符(如空格、&、=、%、单双引号等)转换为%+十六进制ASCII码的形式。其本质是一种 “字符转换协议”,而非加密技术 —— 编码后的内容可通过解码完全还原,核心价值在于解决 “特殊字符无法在 URL 中传输” 和 “避开安全设备检测” 两大问题。
常见特殊字符的 URL 编码映射(渗透测试高频使用):
原始字符 | URL 编码(一次) | 二次编码 | 应用场景 |
单引号 ' | %27 | %2527 | SQL 注入绕过 |
双引号 " | %22 | %2522 | XSS 载荷隐藏 |
空格 | %20 / + | %2520 | 命令执行参数分隔 |
< | %3C | %253C | XSS 标签绕过(如<script>标签伪装) |
> | %3E | %253E | XSS 标签绕过(如<script>标签伪装) |
管道符 | %7c | %257c | 命令执行拼接(如whoami%7Cipconfig绕过管道符过滤) |
URL 编码的核心逻辑:服务器接收请求后,会自动对 URL 参数进行解码(默认一次),若存在多层编码,需手动或通过工具实现多轮解码,这也是 “二次编码绕过” 的核心原理。
2. 渗透测试核心场景
(1)WAF 字符过滤绕过
这是 URL 编码最核心的应用场景。多数 WAF 会直接检测 URL 中的敏感关键字(如UNION、OR、'、` 但不会对所有请求进行多层解码。此时通过 “二次编码” 将敏感字符转换为 WAF 无法识别的形式,服务器解码后仍能正常执行恶意逻辑。
例如:SQL 注入中常用的1' OR 1=1 #,一次编码后为1%27 OR 1=1 #(WAF 可能识别 %27 对应的单引号),二次编码后为1%2527 OR 1=1 #(WAF 解码一次得到 %27,无敏感字符,服务器二次解码得到 ')。
(2)SQL 注入参数传递
部分网站的输入过滤规则仅拦截 “原始特殊字符”,不处理编码后的内容。例如,当网站禁止输入单引号时,将'编码为%27后,参数能正常传入数据库,执行拼接后的 SQL 语句。
(3)XSS 载荷隐藏
XSS 攻击中的 `alert ()`函数等,直接提交会被WAF或前端过滤。通过URL编码将标签和函数转换为百分号格式(如3C%73%63%72%69%70%74%3E`),可绕过基础检测,服务器解码后执行脚本。
3. 工具操作指南
(1)BurpSuite 编码操作
- 打开 BurpSuite,拦截目标请求包;
- 选中需要编码的参数值(如1' OR 1=1 #);
- 右键选择「Encode as URL」完成一次编码;
- 若需二次编码,选中已编码的字符(如%27),再次执行「Encode as URL」;
- 直接发送编码后的请求,无需额外配置。
(2)在线工具编码(应急场景)
推荐工具:URL 编码 / 解码在线工具(如站长工具、菜鸟工具)
操作逻辑:
- 输入原始载荷(如 `1)
- 选择 “URL 编码”(一次 / 多次);
- 复制编码结果,直接粘贴到请求参数中。
(3)命令行编码(Kali Linux)
# 一次URL编码(echo -n 避免换行符干扰) echo -n "1' OR 1=1 #" | xxd -plain | tr -d '\n' | sed 's/../%&/g' # 输出:31%27%204f52%20313d31%2023 # 二次编码(对一次编码结果再次编码) echo -n "31%27%204f52%20313d31%2023" | xxd -plain | tr -d '\n' | sed 's/../%&/g'4. 避坑要点
- ❌ 误区 1:编码次数越多越好 → 多数服务器仅支持 1-2 次解码,三次及以上编码会导致参数解析失败,需先通过 “测试参数” 验证服务器解码能力(如提交test%2520,若服务器返回test ,说明支持二次解码);
- ❌ 误区 2:所有场景都适合二次编码 → 若 WAF 支持 “多层解码检测”,二次编码可能失效,需切换其他绕过方式(如字符替换:将OR替换为O%20R);
- ✅ 关键:先判断目标防护设备类型(如阿里云 WAF、云盾),不同 WAF 的解码规则不同,可通过 “少量试探” 确定编码策略;
- ✅ 防御视角:服务端必须实现 “解码后校验”,对解码后的参数进行字符白名单过滤,而非仅校验原始请求;同时限制参数长度,避免超长编码载荷攻击。
二、Base64:渗透测试中的 “载荷隐身衣”
1. 核心原理
Base64 是基于 64 个可打印字符(A-Z、a-z、0-9、+、/,补位符 =)的二进制到文本编码方式,核心逻辑是将 3 字节二进制数据拆分为 4 个 6 位的二进制片段,每个片段对应一个 Base64 字符(不足 3 字节时用 = 补位)。
其核心特点(渗透测试关键价值):
- 编码结果仅包含可打印字符,无特殊符号,不会触发 URL 参数转义或过滤规则;
- 可逆性:通过base64_decode函数可直接还原原始内容,无需密钥;
- 隐蔽性:恶意载荷(如 Webshell、命令执行代码)编码后,表面上是普通字符串,易绕过关键字检测。
Base64 编码的核心公式:编码后长度 = ceil(原始长度 / 3) * 4,例如:
- 原始内容 “whoami”(5 字节)→ 编码后 “d2hvYW1p”(8 字节);
- 原始内容 “php eval ($_POST ['pass']);?>”(28 字节)→ 编码后 “PD9waHAgZXZhbCgkX1BPU1RbJ3Bhc3MnXSk7Pz4=”(36 字节)。
2. 渗透测试核心场景
(1)Webshell 载荷隐藏
Webshell(如 PHP 木马)的特征字符串(eval、assert、$_POST)是安全设备的重点检测对象。将 Webshell 编码为 Base64 后,特征字符串被隐藏,仅表现为随机字符,可绕过文件查杀和关键字拦截。
例如:原始木马<?php @eval($_POST['pass']);?>编码后为PD9waHAgQGV2YWwoJF9QT1NUWydwYXNzJ10pOz8+,上传或嵌入文件时,不会触发 “恶意代码” 检测。
(2)文件上传绕过
部分网站仅允许上传特定类型文件(如 txt、jpg),且对文件内容进行关键字检测。此时可将恶意代码(如 PHP 脚本)Base64 编码后保存为 txt 文件,上传后通过后端 “解码执行” 逻辑(如文件包含漏洞)还原并执行恶意代码。
(3)API 参数绕过
部分 API 接口会对参数中的命令执行关键字(如whoami、ipconfig)进行过滤。将命令编码为 Base64 后传递,接口接收后解码执行,可避开参数检测。
例如:命令cat /etc/passwd编码为Y2F0IC9ldGMvcGFzc3dk,作为 API 参数传递时,不会被识别为敏感命令。
(4)函数拼接绕过
若 WAF 拦截base64_decode等敏感函数,可通过字符串拼接、变量替换等方式构造等效函数,避开检测。
例如:base64_decode可拆分为base64_de.''.code(PHP 中字符串拼接会自动合并)、$func = 'base64_dec' . 'ode'; $func($data);等形式。
3. 工具操作指南
(1)命令行编码解码(Linux/Mac)
# Base64编码(-w 0 取消换行,避免编码结果拆分) echo -n "($_POST['pass']);?>" | base64 -w 0 # 输出:PD9waHAgQGV2YWwoJF9QT1NUWydwYXNzJ10pOz8+ # Base64解码 echo -n "PD9waHAgQGV2YWwoJF9QT1NUWydwYXNzJ10pOz8+" | base64 -d # 输出:POST['pass']);?> # Windows命令行(PowerShell) [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("whoami")) [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("d2hvYW1p"))(2)BurpSuite 编码操作
- 拦截请求包,选中需要编码的参数值;
- 右键选择「Encode as Base64」,自动生成编码结果;
- 若需结合 URL 编码(双重绕过),可先 Base64 编码,再 URL 编码;
- 发送请求,服务器需具备 Base64 解码逻辑(如代码中包含base64_decode)。
(3)在线工具(应急场景)
推荐工具:Base64 在线编码解码工具
操作逻辑:输入原始内容(如木马、命令)→ 选择 “编码”→ 复制结果直接使用,无需额外处理。
4. 避坑要点
- ❌ 误区 1:Base64 编码 = 加密 → Base64 是编码而非加密,任何人获取编码结果都能解码,仅用于 “隐藏特征”,不可用于敏感数据传输;
- ❌ 误区 2:编码后一定能绕过检测 → 主流 WAF 已支持 “Base64 解码后检测”,若编码内容解码后包含敏感字符,仍会被拦截,需结合多层编码(如 Base64+URL 编码);
- ❌ 误区 3:忽略补位符 = 的影响 → Base64 编码后的 = 补位符可能被部分接口过滤,可通过 “拆分编码内容” 规避(如将PD9waHAg...Pz4=拆分为$a='PD9waHAg...'; $b='Pz4='; base64_decode($a.$b););
- ✅ 关键:编码前尽量压缩原始载荷(如移除多余空格、注释),减少编码后长度;同时了解后端是否存在 “解码后长度限制”,避免载荷被截断;
- ✅ 防御视角:服务端对接收的 Base64 内容,必须解码后进行恶意代码检测;限制base64_decode、eval等函数的调用权限,禁止在文件包含、参数解析场景中直接解码执行。
三、MD5:渗透测试中的 “密码破解利器”
1. 核心原理
MD5(Message-Digest Algorithm 5)是一种哈希算法,核心是将任意长度的输入数据转换为128 位(32 个十六进制字符)的固定长度哈希值,其核心特性:
- 不可逆性:理论上无法从哈希值反推原始输入(无解密算法);
- 确定性:相同输入必产生相同哈希值,不同输入大概率产生不同哈希值(存在碰撞漏洞);
- 高效性:计算速度极快,适合批量处理大量数据。
渗透测试中,MD5 的核心应用场景均围绕 “哈希值与原始数据的映射关系” 展开,而非加密传输 —— 因为哈希值本身不包含原始数据,仅用于 “验证匹配” 或 “破解还原”。
常见 MD5 哈希示例:
原始内容 | MD5 哈希(32 位小写) | 应用场景 |
admin | 21232f297a57a5a743894a0e4a801fc3 | 弱密码破解 |
123456 | e10adc3949ba59abbe56e057f20f883e | 数据库密码破解 |
test123 | cc03e747a6afbbcbf8be7668acfebee5 | 登录密码校验 |
2. 渗透测试核心场景
(1)密码哈希破解
这是 MD5 最高频的应用场景。多数网站 / 系统会将用户密码通过 MD5 哈希后存储在数据库中(而非明文),渗透测试中获取数据库后,可通过 “哈希匹配” 还原明文密码。
破解逻辑:通过字典、暴力破解等方式,将字典中的字符串计算 MD5 哈希,与目标哈希值对比,若一致则字典中的字符串即为明文密码。
(2)碰撞攻击绕过校验
MD5 存在碰撞漏洞 —— 不同的输入数据可能产生相同的 MD5 哈希值。渗透测试中,可利用该漏洞构造 “恶意文件” 与 “合法文件” 具有相同的 MD5 哈希,绕过系统的 MD5 校验机制(如文件上传、数据完整性校验)。
(3)数据篡改检测
渗透测试过程中,若需验证目标文件(如配置文件、脚本)是否被防御系统篡改,可计算文件的 MD5 哈希,与原始哈希值对比,若不一致则说明文件被修改。
3. 工具操作指南
(1)Hashcat 破解 MD5(Kali Linux)
Hashcat 是渗透测试中最常用的哈希破解工具,支持字典攻击、暴力攻击、掩码攻击等多种模式,MD5 对应攻击模式为 0。
# 基础字典攻击(使用Kali自带rockyou字典) # 格式:hashcat -m 模式 哈希文件 字典文件 --force(--force强制运行) hashcat -m 0 md5_hash.txt /usr/share/wordlists/rockyou.txt --force # 掩码攻击(针对已知密码格式,如6位数字密码) hashcat -m 0 md5_hash.txt -a 3 ?d?d?d?d?d?d --force # ?d表示数字,?l小写字母,?u大写字母,?s特殊字符 # 加盐MD5破解(若密码哈希为MD5(明文+盐),如admin+abc=MD5(adminabc)) hashcat -m 0 md5_hash.txt -a 1 /usr/share/wordlists/rockyou.txt -1 abc --force # -1 指定盐值为abc,-a 1 表示组合攻击(2)在线哈希破解(应急场景)
推荐工具:CMD5、Hashkiller
操作逻辑:
- 输入目标 MD5 哈希值(32 位 / 16 位);
- 工具自动查询内置彩虹表(预计算的哈希 - 明文映射库);
- 若查询到匹配结果,直接返回明文密码;若未查询到,可选择 “深度破解”(需等待)。
(3)命令行计算 MD5 哈希(验证场景)
# Linux/Mac:计算字符串MD5 echo -n "admin" | md5sum # 输出:21232f297a57a5a743894a0e4a801fc3 - # 计算文件MD5 md5sum test.txt # 输出:d41d8cd98f00b204e9800998ecf8427e test.txt # Windows(PowerShell) Get-FileHash -Path test.txt -Algorithm MD54. 避坑要点
- ❌ 误区 1:MD5 哈希一定能破解 → 仅弱密码(如 123456、admin、生日等)可通过字典快速破解,复杂密码(16 位以上 + 字母 + 数字 + 特殊字符)破解难度极大,几乎不可能还原;
- ❌ 误区 2:忽略哈希加盐防护 → 若目标哈希是 “加盐哈希”(如 MD5 (明文 + 随机盐)),普通字典攻击无效,需获取盐值后进行针对性破解;
- ❌ 误区 3:碰撞攻击万能 → MD5 碰撞仅能生成特定格式的碰撞文件(如 PDF、EXE),对自定义数据校验(如文本内容校验)可能失效,且碰撞文件生成工具(如 fastcoll)的使用有一定门槛;
- ✅ 关键:破解前先判断哈希是否加盐(可通过哈希长度、格式初步判断,如加盐后哈希可能为 “哈希 + 盐” 拼接形式),优先使用大型字典(如 rockyou.txt)+ 掩码攻击组合;
- ✅ 防御视角:禁止使用 MD5 存储密码,改用 bcrypt、Argon2 等 “慢哈希算法”(计算速度慢,破解成本高);密码存储必须加盐(盐值随机且唯一),避免彩虹表破解;文件校验需结合 MD5 + 文件大小 + 内容特征,而非仅依赖 MD5。
本文为渗透测试基础系列文章之一,后续付费专栏将深入讲解编码加密的高阶绕过技巧(如多层编码嵌套、MD5 加盐碰撞、定制化 tamper 脚本开发)、实战靶场全流程解析,关注作者获取更多深度内容。