Hacker101 Encrypted Pastebin 通关教科书式详解
字数 1931 2025-08-15 21:31:42
Hacker101 Encrypted Pastebin 通关详解
1. 背景介绍
Encrypted Pastebin 是 Hacker101 CTF 中的一个挑战,涉及 padding oracle 攻击。根据作者描述,虽然 padding oracle 的文章很多,但关于此挑战的详细通关方法较少。
2. Padding Oracle 基础知识
2.1 核心特性
-
XOR 特性:
- 交互律
- 结合律
- 同一值异或可抵消:0001 XOR 0001 = 0000
-
Padding 规则:
- 编码区块长度为 L
- 明文 P 的 padding 是 b 个值为 b 的字节,b ∈ [1,L]
- 示例(PKCS#5,L=8):
- 明文:LYHISTORY
- Padding 结果:L|Y|H|I|S|T|O|R|Y|07|07|07|07|07|07|07
2.2 攻击原理
- 当 padding 不符合规则时,服务器会抛出 padding 相关错误
- 攻击者可以利用这些错误信息推断出明文内容
3. 挑战通关步骤
3.1 Flag 0: 验证 padding oracle 存在
步骤:
-
提交任意内容获取加密链接,如:
http://XXXXXXXXXXXXXXX/?post=GOdGAowxThxkJHSU0yCTcnJmaPuMKIoj-J3YB382zWJcCxqUi80KtmS4CMsrHGSs-MbZYqzeja1H9lC06YjRQokhLDCKXDDR1mo!gU5EmETXPx6AZYaGAHU2dxYJzXYR52p!y6xPaGGKQuwTJJ7uy-uZBgntw45qjsXxlWnAMd09N9Wr8KOKzFHMOAm4FKzSNzeAWivqtGdRbM2ksu2sIw~~ -
改变第一个字节(引发语法检查错误):
- 将 G 改为 H
- 得到错误信息,确认第一个 flag
-
改变最后一个字节(引发 padding 错误):
- 将
Iw~~改为AA~~ - 得到
PaddingException,确认 padding oracle 存在
- 将
3.2 Flag 1: Padding Oracle 解密攻击
核心公式:
- Ci = Ek(Pi ⊕ Ci-1)
- Pi = Dk(Ci) ⊕ Ci-1
- C0 = IV
- c = {C0,C1...Ci...}, p = {P1,P2...Pi...}
攻击过程:
-
对于单区块情况(c={C0,C1}, p={P1}):
- P1 = Dk(C1) ⊕ C0 = Dk(C1) ⊕ IV
- 通过修改 C0 的最后一个字节,猜测 G ∈ [0x00,0xff]
- 当 P1' = P1 ⊕ 0x0G 的 padding 合法时:
- last-byte-of(Dk(C1)) = 0x0G ⊕ 0x01
- last-byte-of(P1) = 0x0G ⊕ 0x01 ⊕ last-byte-of(IV)
-
使用工具(如 padbuster):
padbuster http://XXXX/?post=<ENCODED DATA> <ENCODED DATA> 16 -encoding 0- 16 代表区块长度
- 0 代表 Base64 编码(需替换特殊字符)
-
解密结果:
{"flag": "^FLAG^××××××××××××××××××××××××××××××$FLAG$", "id": "3", "key": "3R7pl-uUjx-!COpjFc1jlA~~"}
3.3 Flag 2: Padding Oracle 加密攻击
目标:加密 {"id": "1"} 并查询结果
过程:
-
构造 P1' = {"id": "1"} + padding(05|05|05|05|05)
-
计算:
- C0' = 中间值 ⊕ P1'
- 新密文:c = {C0', C1}
-
使用 padbuster:
padbuster http://XXXX/?post=<ENCODED DATA> <ENCODED DATA> 16 -encoding 0 -plaintext '{"id": "1"}' -ciphertext 8e2e290858dd28f84a0705c7bc8596d7 -intermediate 50ffb4b14baf4ba3529b7d4966092669 -
结果:
Attempting to decrypt page with title: ^FLAG^*************************************************$FLAG$ Traceback (most recent call last): File "./main.py", line 74, in index body = decryptPayload(post['key'], body) KeyError: 'key'
3.4 Flag 3: Padding Oracle 加密攻击 + SQL 注入
多区块处理:
- 对于明文 p = {P1', P2'}:
- 先处理 P2':
- C1' = C2中间值 ⊕ P2'
- 再处理 P1':
- 获取 C1' 的中间值
- C0'' = C1'中间值 ⊕ P1'
- 最终密文:c = {C0'', C1', C2}
- 先处理 P2':
SQL 注入:
- 构造包含 SQL 注入的 payload
- 通过上述方法加密并发送
- 获取包含 flag 的响应
4. 关键知识点总结
-
Base64 编码处理:
- 替换规则:
replace('~', '=').replace('!', '/').replace('-', '+') - Base64 特性:3字节 → 4字符,补足 =
- 替换规则:
-
Padding Oracle 攻击:
- 依赖服务器对错误 padding 的反馈
- 可同时用于解密和加密攻击
-
区块密码模式:
- 使用 CBC 模式(Cipher Block Chaining)
- 每个区块依赖前一个区块
-
工具使用:
- padbuster 可自动化攻击过程
- 需注意编码和区块长度的设置
5. 防御建议
- 使用认证加密(AEAD)如 AES-GCM
- 避免在错误信息中泄露 padding 有效性
- 使用固定 IV 或随机 IV 时需谨慎
- 对用户输入进行严格验证
6. 扩展思考
- 不同 padding 方案的影响(PKCS#5 vs PKCS#7)
- 区块大小(8/16字节)对攻击的影响
- 如何检测和防御 padding oracle 攻击
- 其他可能存在的侧信道攻击
通过系统性地理解 padding oracle 攻击原理和实际应用,可以更好地理解块密码的实现缺陷及其安全影响。