CTF Writeup | 对称密码篇:AES-ECB 模式 Padding Oracle 攻击详解

📅 2026/7/10 2:25:48
CTF Writeup | 对称密码篇:AES-ECB 模式 Padding Oracle 攻击详解
### 一、题目描述在某次 CTF 比赛中遇到一道 Web 题登录接口会返回一个 AES 加密的会话 Cookie格式为 Base64 编码。当 Cookie 被篡改时服务器会返回两种状态- 填充错误返回 500 Internal Server Error- 解密后内容无效返回 403 Forbidden提示信息说明Cookie 采用 **AES-ECB 模式 PKCS#7 填充** 加密目标是构造出管理员会话的 Cookie获取 flag。### 二、原理分析#### 1. AES-ECB 模式特点ECB电子密码本模式的核心缺陷是**每个明文块独立加密相同明文块会得到相同的密文块**且依赖 PKCS#7 填充即明文长度不足块大小时用字节值为0x0N的字节填充N 为填充字节数。#### 2. Padding Oracle 攻击原理服务器在解密时会验证填充是否正确这一差异成为攻击突破口- 我们可以通过修改密文的字节观察服务器返回的状态判断填充是否正确- 逐字节爆破出正确的填充值进而推导出对应的明文- 最终实现无需密钥直接解密 / 构造 AES-ECB 模式的密文。### 三、解题思路与步骤1. **确定块大小**AES 标准块大小为 16 字节题目中 Base64 解码后的密文长度为 48 字节共 3 个块16×3。2. **攻击最后一个块**- 构造 15 个已知字节初始全为0x00爆破第 16 个字节- 当服务器不再返回 500 错误时说明填充正确可推导出明文字节- 依次爆破还原出最后一个块的明文。3. **向前攻击前面的块**利用已还原的块继续向前爆破前一个块的明文最终还原完整 Cookie 明文。4. **构造管理员 Cookie**根据还原出的 Cookie 格式构造出admin1的明文再用相同方法加密成服务器可接受的密文成功登录获取 flag。import requests import base64 # 题目目标URL url http://example.com/login block_size 16 def oracle(ciphertext): 发送密文到服务器判断填充是否正确 cookies {session: base64.b64encode(ciphertext).decode()} resp requests.get(url, cookiescookies) return resp.status_code ! 500 # 500填充错误其他填充正确 def decrypt_block(prev_cipher, curr_cipher): 爆破单个块的明文 plaintext b for i in range(1, block_size 1): # 构造攻击向量修改当前块的前i个字节 modified_prev prev_cipher[:block_size - i] \ bytes([b ^ (i-1) for b in plaintext]) \ bytes([0] * (i-1)) for byte in range(256): test_cipher modified_prev bytes([byte]) curr_cipher if oracle(test_cipher): # 计算明文prev_cipher[block_size - i] ^ byte ^ i p_byte prev_cipher[block_size - i] ^ byte ^ i plaintext bytes([p_byte]) plaintext break return plaintext # 示例解密密文实际使用时替换为题目中的Base64密文 ciphertext base64.b64decode(dGVzdF9jYW5kYV9jb29rSUU) blocks [ciphertext[i:iblock_size] for i in range(0, len(ciphertext), block_size)] plaintext b for i in range(1, len(blocks)): plaintext decrypt_block(blocks[i-1], blocks[i]) print(解密后的明文:, plaintext)### 五、防御建议1. 优先使用 **AES-GCM、ChaCha20-Poly1305** 等带认证的加密模式替代 ECB 模式2. 解密时统一返回相同错误状态避免泄露填充是否正确的信息3. 对会话数据添加 MAC 校验如 HMAC-SHA256防止密文被篡改4. 定期更新加密密钥避免密钥泄露导致的整体防护失效。