文档章节

Padding Oracle攻击

o
 osc_z1hvg4cu
发布于 2018/04/24 20:24
字数 1754
阅读 11
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 

最近在复现LCTF2017的一道题目,里面有一个padding oracle攻击,也算是CBC翻转攻击,这个攻击主要针对CBC加密模式的

 

网上有关这个攻击的博客文章很多,但是其中有一些细节可能是个人的理解不同,或者作者省略了,我这里将我在学习这个攻击中遇到的问题,记录一下

 

之前有写过关于CBC翻转攻击的文章,但是之前的文章是知道了密文和iv的,而且只要翻转一位就可以了(翻转多位也是可以的)

 

现在这个padding oracle攻击是在只知道iv,其他什么信息都不知道的情况下进行的,所以这里我一开始脑袋就绕不过了,我们知道CBC模式的加密是这样子的

 

 

一开始随机生成一个iv,然后将明文的第一块和iv进行异或,然后将第一个加密得到的密文,当作iv进行第二块的加密,然后一直下去

参考了这本书《包帽子将web安全》吴翰清的

里面有说到有一个值是固定的,我们称为middle,在其他文章中都有出现

这个攻击主要就是利用这个值,然后推导出所有的值

因为有下面这个关系

原明文^IV = Middle

新明文^IV = Middle

也就是说只要知道了Middle,那就可以修改原明文了,因为新明文是我们构造的

CBC模式解密的时候,是可以从后面判断解密的,我们这里的加密解密的位数都是16位的。

 

Padding类型

例如我们每一块的长度是16

如果我们的明文是15a

那么进行异或的时候的明文就是

aaaaaaaaaaaaaaa0x01

注意后面的0x01是一个字符,是16进制的

类似的,如果我们的明文是8a

那么进行异或的明文就是

Aaaaaaaa0x080x080x080x080x080x080x080x08

按照这样的规律,我们就可以向服务器提交一些数据,然后让服务器自动解密,如果可以解密,那就是最后一位或几位的padding值了。

这个过程就好像sql注入的盲注

 

 

例如上的例子,我们知道可控的是token(也就是IV),其他参数都是未知的,

当我们提交token的时候,程序就会自动解密,这里就有3种情况:

1、token长度不对,无法解密,服务器会报错提示

2、token可以解密,但是解出来的不是原来的明文

3、token完全正确,出现正确的明文

根据上面几点,我们就可以利用了,只要我们判断服务器不出错,程序可以解密,那就是最后的一位或几位是对的,那就可以知道我们虚拟出来的iv值,配合上我们虚拟出来的明文,就可以得到正确的Middle(因为Middle是不变的,每一次会话的Middle是一样的)

 

例如:Middle未知,明文未知,iv可控   (都是16进制的)

因为 Middle[15] = 明文[15]^iv[15]

我们要知道Middle值,我们虚拟Middle只有15位长度,那最后一位肯定就是0x01了,

Middle不需要知道,因为它在服务器里面,我们只要输入iv,解密函数就会自动调用了, 假如我们输入iv的值为00000000000000000000000000000065

那我们就知道了Middle的最后一个值了,也就是Middle[15] = (0x65)^(0x01),这个值是固定的。

接着求Middle[14],我们假设明文只要14个值,那么最后两位的值就是0x020x02,用16进制,因为明文改变了,那么相应的iv也要改变,也就是按照上面那个iv是不行的,所以,这里要重新计算iv值,这里要padding的值有两个,也就是要知道iv的后两位,倒数第一位可以根据上面的公式得到, iv[15] = Middle[15]^(0x02)

iv倒数第二个值是我们要得到的,继续按照上面的方式,爆破倒数第二个值,只要服务器不出错,能解密那就是正确了,得到第二个值,也就是得到了Middle的倒数第二个值,重复上面的步骤,就可以得到全部的Middle

但是我们的的明文不可能是空值,所以最起码明文的第一位我们是要猜的,也就是Middle的第一位,我们只能通过爆破得到。

 

得到了Middle的后15位,如果我们要将原明文解密出我们想得到的数据,

那根据公式

原明文^IV = Middle

新明文^IV = Middle

原明文 = 新明文^IV^IV

我们只要输入新IV,那解出来的就是一个新的明文,而且还是我们构造的新明文。

 

下面拿一个例子结合代码详细分析:

 

 

 

<?php
error_reporting(0);
define("SECRET_KEY", "******"); //key不可知
define("METHOD", "aes-128-cbc");
session_start();

function get_random_token(){
    $random_token = '';
    $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    for($i = 0; $i < 16; $i++){
        $random_token .= substr($str, rand(1, 61), 1);
    }
    return $random_token;
}

function get_identity(){
    $id = '***'; //原明文不可知
    $token = get_random_token();
    $c = openssl_encrypt($id, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $token);
    $_SESSION['id'] = base64_encode($c);
    setcookie("token", base64_encode($token));
    $_SESSION['isadmin'] = false;
}
function test_identity(){
    if (isset($_SESSION['id'])) {
        $c = base64_decode($_SESSION['id']);
        $token = base64_decode($_COOKIE["token"]);
        if($u = openssl_decrypt($c, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $token)){
            if ($u === 'admin') {
                $_SESSION['isadmin'] = true;
            }
        }else
            echo "Error!";
    }
}
if(!isset($_SESSION['id']))
    get_identity();
test_identity();
if ($_SESSION["isadmin"])
    echo "You are admin!";
else
    echo "false";
?>

(

这个例子是拿

http://f1sh.site/2017/08/04/%E5%88%9D%E5%AD%A6padding-oracle-attack/ 

源码大致流程是

1、get_identity();

 

生成一个token,然后作为加密算法的IV进行对明文加密,这里的明文是不知道的,然后就是set-cookie

 

2、test_identity();

进行解密,然后判断解出来的明文是什么,如果是admin,那就设置

$_SESSION['isadmin'] = true;

 

3、if ($_SESSION["isadmin"])

如果正确,那就输出You are admin

否则输出false

 

这里可以知道token的值是可控的,根据我们上面的分析,我们是可以控制token(也就是IV)使得解出任意的明文的

按照上面的流程走一遍

Python代码编写

 

先拿到

PHPSESSID和token值

 

 

然后构造token发送给服务器

先构造15个零,最后一位爆破

 

 

得到我们构造的IV的最后一位,3e,然后相对应的Middle值就是

 

 

然后到将middle值记下来继续倒数第二个值

我们要构造14个零,倒数第二位是爆破的,最后一位可以算出来

 

 

然后继续跑代码

 

 

可以看到已经页面显示为false,没有Error,也就是可以知道后两位的Middle了,依次,可以得到我们所要知道的后15Middle

完整代码跑出来的结果

 

 

 

在浏览器中使用相同的sessiontoken访问

 

 

可以看到已经成功登陆进来了

 

详细代码可以参考我的GitHub:https://github.com/niechaojun/Padding_oracle

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
浅谈这次ASP.NET的Padding Oracle Attack相关内容

上一周爆出了一个关于ASP.NET的安全漏洞,有关这个漏洞的第一篇文章应该是ScottGu的说明,但是其中各方面谈的也是语焉不详。由于这个漏洞关系到“安全”这样敏感的话题,其中又涉及到密码学这...

老赵点滴 - 追求编程之美
2010/09/25
0
0
AES CBC模式下的Padding Oracle解密

AES CBC模式下的Padding Oracle解密 AES CBC模式下的Padding Oracle解密 目录 1. 简介 2. aes cbc加解密测试程序 3. Padding Oracle Attack过程 4. 总结 1 简介 Padding Oracle攻击方法出现的...

osc_qn2c8ls7
2019/06/18
11
0
利用OAM加密缺陷漏洞构造任意用户身份测试

  SEC Consult 团队发现了 Oracle Access Manager (OAM) 上的一种有意思的加密格式,本文中,我们将演示如何用这种加密方式的微小特性改变来对实际产品的安全性产生影响。最终,利用这种安...

FreeBuf
2018/05/20
0
0
HTTPS 协议降级攻击原理

原博客:http://blog.jobbole.com/106792/ 在传统流行的web服务中,由于http协议没有对数据包进行加密,导致http协议下的网络包是明文传输,所以只要攻击者拦截到http协议下的数据包,就能直...

osc_8dm0sbbd
2018/01/09
2
0
百度安全实验室提醒您:连接千万条,安全第一条;加密不认证,亲人两行泪。

保护互联网连接安全的TLS又双叒叕出事了,本次的漏洞由Tripware的安全研究员Craig Young发现 [1],由于攻击方式类似2014年的POODLE漏洞,此次的两个新漏洞被命名为“Zombie POODLE”和“GOL...

百度安全
2019/02/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈对python pandas中 inplace 参数的理解

这篇文章主要介绍了对python pandas中 inplace 参数的理解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否...

Linux就该这么学
29分钟前
20
0
C++ 从基本数据类型说起

前言 int 在32位和64位操作系统,都是四个字节长度。为了能编写一个在32位和64位操作系统都能稳定运行的程序,建议采用std::int32_t 或者std::int64_t指定数据类型。*与long随操作系统子长变...

osc_sxdofc9c
29分钟前
9
0
游戏音乐的作用以及起源

游戏音乐是由特殊的音乐、语言符号、美学符号组成,在电子游戏的发展下,游戏音乐越来越成熟,游戏音乐与美术相融合,能够带给玩家视觉与声音的感官冲击,形成游戏音乐所具有的独特的审美效果...

奇亿音乐
30分钟前
10
0
2020,最新Model的设计-APP重构之路

很多的app使用MVC设计模式来将“用户交互”与“数据和逻辑”分开,而model其中一个重要作用就是持久化。下文中设计的Model可能不是一个完美的,扩展性强的model范例,但在我需要重构的app中,...

osc_mfzkzkxi
30分钟前
4
0
面对职业瓶颈,iOS 开发人员应该如何突破?

我们经常看到 iOS 开发人员(各种能力水平都有)的一些问题,咨询有关专业和财务发展方面的建议。 这些问题有一个共同点:前面都会说“我现在遇到了职业困境”,然后会问一些诸如“我是否应该...

osc_gfpedeca
31分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部