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

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

CBC翻转攻击的主要目的:通过损坏密文字节来改变明文字节。(注:借助CBC内部的模式) 通过添加单引号等恶意字符来绕过过滤器,或通过将用户ID更改为admin来提升权限,或者更改应用程序所需的明文的任何其他后果。

加密过程:


上图CBC加密原理图
1:Plaintext:待加密的数据。
2:IV:用于随机化加密的比特块,保证即使对相同明文多次加密,也可以得到不同的密文。
3:Ciphertext:加密后的数据
4:Key:分组加密使用的密钥
这里重要的一点是CBC在一个固定长度的位组上工作,称为块。在本文中,我们将使用每个16字节的块。
整个加密的过程简单说来就是:

  1. 首先将明文分组(常见的以16字节为一组),位数不足的使用特殊字符填充。
  2. 生成一个随机的初始化向量(IV)和一个密钥。
  3. 将IV和第一组明文异或。
  4. 用密钥对3中xor后产生的密文加密。
  5. 用4中产生的密文对第二组明文进行xor操作。
  6. 用密钥对5中产生的密文加密。
  7. 重复4-7,到最后一组明文。
  8. 将IV和加密后的密文拼接在一起,得到最终的密文。

从第一块开始,首先与一个初始向量IV异或(IV只在第一处作用),然后把异或的结果配合Key进行加密,得到第一块的密文,并且把加密的结果与下一块的明文进行异或,一直这样进行下去。因此这种模式最重要的特点就是:前一块的密文用来产生后一块的密文。

解密过程:

解密的过程其实只要理解了加密,反过来看解密过程就也很简单了,同样的,前一块密文参与下一块密文的还原。

  1. 从密文中提取出IV,然后将密文分组。
  2. 使用密钥对第一组的密文解密,然后和IV进行xor得到明文。
  3. 使用密钥对第二组密文解密,然后和2中的密文xor得到明文。
  4. 重复2-3,直到最后一组密文。

下图是为解释翻转攻击的原理图:

这里可以注意到前一块Ciphertext用来产生下一块明文,如果我们改变前一块Ciphertext中的一个字节,然后和下一块解密后的密文xor,就可以得到一个不同的明文,而这个明文是我们可以控制的。利用这一点,我们就欺骗服务端或者绕过过滤器
再解释一下:
根据解密方式我们可以知道,A=ciphertext(N-1),B=plaintext(N),C为第N块待异或且经过解密的字符,C'为我们经过翻转要得到的明文。
所以我们可以打得到关系:

A = B ^ C
C = A ^ B
A ^ B ^ C = 0
A ^ B ^ C ^ C' = C'

根据关系式可以得到:A' = A ^ C ^ C'
所以说我们只需要修改前一组密文所对应的本组明文相同位置的字符,即可得到想要的明文

下面就是关于Bugku的题目
http://118.89.219.210:49168/
这一题属于常规思路,可是不容易想到,我记得以前做过类似的题目,毕竟是萌新总会有很多知识点会忘记(QAQ)
使用备份文件脚本进行扫描就会得到:脚本代码:

[hide]import requests
import sys
url = 'http://118.89.219.210:49168/'
import threading
a = ['bak','zip','rar','tar.gz','txt']
b = ['swp','swo','swn']
c = ['index.php', 'flag.php', 'profile.php','login.php']
s = requests.session()
proxies = {
    'http':None,
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值