简要介绍
刚好最近迷上了Web中的密码学攻击利用,才弄完CBC模式下的比特翻转攻击,不想立马就在CTF中碰见了Padding Oracle攻击,刚好还没学,正好学习一波,还不用自己找环境,源码审计,不用开脑洞~~
题目: Be admin

1 |
|
大致阅读下代码,可以看出程序逻辑,首先要通过用户认证,也就是说要登录成功,服务端会设置$_SESSION["id"]
, 这是后续Padding Oracle攻击的基础;$_SESSION["id"]
是aes-128-cbc
加密后的密文,我们能获取初始向量IV,也就是Cookie['token']
, 通过Padding Oracle攻击伪造IV使得解出来的明文为admin
即可。
SQL注入+弱类型比较绕过登录
查看程序代码,用户认证是通过比较$password
== $pass
是否相等,$pass
是用户输入的密码,用户可控;而$password
是经AES解密后的值, 而密文$encrypted_pass
是从数据库中查询出来的,存在SQL注入,用户可控,然而由于不知道秘钥,也就无法控制解密后的明文。
1 | function login($encrypted_pass, $pass) |
查询openssl_decrypt
函数,其返回结果解释如下:
1 | The decrypted string on success or FALSE on failure |
解密成功返回解密字符串, 失败则返回false
, 如果我们令解密失败返回false
, 那么我们只需要$pass=''
或$pass='0'
, 即可利用弱类型比较通过用户认证。要让解密失败,只需令密文长度不满足分组长度要求即可。
payload如下:
1 | username=-1' union select 1,1 %23 |
获取Cookie:
token=fxAXU2%2Fzw6PmPMm1TkAgRg%3D%3D
ID=56mJDsCs%2BQQf%2B44j1et%2BrQ%3D%3D
1 | Set-Cookie: ID=56mJDsCs%2BQQf%2B44j1et%2BrQ%3D%3D |
Padding Oracle攻击位置cookie
认证成功过后,就是利用Padding Oracle攻击获取$_SESSION["id"]
解密后的中间值value, 然后伪造IV, 使得 IV XOR value = 'admin' + string(0x11)* 11
, 即可。
1 | # -*- coding: utf-8 -*- |
后记
openssl_encrypt() 函数 options参数为OPENSSL_RAW_DATA
, 使用的是PKCS7
填充模式