搜索
    Hi~登录注册
    查看: 56|回复: 0
    收起左侧

    PHP反序列化漏洞代码审计

    [复制链接]

    26

    主题

    0

    精华

    31 小时

    在线时间

    密圈

    积分
    26
    发表于 2020-5-31 12:20:54 | 显示全部楼层 |阅读模式
    查了点资料,加上自己的一些理解整理

    1、什么是序列化

    A、PHP网站的定义

    所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

    按个人理解就是

    serialize()将一个对象转换成一个字符串,unserialize()将字符串还原为一个对象。
    当然从本质上来说,反序列化的数据本身是没有危害的,用户可控数据进行反序列化是存在危害的

    B、PHP反序列

    php允许保存一个对象方便以后重用,这个过程被称为序列化。为什么要有序列化这种机制呢?在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。试想,如果为一个脚本中想要调用之前一个脚本的变量,但是前一个脚本已经执行完毕,所有的变量和内容释放掉了,我们要如何操作呢?难道要前一个脚本不断的循环,等待后面脚本调用?这肯定是不现实的。因为这样的操作,在小项目还好,在大项目里是极其浪费资源的。但是如果你将一个对象序列化,那么它就会变成一个字符串,等你需要的时候再通过反序列化转换回变了变量,在进行调用就好了,在这样就剩了资源的使用。

    2、理解PHP反序列化漏洞

    PHP类中有一种特殊函数体的存在叫魔法函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。
    而在反序列化时,如果反序列化对象中存在魔法函数,使用unserialize()函数同时也会触发。这样,一旦我们能够控制unserialize()入口,那么就可能引发对象注入漏洞。

    3、PHP反序列化漏洞利用的前提

    a.unserialize()函数的参数可控;
    b.php文件中存在可利用的类,类中有魔术方法

      

    4、PHP反序列化漏洞—发现技巧

    找PHP链的基本思路.
    1.在各大流行的包中搜索 __wakeup() 和 __destruct() 函数.
    2.追踪调用过程
    3.手工构造 并验证 POP 链
    4.开发一个应用使用该库和自动加载机制,来测试exploit。


    5、PHP反序列化漏洞—构造

    exploit思路
    1.寻找可能存在漏洞的应用
    2.在他所使用的库中寻找 POP gadgets
    3.在虚拟机中安装这些库,将找到的POP链对象序列化,在反序列化测试payload
    4.将序列化之后的payload发送到有漏洞web应用中进行测试.

    6、案例分析

    https://www.cnblogs.com/xiaozi/p/7839256.html
    https://www.grt1st.cn/posts/php-unserialize-analysis/



    上一篇:学python得永生python大法好之利用python编写电话轰炸程序
    下一篇:今日校园辅导猫自动填表提交签到

    评分

    参与人数 1网币 +2 收起 理由
    管理00 + 2 感谢发布原创作品,极安中国有你更精彩!.

    查看全部评分

    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 获取账号

    快速回复 返回顶部 返回列表