一、课程定位与核心思想
1.1 为什么要学习加密与编码?
-
核心目的:安全测试(漏洞挖掘)时,必须按目标系统的数据格式和加密方式提交Payload,否则测试无效
-
关键原则 :以数据的正确格式发送,对方才能正确接收并进入业务逻辑
1.2 影响范围
表格
| 场景 | 影响环节 | 具体说明 |
|---|---|---|
| 传输数据加密/编码 | 漏洞探针 | 不按格式提交Payload,服务端无法识别 |
| 传输数据格式 | 漏洞探针 | 格式错误导致请求被拒绝 |
| 回显数据格式/加密 | 数据分析 | 无法判断响应结果(成功/失败) |
| 密码存储加密 | 后渗透测试 | 拿到密文但无法解密,无法登录利用 |
| 源代码加密/混淆 | 代码审计 | 无法阅读源码,无法分析漏洞 |
| 逆向保护(加壳/加固) | 逆向分析 | 无法反编译,无法分析程序逻辑 |
二、传输数据加密与编码
2.1 典型案例:URL参数Base64编码
场景 :id=MQ== 而非 id=1
-
识别 :
MQ==是Base64特征(大小写+数字+=填充) -
解码 :
MQ==→1 -
测试要点:
-
直接修改
id=2→ 失败(服务端期望编码格式) -
正确做法:
2→ Base64编码 →Mg==→ 提交id=Mg==
-
核心逻辑 :服务端接收→解码→代入业务逻辑。测试时必须对Payload进行同等编码/加密后再提交。
2.2 典型案例:登录密码MD5加密
场景 :明文123456 → 传输e10adc3949ba59abbe56e057f20f883e
-
爆破要点 :密码字典需先进行同等MD5加密后再替换
-
错误做法 :直接替换为
123456 -
正确做法:字典 → MD5加密 → 替换password字段
2.3 APP/小程序数据传输加密
特征:
-
请求参数为乱码字符串(非明文键值对)
-
返回数据同样加密
测试难点:
-
无法直接修改参数测试漏洞
-
无法判断返回结果含义(1=成功?2=失败?)
三、传输数据格式
3.1 常见数据格式对比
表格
| 格式 | 特征 | 示例 |
|---|---|---|
| 常规表单 | key=value&key2=value2 |
username=admin&password=123 |
| JSON | 大括号+键值对,字符串用引号 | {"username":"admin","password":"123"} |
| XML | 标签嵌套结构 | <user><name>admin</name></user> |
| 数组/列表 | 中括号包裹 | ["admin","123"] |
3.2 格式对测试的影响
关键原则 :Payload必须嵌入正确的格式位置
plain
复制
JSON格式示例:
{"username":"admin","password":"123"}
- 测试用户名注入点 → 在"admin"处构造Payload
- 测试密码注入点 → 在"123"处构造Payload
- 不能破坏JSON结构(如缺少引号、括号)
3.3 工具辅助识别(Burp Suite)
-
Params:标识请求是否含参数(✓表示有参数)
-
Type字段:显示数据类型
-
text/plain:纯文本 -
application/json:JSON格式 -
application/xml:XML格式 -
text/html:HTML格式
-
四、密码存储加密(数据库层面)
4.1 常见Web程序密码加密方式
表格
| 类型 | 算法特征 | 示例 | 解密方式 |
|---|---|---|---|
| 单纯MD5 | 32位/16位,十六进制字符 | e10adc3949ba59abbe56e057f20f883e |
在线MD5解密(碰撞) |
| MD5+盐(Salt) | MD5值后拼接随机字符串 | md5(password)+salt |
需知道盐值位置 |
| 多重MD5 | MD5(MD5(password)) | 双层或多层MD5 | 逐层解密 |
| 复杂加密(AES/DES等) | 含密钥、偏移量、模式 | 需密钥+IV+模式 | 需获取源码中的密钥 |
4.2 实战案例对比
案例1:JCMS(单纯MD5)
plain
复制
明文:123456
密文:e10adc3949ba59abbe56e057f20f883e(32位MD5)
特征:标准MD5,可直接解密
案例2:Discuz 3.2(MD5+盐)
plain
复制
加密逻辑:MD5(MD5(password).salt)
数据库字段:password + salt(分开存储)
解密条件:必须同时获取密文和盐值
案例3:Discuz 3.5(复杂加密)
plain
复制
特征:无盐字段,密文格式变化
加密方式:类似AES,需密钥+偏移量+模式
解密条件:必须从源码中获取密钥(K)和偏移量(IV)
难度:无法直接解密,需分析源码
4.3 系统级密码加密
表格
| 系统 | 加密方式 | 存储位置 | 工具 |
|---|---|---|---|
| Windows | NTLM哈希 | SAM数据库 | Mimikatz(提取哈希) |
| Linux | SHA-512/SHA-256等 | /etc/shadow |
查看shadow文件 |
| MySQL | MySQL5哈希(SHA1双重) | mysql.user表 |
专用解密工具 |
Windows NTLM示例:
plain
复制
工具:Mimikatz
提取:NTLM哈希值 → 复制到在线平台解密
类型:选择"NTLM"
限制:密码复杂度高时无法碰撞解密
五、源代码加密与混淆
5.1 PHP源码加密
场景:防止源码泄露,保护商业逻辑
加密效果:
-
原始代码:
<?php echo "hello"; ?> -
加密后:乱码/特殊编码,无法直接阅读
-
运行正常:加密代码仍可被PHP解析执行
对安全测试的影响:
-
无法直接审计代码逻辑
-
需先解密或寻找未加密版本
5.2 JavaScript代码混淆
场景:前端JS代码保护
示例:
JavaScript
复制
// 原始代码
alert(1);
// 混淆后( eval加密 )
eval(function(p,a,c,k,e,d){...})(...);
处理方式:
-
识别混淆类型(eval加密、obfuscator等)
-
使用对应解密平台/工具还原
-
还原后分析业务逻辑和接口
5.3 逆向保护与加壳
适用对象:EXE、APK、JAR、DLL等
保护方式:
-
加壳(UPX, ASPack等)
-
代码虚拟化(VMP)
-
反调试/反Hook
对安全测试的影响:
-
无法直接反编译APK获取源码
-
无法分析客户端逻辑和加密算法
-
需先脱壳/去保护
六、密文识别与解密思路
6.1 识别加密类型的方法
表格
| 识别维度 | 观察要点 | 示例 |
|---|---|---|
| 密文长度 | MD5=32/16位,NTLM=32位 | e10adc3949ba59abbe56e057f20f883e(32位→MD5) |
| 字符特征 | 是否含大小写、数字、特殊符号 | Base64含+/=;NTLM纯十六进制 |
| 来源位置 | Web数据库→MD5类;Windows系统→NTLM | 结合场景判断 |
| 数据结构 | 是否含盐字段、密钥字段 | 数据库中password+salt字段→带盐加密 |
6.2 解密的核心逻辑
碰撞解密(非真正逆向):
plain
复制
原理:明文 → 加密算法 → 密文(正向计算)
密文 ← 对比 ← 预计算明文库(反向碰撞)
限制:
- 密码复杂度决定碰撞成功率
- 123456 易碰撞
- Abc@123#xyz 难碰撞(组合空间太大)
密钥类加密(AES/DES等):
plain
复制
解密条件(缺一不可):
1. 密文
2. 密钥(Key)
3. 偏移量(IV)
4. 加密模式(CBC/ECB等)
5. 填充方式(PKCS7等)
获取途径:分析源码/逆向程序/配置文件
6.3 解密流程图
plain
复制
获取密文 → 识别类型 → 判断来源 → 尝试常规解密 → 成功?
↓ ↓ ↓ ↓
分析源码 长度/特征 Web/系统/DB 在线平台/工具 否→寻找密钥/盐值
↓ ↓
定位加密代码 → 提取算法逻辑 → 提取密钥/盐 → 自定义解密脚本
七、核心考点总结(SRC/CTF/面试)
7.1 必知概念
表格
| 考点 | 关键内容 |
|---|---|
| Base64 | 编码非加密,特征:大小写字母+数字+=填充,用于传输 |
| MD5 | 32位/16位,不可逆(碰撞解密),常见加盐 |
| Salt(盐) | 随机字符串,增加破解难度,存储位置是关键 |
| NTLM | Windows系统哈希,Mimikatz提取 |
| AES/DES | 对称加密,需密钥+IV,分析源码获取 |
| JSON/XML | 数据格式,Payload需符合格式要求 |
7.2 实战测试原则
-
传输加密:Payload先加密/编码,再提交
-
格式匹配:Payload嵌入正确格式位置,不破坏结构
-
回显分析:识别返回数据格式,判断测试结果
-
密码破解:识别加密方式→获取盐/密钥→构造解密
7.3 CTF常见题型
-
Base64隐写:多层Base64嵌套解码
-
MD5碰撞:给定密文找明文(弱口令)
-
Salt爆破 :已知盐,构造
md5($pass.$salt)爆破 -
前端JS解密:识别混淆方式,还原后找Flag
-
伪加密ZIP:识别加密标志位,修改后解压
7.4 面试高频问题
Q:拿到一个MD5密文,如何尝试解密?
A:1) 判断长度(32/16位确认MD5);2) 在线平台碰撞解密;3) 失败则判断是否加盐(查数据库是否有salt字段);4) 有盐则获取盐值,构造加密逻辑重新爆破;5) 复杂加密需分析源码获取密钥。
Q:APP抓包发现数据加密,如何测试?A:1) 定位加密位置(客户端JS/Java或服务端);2) 逆向/审计获取加密算法和密钥;3) 编写脚本对Payload自动加解密;4) 使用Burp插件(如BurpCrypto)自动处理。
Q:为什么有些密文无法解密?A:1) 密码复杂度过高,碰撞空间不足;2) 使用密钥类加密(AES)但无密钥;3) 自定义加密算法;4) 多层嵌套加密(需逐层分析)。
学习建议 :本节重点是建立"数据格式与加密意识",实际工作中需结合具体目标,通过抓包分析、源码审计、逆向工程等手段,逐步还原加密逻辑。并非所有加密都能破解,掌握信息越多(源码、配置文件、数据库),成功率越高。

