bugkuctf–login4字节翻转攻击

18 篇文章 7 订阅
16 篇文章 3 订阅

题目地址:http://118.89.219.210:49168/

字节翻转攻击原理:http://www.anquan.us/static/drops/tips-7828.html

http://www.freebuf.com/articles/system/163756.html


尝试登陆:


普通用户无法查看,用户名改为admin,密码任意:


admin又不允许登陆,并且密码是任意输入的,也就是说关键点不是绕过登陆,而是身份认证,既然是身份认证,那有可能是在cookie里进行认证的,用burp抓包,可以看到:



存在以iv和cipher为关键字的cookie,这不就是CBC加密中的术语嘛,其实也是题目的提示

但到目前为止,我也不知道服务器端对我们传入的username和password做了怎样的处理,也就不知道加密的的字符串是什么,无奈扫了一下源码泄露,发现存在.index.php.swp文件,这是index.php文件异常退出时系统自动的备份文件,可以恢复源文件的,下载下来,拿到lunix下,用命令 vim -r index.php.swp 就可以恢复,


得到源码如下:只贴上有用的部分



可以看出我们传入的用户名和密码是经过序列化的,那我们将用户名admik,密码123序列化后再进行攻击,序列化后:

s:2:{s:8:”username”;s:5:”admik”;s:8:”password”;s:3:”123″;}

现在我们清理一下思路:

服务器将我们传入的数据序列化后,得到上面的字符串,然后用一个key值(未知),和一个iv值(已知,就是cookie中的iv)来加密得到密文,经过base64和url编码后,添加到cookie中(cipher的值),作为当前用户是admik的身份标识。我们再一次发起请求时,如果不再提交username和password的值(POST的内容为空),服务器就不会进行身份更新(不会重复上面的步骤),而是会用我们的cookie中的iv和cipher值进行一次CBC解密,得到上面的字符串,再进行反序列化,得到用户名admik.

现在的目的就是我们修改cookie的值,使服务器解密后得到的用户名为admin,就是把k改为n

不过这里我们只有密文,没有明文,利用的就是CBC解密的特点:前16个密文字符用来解密接下来的一组16个密文,就是说通过改变前16个密文就可以改变下面16个密文解密的结果,这就是字符翻转攻击。具体原理看链接,解释的挺详细。

首先在burp中发送请求,得到response的内容,显示要设置两个cookie,


burp当然没法自动设置,我们手动设置,再次发送,不过这次不带POST的内容,只带刚才设置的cookie,返回显示为admik,这也就验证了我们的猜想,服务器是通过这两个cookie来进行身份认证的。


下一步将我们的序列化内容分组,16个一组:

s:2:{s:8:”userna

me”;s:5:”admik”;

s:8:”password”;s

:3:”123″;}

我们想要改的k在第二组的13位(从0开始),那我们要改第一组的第13位。

修改脚本:

将得到的新的密文url编码:


发送,结果报错了:


报错显示无法序列化,这是因为我们修改了第一组密文,那第一组密文解密后也是错的,不能正确序列化。通过CBC解密的原理我们知道,第一组密文解密时,用的是iv的值,那么我们构建一个新的iv,使这个iv解密第一组后,得到s:2:{s:8:”userna即可,脚本如下:


将新的iv值url编码后发送,得到flag:



有个坑提醒一下:iv的值是随机变化的,即使同一个用户名,多次发送POST数据,也会改变iv,所以提交一次POST后就一次完成,否则就从头再来

最后附上两个脚本:

                
<?php
$enc=base64_decode("bIpgPK29vVQosJ+smzh0pOdq7QrP3H9CN0MBfynL1eKtILs/ayew1snTYbeYSIz8rQctkAUMORS76SWQHXwuKg==");
$enc[13] = chr(ord($enc[13]) ^ ord("k") ^ ord ("n"));
echo base64_encode($enc);
?>

<?php
$enc=base64_decode("4quudO++PAeVPQfcFJ0bbm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjM6IjEyMyI7fQ==");
$iv=base64_decode("TrphJjWLH37sj6+EBqh28A==");
$cleartext = 'a:2:{s:8:"userna';
$newiv = '';
for ($i=0;$i<16;$i++){
    $newiv=$newiv.chr(ord($iv[$i]) ^ ord($enc[$i]) ^ ord ($cleartext[$i]));
}
echo base64_encode($newiv);
?>

转载指明出处

文章同步到我的博客:http://119.23.249.120/archives/297

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值