CBC字节翻转攻击

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 参考文献:http://drops.xmd5.com/static/drops/tips-7828.htmlhttp://p0sec.net/index.php/archives/99/原理:通过损坏密文字节来改变明文字节。

参考文献:http://drops.xmd5.com/static/drops/tips-7828.html
http://p0sec.net/index.php/archives/99/

原理:
通过损坏密文字节来改变明文字节。(借助CBC内部的模式)借由此可以绕过过滤器,或者改变用户权限提升至管理员,又或者改变应用程序预期明文。
加密过程:

img_ec596bedf2c2adc8bd1dfddfb760e685.png
1.png

①Plaintext:待加密的数据。
②IV:用于随机化加密的比特块,保证即使对相同明文多次加密,也可以得到不同的密文。
③Key:被一些如AES的对称加密算法使用。
④Ciphertext:加密后的数据。

CBC工作于一个固定长度的比特组,将其称之为块。。
加密:
Ciphertext-0 = Encrypt(Plaintext XOR IV)—只用于第一个组块
Ciphertext-N= Encrypt(Plaintext XOR Ciphertext-N-1)—用于第二及剩下的组块
前一块的密文用来产生后一块的密文

解密:
Plaintext-0 = Decrypt(Ciphertext) XOR IV—只用于第一个组块
Plaintext-N= Decrypt(Ciphertext) XOR Ciphertext-N-1—用于第二及剩下的组块
Ciphertext-N-1(密文-N-1)是用来产生下一块明文;这就是字节翻转攻击开始发挥作用的地方。如果改变Ciphertext-N-1(密文-N-1)的一个字节,然后与下一个解密后的组块异或,就可以得到一个不同的明文了

一道相关的ctf

<?php
include 'sqlwaf.php';
define("SECRET_KEY", "................");
define("METHOD", "aes-128-cbc");
session_start();

function get_random_iv(){
    $iv='';
    for($i=0;$i<16;$i++){
        $iv.=chr(rand(1,255));
    }
    return $iv;
}
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));
}
function show_homepage(){
    if ($_SESSION["username"]==='admin'){
        echo '<p>Hello admin</p>';
        echo '<p>Flag is *************</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>';
    die();
}
function check_login(){
    if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
        $cipher = base64_decode($_COOKIE['cipher']);
        $iv = base64_decode($_COOKIE["iv"]);
        if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
            $info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
            $_SESSION['username'] = $info['username'];
        }else{
            die("ERROR!");
        }
    }
}

if (isset($_POST['username'])&&isset($_POST['password'])) {
  $username=waf((string)$_POST['username']);
  $password=waf((string)$_POST['password']);
  if($username === 'admin'){
        exit('<p>You are not real admin!</p>');
    }else{
        $info = array('username'=>$username,'password'=>$password);
        login($info);
        show_homepage();
    }
}
else{
  if(isset($_SESSION["username"])){
        check_login();
        show_homepage();
    }
}
?>
<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">
  <title>Paper login form</title>
      <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <div id="login">
  <form action="" method="post">
    <h1>Sign In</h1>
    <input name='username' type="text" placeholder="Username">
    <input name='password' type="password" placeholder="Password">
    <button>Sign in</button>
</div>
</body>
</html>

登录用户名如果为admin则输出flag,但是禁止了admin登录,这里就用到了CBC字节翻转攻击

解题思路
这里把登录的用户名及其密码存入数组,序列化后进行AES-CBC模式的加密,其中iv,和密文以cookie储存,可控。

使用guest登录(因为翻转目标是admin,所以登录的用户名最好也是五位),登录后被存入数组然后序列化变成:
a:2:{s:8:"username";s:5:"skctf";s:8:"password";s:5:"123";},也就是明文
翻转目标为:a:2:{s:8:"username";s:5:"admin";s:8:"password";s:5:"123";}

  • 首先将明文分成16字节的四组:
a:2:{s:8:"userna
me";s:5:"guest";
s:8:"password";s
:5:"123";}
  • 根据CBC攻击原理,只需修改第一组密文对应第二组'guest'的位置的密文,就可以实现第二组明文的改变。即第10-14位。

  • 利用下面脚本重新生成密文

    # -*- coding: utf-8 -*-
    import base64
    cipher = 'HY+D3iO7JAH3cCurQDEG4EzlzTJEt4Irbcl/ahE76/JBU5CmfS/jH5uxwvuGnRIPj1cH+q5fD/3uthlP0zJWrQ=='.decode('base64')
    old = "me\";s:5:\"guest\";"
    new = "me\";s:5:\"admin\";"
    
    for i in xrange(16):
        cipher = cipher[:i] + chr(ord(cipher[i]) ^ ord(old[i]) ^ ord(new[i])) + cipher[i+1:]
    
    print cipher.encode('base64').strip()

根据CBC加密原理,修改第一块的密文可以达到修改第二块密文的效果,但同时也破坏了第一块的明文,接下来就是将第一块的数据恢复。(上面得出的数据一定要进行url编码,同时也要删除username和password的值)
用上面生成的密文修改cookie:cipher得到:


img_1feca01abf0e1d7df161f9aece403b51.png
1.png

获取到第一次翻转后的明文,通过修改IV来修改第一块的明文:


img_ef5042045e03254bb62df77ada1fdc56.png
1.png

利用下面的脚本重新生成iv:

# -*- coding: utf-8 -*-
import base64

plain = 'Kksm2a9vhavRgnlN5bnsJG1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjM6IjEyMyI7fQ=='.decode('base64')
iv = 'm3QrM6HM+MKYWZmfmkUPIQ=='.decode('base64')

old = plain[:16]
new = "a:2:{s:8:\"userna";
for i in xrange(16):
    iv = iv[:i] + chr(ord(iv[i]) ^ ord(old[i]) ^ ord(new[i])) + iv[i+1:]

print iv.encode('base64').strip()

生成新的iv,修改cookie:iv,访问即可获得flag:

目录
相关文章
|
6月前
|
网络协议 网络架构
字节填充与0比特填充以及数据链路的基本问题
字节填充与0比特填充以及数据链路的基本问题
258 0
|
算法 Java 数据安全/隐私保护
AES的256带偏移量、128不带偏移量的加解密算法(PKCS7Padding)
AES的加解密: AES 256加密支持 java中的AES 256算法遇到 Illegal key size or default parameters错的解决办法 解决方法: 测试代码使用jdk1
440 0
密码学的基础:X.690和对应的BER CER DER编码
之前我们讲到了优秀的数据描述语言ASN.1,很多协议标准都是使用ASN.1来进行描述的。对于ASN.1来说,只定义了数据的描述是不够的,它还规定了消息是如何被编码的,从而可以在不同的机器中进行通讯。
密码学的基础:X.690和对应的BER CER DER编码
|
C# 数据安全/隐私保护
RSA不限长度非对称加密解密C#
RSA 分段加解密【解决“不正确的长度”的异常】   RSA 是常用的非对称加密算法。最近使用时却出现了“不正确的长度”的异常,研究发现是由于待加密的数据超长所致。   .NET Framework 中提供的 RSA 算法规定:   待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:RSACryptoServiceProvider.KeySize / 8 - 11),而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:RSACryptoServiceProvider.KeySize / 8)。
1618 0
|
算法 数据可视化 前端开发
记一次HEX和RGB互换算法的思考及应用
由于笔者最近在开发可视化平台,所以对动态编辑器这块做了一段时间的研究, 发现其中有个小模块的知识点比较有意思,所以在这里分享一下.
157 0
|
算法 Java Maven
DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序
DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序
383 0
DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序
【计算机网络】物理层 : 编码 ( 数字数据 编码 数字信号 | 非归零编码 | 归零编码 | 反向不归零编码 | 曼彻斯特编码 | 差分曼彻斯特编码 | 4B/5B 编码 )
【计算机网络】物理层 : 编码 ( 数字数据 编码 数字信号 | 非归零编码 | 归零编码 | 反向不归零编码 | 曼彻斯特编码 | 差分曼彻斯特编码 | 4B/5B 编码 )
646 0
【计算机网络】物理层 : 编码 ( 数字数据 编码 数字信号 | 非归零编码 | 归零编码 | 反向不归零编码 | 曼彻斯特编码 | 差分曼彻斯特编码 | 4B/5B 编码 )
|
小程序 数据安全/隐私保护
小程序使用Base64加密key(秘钥)和iv(偏移量)在进行aes加密,AES加密技术简介与应用。
小程序使用Base64加密key(秘钥)和iv(偏移量)在进行aes加密,AES加密技术简介与应用。
1676 0
小程序使用Base64加密key(秘钥)和iv(偏移量)在进行aes加密,AES加密技术简介与应用。
|
数据安全/隐私保护 Python
CBC 字节翻转攻击记录—以 Bugku 题目为例
博客本文地址:https://www.yourhome.ren/index.php/sec/366.html 经典的CBC字节翻转攻击,还是有必要再通过一篇博文来记录一下的,也是作为一枚菜鸡的备忘录。
1514 0