分析
原本网站目录下存在 index.php.swp 但是我做的时候已经不在了。附上源码
1 |
|
大概过程:
先由POST正文提交username(不能是admin)和password,进login函数获取iv和cipher到cookie中,然后攻击时重新发送构造好的iv和cipher,此时得把POST正文去掉,否则会又进入获取iv和cipher的过程中。
前导
CBC加密解密过程:
加密过程: ①先将明文分组,②生成随机iv,③将随机iv与第一组明文异或运算,④将异或后的结果进行带key值加密运算,⑤将加密密文与下一轮次的明文异或运算。⑥循环。
解密过程: 第一轮: ①将密文进行带key值解密运算,②将解密结果与随机iv异或运算得到第一组明文。第二轮: ①将密文进行带key值解密运算,②将解密结果与第一组密文异或运算得到第二组明文。 其余轮次与第二轮相同。
重点: 不管加密解密,除了第一组过程用的是随机iv进行异或,其他组使用前一组的数据进行加(解)密。
使用异或运算修改iv和cipher()
修改cipher方法:
cipher[n] = chr(ord(cipher[n])^ord('明文要修改前的字符')^ord('明文修改后的字符'))
推导:
* 假设目的是控制第二组明文
假设第二组明文内容为C,第一组密文为A,第二组密文解密运算后为B[还未与前一组密文异或]。
则修改后的第一组密文为
A'=A^C^D
。- 根据解密过程可以得到
C = A^B
- 根据1 可得到
A^B^C=0
- 假设D为修改后的内容,则
A^B^C^D=D
- 由于
C=A^B
所以将第一组密文A改为A’。A‘=A^C^D
- 这样当解第二组明文时
C=A'^B=A^C^D^B=D
这里的异或B在后端CBC解密时进行。
修改iv方法:
iv[i] += chr(ord(iv[i])^ord(right_plaint[i])^ord(error_plaint[i]))
推导:
- 假设第一组错误明文为A,第一组密文解密运算后为B,随机iv为C,则
A=B^C
- 假设修改后正确的iv是C‘,第一组正确明文为A’,则
A'=B^C'
- 由于B未知,根据上一条可得
A'=A^C^C'
- 所以最后求得
C’=A'^A^C
模拟CBC加解密过程
1 |
|
构造
1 | import urllib.parse as parse |
总结
CBC翻转攻击可以用来 绕过注入检测、直接提升权限等。。
这一题用到了翻转字节,CBC攻击还有个字节填充。