博客本文地址:https://www.yourhome.ren/index.php/sec/366.html

经典的CBC字节翻转攻击,还是有必要再通过一篇博文来记录一下的,也是作为一枚菜鸡的备忘录。

0x01 CBC加密流程

CBC加密的特性,简述来说:
明文首先被分割成等长的若干个明文块,每个明文块将作为下一个明文块加密过程中输入的一部分,从而影响到下一个明文块的加密结果。在一般情况下,明文会被分成等长的16字节的明文块,不足16字节部分,会用特殊填充符填充,图示如下:

snipaste20180604_165300.png

这其中有一个重要输入IV,是随机生成的初始向量,它影响第一个明文块的结果,并且将传递到整个加密链中,以保证对同一明文每次的加密结果都是不同的。

需要注意的是,CBC模式中涉及到的异或运算,是本次进行CBC翻转攻击的关键所在。

0x02 CBC翻转攻击利用点

类似于CBC加密的过程,CBC解密的过程也是将当前的密文块作为下一个密文块参与运算的输入,具体如图:

snipaste20180604_173055.png

假设我们修改了第一个密文块的第4个字节,那么根据CBC模式的解密,它将影响下一个密文块的解密结果,如图标红部分:

snipaste20180604_173204.png

而在上述的影响过程中,只涉及到异或运算,这里异或运算的特性就十足重要了!

已知A=B^C
可以得到结论B=A^C
并且也能得到A^C^B=0

上述结论拿到这里的CBC翻转攻击假设中看

设第一块的第4个字节设为变量A,第二块的明文中第4个字节设为变量C,在第二块加密产生的第4个字节设为变量B
因为A^B=C,根据结论有B=A^C
如果人为将A变量值改变为A^C的结果,那么参与运算后A^B将等于A^C^B=B^B=0,第二个产生的明文的第4个字节将变为0
如果将A变量值改变为A^C^X(这里X是任意字符),那么参与运算后,A^B将等于A^C^X^B=B^X^B=X,第二个产生的明文的第4个字节将变为X字符,这样,第二块密文块解密的结果就可控了!

上面这个简单的阐述,就是CBC翻转攻击实现的核心,下面以实例来继续说明。

0x03 Bugku的例题

题目名称:Login4
题目地址:http://118.89.219.210:49168/

访问题目是一个登陆界面:

snipaste20180604_170922.png

先直接扔到扫描器,找到备份文件:

snipaste20180604_171107.png

这里也推一波自己也日常用的CTF扫描器scanCTF:
https://github.com/MRdoulestar/scanCTF

拿到源码进行代码审计,这里列出主要逻辑代码(已给出注释):

//设置cookie的流程调用的函数,返回一个随机的iv和使用该iv加密的post提交的username和password的结果——cipher
function login($info){$iv = get_random_iv();$plain = serialize($info);$cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);$_SESSION['username'] = $info['username'];setcookie("iv", base64_encode($iv));setcookie("cipher", base64_encode($cipher));
}//检查函数,这里是对cookie中cipher和iv进行CBC翻转的利用点
function check_login(){//如果cookie中设置了cipher和iv参数if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){//将cipher和iv参数都进行base64解码$cipher = base64_decode($_COOKIE['cipher']);$iv = base64_decode($_COOKIE["iv"]);//进行CBC模式的AES解密if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){//对解密结果进行反序列化,设置session中的username为反序列化后数组中的username的值$info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");$_SESSION['username'] = $info['username'];}else{die("ERROR!");}}
}
//根据session中username参数,控制显示结果
function show_homepage(){//如果session中的username为admin,则返回flagif ($_SESSION["username"]==='admin'){echo '<p>Hello admin</p>';echo '<p>Flag is $flag</p>';}else{echo '<p>hello '.$_SESSION['username'].'</p>';echo '<p>Only admin can see flag</p>';}echo '<p><a href="loginout.php">Log out</a></p>';
}
//检查是否带有username和password参数,如果有参数,进入设置cookie的路径
//如果没有设置参数,进入判断cookie路径
if(isset($_POST['username']) && isset($_POST['password'])){$username = (string)$_POST['username'];$password = (string)$_POST['password'];//不允许提交的username为adminif($username === 'admin'){exit('<p>admin are not allowed to login</p>');}else{$info = array('username'=>$username,'password'=>$password);login($info);show_homepage();}
}else{//如果session中的username字段已经存在了,既登陆过了,则进入if(isset($_SESSION["username"])){check_login();show_homepage();}else{.................}

以上代码考察了CBC翻转攻击的利用。它禁止直接提交用户名为admin进行登陆,但是返回flag的条件又是session中用户名要是admin。所以需要构造类似"xdmin"形式或者"axmin"等形式的用户名,之后通过修改iv和cipher,通过CBC翻转攻击将字符x还原成"admin"

代码中涉及到了序列化,数组序列化结果参考如下(这里使用ydmin和123作为username和password):
a:2:{s:8:"username";s:5:"ydmin";s:8:"password";s:3:"123"}

攻击过程如下:

1、修改能够得到的密文的第一块(前16个字节),使得第二块密文块结果的字符中ydmin能变成admin
2、由于操作1导致第一块密文块解密后得到错误结果,修正IV初始化向量,将第一块的明文结果还原成a:2:{s:8:"userna

攻击实现Python脚本:

#!/bin/env python
import base64
import urllib
import requests
import resession = "uubpkpbv56dtkiorccjc8md3r0"
cipher = "gn5OKkTDH1CXJv9w11bK7JEqnhzhGSzVs84FNwZ2Zfi1c1PEeQdF1jUXn2lIy3SInj8pJiVajWEF73Fl%2BgLThA%3D%3D"
iv = "PGUt3F%2FPwu93r7DGTBQvKg%3D%3D"#进行url编码解码和base64解码操作
iv_raw = base64.b64decode(urllib.unquote(iv))
cipher_raw = base64.b64decode(urllib.unquote(cipher))
#a:2:{s:8:"username";s:5:"ydmin";s:8:"password";s:3:"123"}#计算修正cipher,使得第二块的y可以变成a(原理回顾上述异或结论)
cipher_new = cipher_raw[0:9] + chr(ord(cipher_raw[9]) ^ ord('y') ^ ord('a') )  + cipher_raw[10:]
cipher_new = urllib.quote(base64.b64encode(cipher_new))
print cipher_new
#########################################################
#拿新的cipher作为cookie访问,拿到继续修正iv的数据
url="http://118.89.219.210:49168/index.php"
cooky={"iv":iv,"cipher":cipher_new,"PHPSESSID":session
}
#这里本地测试,使用了Burpsuit代理
proxy={"http":"http://192.168.155.1:8082"
}
x = requests.session()
res = x.get(url, cookies=cooky, proxies=proxy)
text = str(res.text)
#print text
########################################################
#使用正则提取目前cipher解密后的结果(第一块损坏)
prog = re.compile("decode\('(.*)'\)")
match = prog.search(text)
new_plain = ""
if match:new_plain = match.group(1)
#print new_plain
new_plain = base64.b64decode(new_plain)
########################################################
#对iv进行修正,使得新的iv可以使得第一块密文块解密得到正确结果
real_first_blk = 'a:2:{s:8:"userna'
iv_new=""
for i in range(0,16):iv_new += chr(ord(iv_raw[i]) ^ ord(new_plain[i]) ^ ord(real_first_blk[i])) print urllib.quote(base64.b64encode(iv_new))

最终得到计算得到的cipher和iv:

root@dbstar-virtual-machine:~# python cbc_cipher.py
gn5OKkTDH1CXPv9w11bK7JEqnhzhGSzVs84FNwZ2Zfi1c1PEeQdF1jUXn2lIy3SInj8pJiVajWEF73Fl%2BgLThA%3D%3D
WsHICjaxJEd2co8CBheYAA%3D%3D

访问即可:

snipaste20180604_212751.png

0x04 总结和参考

CBC翻转攻击的文章和博客已经很多了,但不亲手实现配合着写一篇,仍然觉得不能彻底掌握,因此有了这篇文章,也是自己的一个备忘录。
如有不足和不对的地方,还请指出和谅解。

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

CBC 字节翻转攻击记录—以 Bugku 题目为例相关推荐

  1. CTF-Web1-(涉及cbc字节翻转攻击,难度大)

    实验吧平台维护到现在一直都还没维护好,我的好多松果都凉凉了,现在到了暑假特意把以前做过的题翻来重新写成博客,主要的目的是为了学习做题的思路,当然还有的题当时不会做,也不懂原理,经过一年多的学习,也了解 ...

  2. bugkuctf–login4字节翻转攻击

    题目地址:http://118.89.219.210:49168/ 字节翻转攻击原理:http://www.anquan.us/static/drops/tips-7828.html http://w ...

  3. CBC翻转攻击与实验吧CTF例题:简单的登录题

    CBC翻转攻击原理: 我认为,要更好更快的理解CBC翻转攻击,认识它的原理以及必要的密码学知识是必不可少的. 所以我们先离开题目,从密文的加密与解密说起: 下图是 密文加密过程: vi: 是用于随机化 ...

  4. 服务器遭到newinit.sh木马挖矿攻击记录

    服务器遭到newinit.sh木马攻击记录 一.中毒现象(Redis后门漏洞导致服务器被注入挖矿脚本解决) 服务器负载异常,具体表现load值冲高 服务器部分命令不可用,如top.ps.pstree. ...

  5. 基于Python模仿流量攻击的方法对字节编码攻击

    基于Python模仿流量攻击的方法对字节编码攻击 一.总目标 NIDS 配置:FE(bytes encoding)+ ML(textCNN) 二.PGA(FE knowledge==100%) 2.1 ...

  6. c语言趣味教学题目及答案,C语言趣味程序设计-题目百例.doc

    C语言趣味程序设计-题目百例 Contest - 2011级C语言课程大作业Start Time: 2012-02-19 16:25:00 End Time: 2012-03-01 22:00:00C ...

  7. 创新创意springboot计算机毕业设计题目300例,总有你需要用到的!

    创新创意springboot计算机毕业设计题目300例,总有你需要用到的! 计算机专业毕业设计题目该怎么样选题呢,计算机专业的毕业设计有许多课题可以选择,假如你想要获得比较好的分数成绩的话,或者是想要 ...

  8. 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化

    背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...

  9. 教育管理论文参考题目50例

    本文是教育管理论文题目,笔者为大家收集了教育管理专业最新论文题目50例,希望为大家的教育管理论文选题提供参考. 1 农村初中班级个性化管理的理论探究与实践探索 --以S中学为例 2 幼儿园" ...

最新文章

  1. 数据库_数据库篇-第一章:数据库基本概念
  2. 分布式思想和rpc解决方案介绍
  3. python书籍推荐知乎-python入门书籍(爬虫方面)有哪些推荐?
  4. android恶意代码检测报告,用机器学习检测Android恶意代码
  5. Linux输入密码接口,Linux下搭建接口自动化测试平台
  6. 个人开发者福利:没有注册公司,如何发布自己的小程序
  7. [转载] python中sort()与sorted()
  8. java实现jsp转pdf,使用Java生成Pdf文档-JSP教程,Java技巧及代码
  9. Hive安装超详细教程
  10. 面食有哪些 面食的种类大全
  11. php5.6 oracle11,解决ORA-16055: FAL request rejected
  12. 史上最全因果推断合集-uplift
  13. Stata: 协整还是伪回归?
  14. 《机器学习》课后习题 3.4 选择两个 UCI 数据集,比较 10 折交叉验证法和留 法所估计出的对率回归的错误率.
  15. 查看windows系统许可证过期日期方法
  16. form表单用butten提交后无反应表单提交三种方式
  17. 7-1 求一元二次方程的根 (20 分)
  18. 小白初写Spring核心容器功能
  19. python双星号是什么意思_Python字典前双星号(**)的作用
  20. 2021年中式烹调师(初级)考试及中式烹调师(初级)模拟考试题

热门文章

  1. C13-COBOL 文件处理动词
  2. 七月的风,八月的雨,卑微的我喜欢遥远的你。
  3. 【神兵利器】你是否也想生成这样有逼格的代码图?
  4. ucsd大学音乐计算机,音乐留学│综合名校UCSD音乐制作专业详解!
  5. 电脑水冷风扇转速太高怎么调?
  6. MVC发布出现:未能将文件bin\xxx.xml 复制到 obj\Release\PackageTmp\bin\xxx.xml,未能找到文件
  7. 【已解决】java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class or
  8. java.exe内存占用高_windows java.exe内存暴涨解决、idea跑java\ tomcat内存无限增长
  9. 顶会速递 | ICLR 2020录用论文之元学习篇
  10. 猜数字小游戏(原创)