题目:跳转提示
打开链接,发现是一个登录页面:
尝试输入用户名admin,密码123,发现显示:
于是修改用户名为admin1,密码123,显示:
猜测可能需要绕过一开始对用户名admin的过滤,使用dirsearch扫描网址:
发现一个swp文件,这是当使用vim或vi编辑文件出现错误时会产生的一个交换文件,可以用来恢复原文件,使用命令
vim -r index.php.swp
可以得到源代码内容:
分析代码,发现改网站使用的是aes-128-cbc加密,结合题目猜测是利用CBC字节翻转攻击,使得输入的用户名不是admin,但对密文CBC解码后的用户名为admin
发现可以分为三步:
第一步:修改cipher
输入用户名:admim,密码:123456789,查看COOKIE得到对应cipher='%2BHKS%2BZEHVyQiVB83AZ%2FOj5sWmeXNiwOXapneD51cm%2BSSvwuAKjNADOKCZLmrCaz2%2BnAgpthIWr%2FijxluMdbZGd7Bwbfm%2FngwXPAW9v04qFs%3D'和iv='3kjDiNVRjmeYbKzNlqYD0A%3D%3D'
(这一步是为了得到ciphertext和iv,同时也是为了使得session['username']存在)
因为网站加密使用了aes-128-cbc加密,这是一种分组加密,因此将密文分为5组(5*128bit=5*16byte),同理,根据源代码可知,明文M=a:2:{s:8:"username";s:5:"admim";s:8:"password";s:9:"123456789";},可以分成四组(4*16byte):
array(4) {
[1]=> string(16) "a:2:{s:8:"userna"
[2]=> string(16) "me";s:5:"admim";"
[3]=> string(16) "s:8:"password";s"
[4]=> string(16) ":9:"123456789";}"
}
利用CBC字节翻转攻击CBC字节反转攻击原理_w0s1np的博客-CSDN博客_cbc字节翻转攻击,可以通过修改第一组密文来篡改其通过其解密出的第二组明文,使得admim变为admin
<?php
$iv=base64_decode(urldecode('3kjDiNVRjmeYbKzNlqYD0A%3D%3D'));
$cipher=urldecode('%2BHKS%2BZEHVyQiVB83AZ%2FOj5sWmeXNiwOXapneD51cm%2BSSvwuAKjNADOKCZLmrCaz2%2BnAgpthIWr%2FijxluMdbZGd7Bwbfm%2FngwXPAW9v04qFs%3D');
$cip=base64_decode($cipher);
$c=array("username"=>"admim","password"=>"123456789");
$cc=serialize($c);
for($i=1;$i<=5;$i++){//原CBC密文分为5组(5*16)
$j=$i-1;
$cip_part[$i]=substr($cip,$j*16,16);
}
for($i=1;$i<=4;$i++){//明文分组(4*16)
$j=$i-1;
$M_part[$i]=substr($cc,$j*16,16);
}
$temp=$M_part[2]^$cip_part[1];//原第二组密文aes解密后的内容
$cip_new_part[1]=$cip_part[1];
$cip_new_part[1][13]=$temp[13]^"n";
//echo $cip_new_part[1]^$temp;//得到新的第一组密文,可以使得得到的明文中由admim转为admin
$newc=$cip_new_part[1].$cip_part[2].$cip_part[3].$cip_part[4].$cip_part[5];
$newc=urlencode(base64_encode($newc));
echo $newc;
?>
已知,只是这样变换,虽然可以达到第二组密文解码得到me";s:5:"admin";,但是因为改变了第一组密文的内容,会使其解码得到的第一组明文发生错误,若要得到想要的明文,就需要修改iv
第二步:修改iv
要如何修改iv,需要知道修改后的密文解码后的结果,通过源代码文件可以看出,在check_login()函数中,如果解码得到的明文无法反序列化,就会返回解码的base64加密内容
bp抓包,删除POST参数,修改COOKIE内容,使得iv不变,cipher变为第一步修改后的cipher
repeater后,得到结果:
这段base64加密值就是想要得到的内容
果然第一段明文发生了变化,通过将想要得到的第一组明文与修改后的第一组密文aes解密后的内容异或,就可以得到符合的iv
$x=base64_decode('DTrOn+3+6RAjCCAiZwMdEm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjk6IjEyMzQ1Njc4OSI7fQ==');//修改过第一组密文后得到的明文
//echo $x;//发现第一组明文乱码,但第二组用户名已经成功改变
$newM=substr($x,0,16);
$temp=$iv^$newM;//得到原第一组修改后的密文aes解密后的内容
$new_iv=$temp^$M_part[1];
$new_iv=urlencode(base64_encode($new_iv));
echo $new_iv;
得到结果
第三步:repeater修改后的cipher和iv
bp抓包,删除POST参数,修改COOKIE内容,使得cipher变为修改后的cipher,iv变为修改后的iv,重发请求,得到结果:
(太菜了,前后开了两次靶机)