首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >php-unserialize反序列化漏洞

php-unserialize反序列化漏洞

作者头像
kam1
发布2022-03-08 13:46:21
发布2022-03-08 13:46:21
1.3K0
举报

unserialize反序列化漏洞相关知识

在了解反序列化漏洞之前,先了解一下php中的序列化。 php中的序列化和反序列化都是通过函数来实现的:

  • 序列化用到serialize
  • 反序列化则是unserialize

序列化(serialize):序列化是将对象的状态信息转换为可保存或传输的字符串的过程 反序列化(unserialize):反序列划就是将字符串转换为对象原本的状态信息。

0x01. 序列化:

以上代码,就是进行序列化的处理 其中:

  • O是指类型object
  • 4是指类名的长度
  • tset是类名
  • 1是指其中的属性数量
  • 花括号里面是整个属性内容,s是指string类型(字符串)
  • 5是指属性名的长度为5
  • s是属性值类型
  • 4是属性值的长度
  • 最后xxba是属性值内容
0x02. 反序列化

以上代码,就是进行反序列化的处理。 从序列化后的结果中恢复对象的状态信息 test类中有一个变量index内容是xxba

0x03. 反序列化漏洞

本质上serialize()和unserialize()在PHP内部实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。 当传递给unserialize()的参数可控时,那么攻击者就可以注入payload,当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

0x04. 魔术方法

php中的魔术方法有很多,如__construct()、__destruct()、 __call() 、__callStatic()、__get()、__set()、__isset()等 主要关注一下几个:

  • __construct():当对象创建的时候自动调用,但在unserialize()的时候不会调用
  • __destruct():当对象被销毁的时候会自动调用
  • __wakeup():unserialize()反序列化的时候会自动调用

代码执行解析:

  • 定义一个类,里面有一个变量还有三个方法。
  • 之后定义一个变量值固定为序列化过后的字符串
  • 输出这个字符串
  • 对$class2这个变量内容进行反序列化
  • 这时候unserialize()会调用test类检查到存在wakeup方法所以就输出了wakeup相关内容
  • 当代码继续执行的时候看见__construct()方法,直接跳过,因为这个方法是对象创建的时候调用的
  • 输出 $class2序列化后的结果中恢复的对象的状态信息
  • 最后当脚本运行结束之前,会调用__destruct()析构函数

靶场实操

打开靶场之后,发现就是一个简单的页面,进入flag.php发现页面是空的,没有任何东西。 那么就只能将这个页面源码 解析一下了,首先看到第一个方法有两个下划线,这里可能是魔术方法,搜索一下,果然是魔术方法。

具体用途是当一个对象被当作字符串对待的时候,会触发这个魔术方法 highlight_file是对文件进行语法高亮显示。

php代码部分解读完毕,其实只有一处能为我们所用,就是第二个判断语句,这样会继续向下执行。 因为在最下面还有一串foreach,所以需要代码执行到最下面,能够满足的只有第二个if语句。

这里就是循环遍历数组,输出反序列化后的对象。 接下来就要想办法让flag.php的内容输出出来,这里就可以利用反序列化,找到反序列化代码段、可控制的点。

这个点很明显就能够满足,我们能够控制cookie传参。 将源码前半段复制到本地,使其进行序列化,但是因为遍历需要是数组才能遍历,所以在发序列化的时候就直接加上一个数组

本地访问,得到序列化后的结果。 当数组遍历的时候会进入__tostring()方法,会输出readme.txt和传递进去的值,因为这里传递的是flag.php所以就会输出flag.php的值。 得到了序列化之后的结果,就需要满足第二个if中的条件,md5(m)=h。

那么将序列化之后的结果进行md5加密:e2d4f7dcc43ee1db7f69e76303d0105c

然后拼接上序列化之后的结果.就是

代码语言:javascript
复制
e2d4f7dcc43ee1db7f69e76303d0105ca:1:{i:0;O:6:“readme”:1:{s:6:“source”;s:8:“flag.php”;}}
 但是因为cookie要经过url,所以需要将这一串字符串url编码一下。
 e2d4f7dcc43ee1db7f69e76303d0105ca%3A1%3A%7Bi%3A0%3BO%3A6%3A%22readme%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • unserialize反序列化漏洞相关知识
    • 0x01. 序列化:
    • 0x02. 反序列化
    • 0x03. 反序列化漏洞
    • 0x04. 魔术方法
  • 靶场实操
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档