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 核心特性

  1. XOR 特性

    • 交互律
    • 结合律
    • 同一值异或可抵消:0001 XOR 0001 = 0000
  2. 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 存在

步骤

  1. 提交任意内容获取加密链接,如:

    http://XXXXXXXXXXXXXXX/?post=GOdGAowxThxkJHSU0yCTcnJmaPuMKIoj-J3YB382zWJcCxqUi80KtmS4CMsrHGSs-MbZYqzeja1H9lC06YjRQokhLDCKXDDR1mo!gU5EmETXPx6AZYaGAHU2dxYJzXYR52p!y6xPaGGKQuwTJJ7uy-uZBgntw45qjsXxlWnAMd09N9Wr8KOKzFHMOAm4FKzSNzeAWivqtGdRbM2ksu2sIw~~
    
  2. 改变第一个字节(引发语法检查错误):

    • 将 G 改为 H
    • 得到错误信息,确认第一个 flag
  3. 改变最后一个字节(引发 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...}

攻击过程

  1. 对于单区块情况(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)
  2. 使用工具(如 padbuster):

    padbuster http://XXXX/?post=<ENCODED DATA> <ENCODED DATA> 16 -encoding 0
    
    • 16 代表区块长度
    • 0 代表 Base64 编码(需替换特殊字符)
  3. 解密结果:

    {"flag": "^FLAG^××××××××××××××××××××××××××××××$FLAG$", "id": "3", "key": "3R7pl-uUjx-!COpjFc1jlA~~"}
    

3.3 Flag 2: Padding Oracle 加密攻击

目标:加密 {"id": "1"} 并查询结果

过程

  1. 构造 P1' = {"id": "1"} + padding(05|05|05|05|05)

  2. 计算:

    • C0' = 中间值 ⊕ P1'
    • 新密文:c = {C0', C1}
  3. 使用 padbuster:

    padbuster http://XXXX/?post=<ENCODED DATA> <ENCODED DATA> 16 -encoding 0 -plaintext '{"id": "1"}' -ciphertext 8e2e290858dd28f84a0705c7bc8596d7 -intermediate 50ffb4b14baf4ba3529b7d4966092669
    
  4. 结果:

    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 注入

多区块处理

  1. 对于明文 p = {P1', P2'}:
    • 先处理 P2':
      • C1' = C2中间值 ⊕ P2'
    • 再处理 P1':
      • 获取 C1' 的中间值
      • C0'' = C1'中间值 ⊕ P1'
    • 最终密文:c = {C0'', C1', C2}

SQL 注入

  1. 构造包含 SQL 注入的 payload
  2. 通过上述方法加密并发送
  3. 获取包含 flag 的响应

4. 关键知识点总结

  1. Base64 编码处理

    • 替换规则:replace('~', '=').replace('!', '/').replace('-', '+')
    • Base64 特性:3字节 → 4字符,补足 =
  2. Padding Oracle 攻击

    • 依赖服务器对错误 padding 的反馈
    • 可同时用于解密和加密攻击
  3. 区块密码模式

    • 使用 CBC 模式(Cipher Block Chaining)
    • 每个区块依赖前一个区块
  4. 工具使用

    • padbuster 可自动化攻击过程
    • 需注意编码和区块长度的设置

5. 防御建议

  1. 使用认证加密(AEAD)如 AES-GCM
  2. 避免在错误信息中泄露 padding 有效性
  3. 使用固定 IV 或随机 IV 时需谨慎
  4. 对用户输入进行严格验证

6. 扩展思考

  1. 不同 padding 方案的影响(PKCS#5 vs PKCS#7)
  2. 区块大小(8/16字节)对攻击的影响
  3. 如何检测和防御 padding oracle 攻击
  4. 其他可能存在的侧信道攻击

通过系统性地理解 padding oracle 攻击原理和实际应用,可以更好地理解块密码的实现缺陷及其安全影响。

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 存在 步骤 : 提交任意内容获取加密链接,如: 改变第一个字节(引发语法检查错误): 将 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): 16 代表区块长度 0 代表 Base64 编码(需替换特殊字符) 解密结果: 3.3 Flag 2: Padding Oracle 加密攻击 目标 :加密 {"id": "1"} 并查询结果 过程 : 构造 P1' = {"id": "1"} + padding(05|05|05|05|05) 计算: C0' = 中间值 ⊕ P1' 新密文:c = {C0', C1} 使用 padbuster: 结果: 3.4 Flag 3: Padding Oracle 加密攻击 + SQL 注入 多区块处理 : 对于明文 p = {P1', P2'}: 先处理 P2': C1' = C2中间值 ⊕ P2' 再处理 P1': 获取 C1' 的中间值 C0'' = C1'中间值 ⊕ P1' 最终密文:c = {C0'', C1', C2} 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 攻击原理和实际应用,可以更好地理解块密码的实现缺陷及其安全影响。