CBC翻转字节攻击
CBC加密过程(密文分组链接模式
异或后加密
攻击点为IV或者加密后的某段密文
改第一组明文的信息,需要更改IV
$A = Plaintext[0] = 'h' ;
$B = IV[0] = 可控;
$C = Decrypt(Ciphertext)[0] = ?;
//所以我们需要伪造一个新的IV向量,使得$C ^ New_IV = 我们需要的明文
//因为有
$C ^ Old_IV = Source_str
//所以
$C = Old_IV ^ Source_str
//并且我们还需要
$C ^ New_IV = Target_str
//即
$C = New_IV ^ Target_str
//所以
Old_IV ^ Source_str = New_IV ^ Target_str
//所以
New_IV = Old_IV ^ Source_str ^ Target_str
已知异或之后的第N-1组密文(Decrypt之后的密文),我们就可以通过字节翻转改变第N组明文
下面假设我们要更改第3组明文
$Old_pt[1]为第2组明文,$Old_ct[1]为第2组密文,$Old_ct[2]为第3组密文
$Plaintext = [
'comment1=wowsuch',
'%20CBC;userdata=',
'*admin=true;come',
'nt2=%20suchsafe%',
'20very%20encrypt',
'wowww'
];//我们要使$Plaintext[2]中的*变成;
//密文全部已知并可控
$Old_pt[1] = Plaintext[1] = '%20CBC;userdata=';
$Old_ct[1] = Decrypt(Ciphertext)[1] = 已知 并且我们攻击的点在这;
$Old_ct[2] = Decrypt(Ciphertext)[2] = 已知;
//所以我们需要伪造一个新的第2组密文,使得$Old_ct[2] ^ $New_ct[1] = 我们需要的明文$New_pt[2]
//因为有
$Old_ct[1] ^ $Old_ct[2] = $Old_pt[2];
//所以
$Old_ct[2] = $Old_ct[1] ^ $Old_pt[2];
//并且还已知
$New_ct[1] ^ $Old_ct[2] = $New_pt[2];
//即
$Old_ct[2] = $New_ct[1] ^ $New_pt[2];
//所以
$Old_ct[1] ^ $Old_pt[2] = $New_ct[1] ^ $New_pt[2];
//所以
$New_ct[1] = $Old_ct[1] ^ $Old_pt[2] ^ $New_pt[2];
https://resources.infosecinstitute.com/cbc-byte-flipping-attack-101-approach/#
https://www.jianshu.com/p/7f171477a603
bugku login4
http://123.206.31.85:49168/
flag格式:SKCTF{xxxxxxxxxxxxxxxx}
hint:CBC字节翻转攻击
有备份文件
恢复
<?php
define("SECRET_KEY", file_get_contents('/root/key'));
define("METHOD", "aes-128-cbc");
session_start();
function get_random_iv(){
$random_iv='';
for($i=0;$i<16;$i++){
$random_iv.=chr(rand(1,255)