(前排提示:这次思路写的极不清晰,可能只有我自己看的懂,打个预防针QAQ)

首先看题:

扫描,拿到了 .index.php.swp

这个文件是可以复原的。

上面的是重要的源码。审计之后发现这是CBC加密。

题目也给了提示,CBC字节翻转攻击。那就好说很多了,百度呗!

首先 CBC 是什么?

电码本模式(Electronic Codebook Book,简称ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。

密码分组链接模式(Cipher Block Chaining,简称CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。

计算器模式(Counter,简称CTR):计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。

密码反馈模式(Cipher FeedBack,简称CFB):实际上是一种反馈模式,目的也是增强破解的难度。

输出反馈模式(Output FeedBack,简称OFB:实际上是一种反馈模式,目的也是增强破解的难度。

简单的来说CBC就是分组呗。CBC采用十六个字节为一组的加密方式。

加密过程

Plaintext:待加密的数据

IV:用于随机化加密的比特块,保证即使对相同明文多次加密,也可以得到不同的密文。

Key:被一些如AES的对称加密算法使用

Ciphertext:加密后的数据

解密过程

看的懂吗?反正我看了好久才看懂!我就在这里把自己的思路理一下吧!

加密:

A:第n组的待加密数据

B:第n-1组的加密后的数据

C:第n组的加密后的数据

A^B的数据经过私有秘钥key加密后得到C,重复这个过程。(第一组有些不一样,但是思路是一样的)

解密:

A:第n组的加密后的数据

B:第n-1组加密后的数据

C:第n组解密后的数据

A经过私有秘钥key解密后与C进行异或操作,最终得到C。

看完之后应该还是很迷吧(都怪我太菜,讲解不好,那也没办法了,给个链接吧)

https://blog.csdn.net/csu_vc/article/details/79619309

(感谢大佬)

然后就是CBC字节翻转攻击了。(CBC字节翻转攻击只能用于解密阶段)

重点:在密文中改变的字节只会影响在下一明文中具有相同偏移量的字节

所以字节翻转攻击就是在利用n-1轮的数据来影响n轮明文的数据。

当我们的一个值C是由A和B异或得到
C = A XOR B
那么
A XOR B XOR C很明显是=0的
当我们知道B和C之后,想要得到A的值也很容易
A = B XOR C
因此,A XOR B XOR C等于0。有了这个公式,我们可以在XOR运算的末尾处设置我们自己的值,即可改变。

我们构造的用户名admia账号序列化后为
a:2:{s:8:"username";s:5:"admia";s:8:"password";s:3:"123";}

我们的目标是将k改成n,因此第一件事就是把明文分成16个字节的块:

Block1: a:2:{s:8:"userna

Block2: me";s:5:"admia";

Block3: s:8:"password";s

Block4: :3:"123";}

所以我们要翻转的是第二组的“a”翻转为“n”,所以我们要改变第一组的密文从而达到攻击的效果

我们可以看到我们的目标字符位于块2,偏移量为13,这就意味着我们要改变块一中偏移量为13的字符

第二块明文偏移量为13的字符(C) = 第一块密文偏移量为13的字符(A) ^ decrypt(第二块密文的偏移量为13的字符)(B)

即 C = A ^ B,这里我们知道C和A,因此B = A ^ C

假设我们修改A为A2,使得 A2 = A ^ C ^ D(我们想要的字符,这里指‘n’)

那么C = A2 ^ B = A ^ C ^ D ^ A ^ C = 0 ^ D  = D,即

$enc[13] = chr(ord($enc[13]) ^ ord("a") ^ ord ("n"))

然后写脚本就完事了

把cookie中的数据复制一下(注意看源码哦,每一次的iv都是不同的)

还有把post发送的数据给删掉哦,要不然iv会一直重置的。。。

先把cipher和iv给扔进脚本里,获得

把下面这行数据写进 cipher 里,继续go一下。(注意:bp有一个很恶心的缺点,+ / = 都要转成url编码,否则会出现编码错误的)

说无法解码?原来是这样

因为我们修改了第一块的密文,如果我们继续用原来的iv去解密第一块密文,

那么肯定是不成功的,是无法反序列化的,

因此我们需要修改iv,使其解密第一块得到的是a:2:{s:8:"userna

那么如何修改iv呢

第一块错误明文 = decrypt(第一块原密文) ^ ord_iv

那么  decrypt(第一块原密文) = 第一块错误明文 ^ ord_iv

第一块正确明文 = decrypt(第一块原密文) ^ new_iv

那么  new_iv = decrypt(第一块原密文) ^ 第一块正确明文 =  第一块错误明文 ^ ord_iv ^ 第一块正确明文

(我的脚本中只用把无法解码的字符串换一下就行了)

给上我写的垃圾脚本。

<?php

$a = array('username'=>'admia','password'=>'21354');
echo serialize($a),"<br/>"; //a:2:{s:8:"username";s:5:"admia";s:8:"password";s:6:"dawawd";} $old_iv = base64_decode('8TvnQRCNnQRxlTuE/YddSg=='); // 明文 admia
$cipher = 'R6EhHmZbmAQRcx3iHTDADBy1sgXnZOaIRZVZ7MA+DO7zcafXEEUPx0JoNe4l52ROEn7YFQYoA/AiLR8347MQOQ=='; $enc = base64_decode($cipher); $enc[13] = chr(ord($enc[13]) ^ ord('a') ^ ord('n')); //把第一组的第13位给转变了
$enc = base64_encode($enc);
echo $enc,"<br/>"; $right = 'a:2:{s:8:"userna';
$enc = base64_decode('XgB4zuCXhYaAkeVJwKfphG1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjU6IjIxMzQ1Ijt9'); //无法反序列化的字符串
$new_iv = '';
for( $i = 0 ; $i < 16 ; $i++ )
{
$new_iv = $new_iv.chr(ord($enc[$i]) ^ ord($right[$i]) ^ ord($old_iv[$i])); }
echo base64_encode($new_iv); ?>

最后,想说一些话:

bugku的web区最后一道题,从8月一直到11月,整整三个月,终于结束了。犹记得当初刚进web,连post和get是什么都一知半解,

不断地在题目中摸爬滚打,我不敢说我现在有多么强,但是,我可以说,我比四个月前强太多了,这几个月也结识了好多志同道合的朋友,

cytnb,fjlnb,qlnb,yjznb

虽然每天都在自闭中度过,但是,

好开心的说。

也许这就是CTF的魅力吧,也许这就是web的魅力吧。

bugku结束了,但是我的web才刚刚开始。

(好尬啊啊啊啊啊!!但是好开心。)

bugku login4的更多相关文章

  1. bugku login2 writeup 不使用vps的方法

    0x00前言 这个题是sql注入与命令执行相结合的一个题,思路有两个: 一.:sql注入登录web系统,命令执行反弹公网IP监听端口(需要vps),此种方法详见链接:http://www.bugku. ...

  2. bugku 密码学一些题的wp

    ---恢复内容开始--- 1.滴答滴 摩斯密码,http://tool.bugku.com/mosi/ 2.聪明的小羊 从提示猜是栅栏密码,http://tool.bugku.com/jiemi/ 3 ...

  3. 于bugku中游荡意外得到关于CBC翻转攻击思路

    个人简介:渣渣一枚,萌新一个,会划水,会喊六六今天在bugku遇到关于CBC翻转攻击的题目,总结了一下关于CBC翻转攻击的原理,以及关于这道题目的解题思路个人博客:https://www.cnblog ...

  4. http://www.bugku.com:Bugku——PHP伪协议+魔幻函数+序列化的综合应用(http://120.24.86.145:8006/test1/)

      这一道题目,幸好俺有基础知识护体,不然还真干不掉.     首先,登录看题目,取消隐藏代码的注释.可知可输入三个参数txt.file和password并进行逻辑判断:应该让txt==‘welcom ...

  5. http://www.bugku.com:Bugku——备份是个好习惯(http://120.24.86.145:8002/web16/)

      看了bugku的这道题,陌生又熟悉.     题目首先说[备份是个好习惯],访问网站只有一串字符,,,,,emmmmm,这句话表明人家经常做备份,所以咯,肯定在网站哪里备份有网页信息.嘻嘻   1 ...

  6. http://www.bugku.com:Bugku——jsfuckWEB5(http://120.24.86.145:8002/web5/index.php)

      今天又做了bugku上面的一道题.使用到了jsfuck,它是什么捏?   它是Javascript原子化的一种简易表达方式,用[]()!+就可以表示所有的Javascript字符,不依赖于浏览器. ...

  7. http://www.bugku.com:Bugku——SQL注入1(http://103.238.227.13:10087/)

    Bugku——SQL注入1(http://103.238.227.13:10087/) 过滤了几乎所有的关键字,尝试绕过无果之后发现,下面有个xss过滤代码.经搜索得该函数会去掉所有的html标签,所 ...

  8. Bugku——Flag在index里(http://120.24.86.145:8005/post/)

    Bugku——Flag在index里(http://120.24.86.145:8005/post/) 进入题目发现有一个file参数,查看源码,发现该参数可以包含php文件,并且题目提示,flag在 ...

  9. BugKu 2B+基于python的opencv的安装-------CTF 盲水印的套路

    BugKu杂项-2B 下载图片后,binwalk下跑一跑,发现有个zip,分离. 值得一提的是,这个zip是伪加密的. 但是你在分离的时候,伪加密的图片也给你分离出来了.这两个图片2B和B2肉眼看起来 ...

随机推荐

  1. prometheus函数介绍

    一 函数介绍 gauge类型的数据  属于随机变化数值,并不像counter那样 是 持续增长 1 increase() increase 函数 在promethes中,是⽤来 针对Counter 这 ...

  2. Spring源码之Springboot中监听器介绍

    https://www.bilibili.com/video/BV12C4y1s7dR?p=11 监听器模式要素 事件 监听器 广播器 触发机制 Springboot中监听模式总结 在SpringAp ...

  3. C函数 printf 拼接字符串

    C函数 printf 拼接字符串 从前学C语言,最常用的函数可能就是 printf 了,但是往往是这样: printf(年龄是:"%d",a); 由于不懂得怎么拼接字符串,有时候只 ...

  4. ThreadPoolExecutor源码分析-面试问烂了的Java线程池执行流程,如果要问你具体的执行细节,你还会吗?

    Java版本:8u261. 对于Java中的线程池,面试问的最多的就是线程池中各个参数的含义,又或者是线程池执行的流程,彷佛这已成为了固定的模式与套路.但是假如我是面试官,现在我想问一些更细致的问题, ...

  5. FL Studio中echo的延迟作用

    今天来一起研究FL Studio的Echo Delay的作用,Echo Delay可以从MIDI输入创建回声,并允许我们通过音量,声像,切除和共振,音高和时间来操纵延迟. 图1:Echo Dealy ...

  6. 详细了解IDM的“计划任务”功能

    今天我们一起来看看IDM下载器的"计划任务"功能. IDM是什么就不多说了,只需要知道它是一个十分好用的资源下载器就行了,下载速度非常快,搭配一些浏览器扩展程序甚至能加速百度盘的下 ...

  7. 在线思维导图Ayoa共享功能使用教程

    Ayoa是一个制作思维导图的软件,除了导图制作,小编在使用过程中还发现了一些令人惊喜的功能,这些功能使得Ayoa有了更大的亮点以吸引用户. 下面就为大家简单介绍几个小编认为Ayoa中较为实用的共享功能 ...

  8. OCR之前这些因素必须考虑到!

    用久了ABBYY FineReader 14OCR文字识别软件,相信大家都知道图像质量对OCR质量有很大的影响,本文将给大家讲解下在识别图像之前,有哪些因素需要考虑到! 1.OCR语言 ABBYY F ...

  9. linux(cemtos7.x)安装docker

    卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest ...

  10. kafka 消息存储分析

    kafka 可以支持海量数据发送,轻轻松松QPS过十万,如果JVM内存存储这一块如果不够优秀,根本无法支持这么庞大的QPS. 存储架构(这里这是落地数据,并木有涉及到序列化发送数据到broker) R ...