web攻防--PHP反序列化

web攻防–PHP反序列化

漏洞简介

序列化:把对象转换为字节序列的过程,即把对象转换为可以存储或传输的数据的过程。例如将内存中的对象转换为二进制数据流或文件,在网络传输过程中,可以是字节或是XML等格式。

反序列化:把字节序列恢复为对象的过程,即把可以存储或传输的数据转换为对象的过程。例如将二进制数据流或文件加载到内存中还原为对象。
在这里插入图片描述

魔术方法

在Python和PHP中,一般通过构造一个包含魔术方法(在发生特定事件或场景时被自动调用的函数,通常是构造函数或析构函数)的类,然后在魔术方法中调用命令执行或代码执行函数,接着实例化这个类的一个对象并将该对象序列化后传递给程序,当程序反序列化该对象时触发魔术方法从而执行命令或代码。在Java中没有魔术方法,但是有反射(reflection)机制:在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法,这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。一般利用反射机制来构造一个执行命令的对象或直接调用一个具有命令执行或代码执行功能的方法实现任意代码执行

  • 常见得魔术方法
    在这里插入图片描述

在这里插入图片描述

php属性类型

  1. 对象变量属性:
    public(公共的):在本类内部、外部类、子类都可以访问
    protect(受保护的):只有本类或子类或父类中可以访问
    private(私人的):只有本类内部可以使用
  2. 序列化数据显示:
    public属性序列化的时候格式是正常成员名
    private属性序列化的时候格式是%00类名%00成员名
    protect属性序列化的时候格式是%00*%00成员名

漏洞利用

  • POP链构造
    POP:面向属性编程(Property-Oriented Programing)常用于上层语言构造特定调用链的方法,序列化攻击都在PHP魔术方法中出现可利用的漏洞,因自动调用触发漏洞,但如关键代码没在魔术方法中,而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系起来。

  • PHP-绕过漏洞
    CVE-2016-7124(__wakeup绕过)
    漏洞编号:CVE-2016-7124
    影响版本:PHP 5<5.6.25; PHP 7<7.0.10
    漏洞危害:如存在__wakeup方法,调用unserilize()方法前则先调用__wakeup方法,但序列化字符串中表示对象属性个数的值大于真实属性个数时会跳过__wakeup执行

  • 字符串逃逸
    在利用反序列化漏洞过程中,传入序列化数据,假如程序对序列化数据进行关键字过滤,使得序列化数据字符串变长或者变短,便可用字符串逃逸进行绕过。即利用过滤后得关键字产生字符占位进行构造序列化数据。

  • php原生类
    在利用反序列化漏洞时,没有看到魔术类方法,通过具体分析,判断可能使用到哪些魔术方法,通过查看php中内置得魔术方法进行利用。

查看原生类函数脚本

<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
    $methods = get_class_methods($class);
    foreach ($methods as $method) {
        if (in_array($method, array(
            '__destruct',
            '__toString',
            '__wakeup',
            '__call',
            '__callStatic',
            '__get',
            '__set',
            '__isset',
            '__unset',
            '__invoke',
            '__set_state'
        ))) {
            print $class . '::' . $method . "\n";
        }
    }
} 

有些原生类魔术方法需要开启才可以利用,例如__call内置得魔术方法SoapClient需要开启extension=soap
具体利用参考浅析PHP原生类

  • 框架类反序列化利用
    在PHP的各种框架中也存在着反序列化漏洞,但是这些反序列化漏洞利用起来特别困难,需要进行代码审计,并根据审计结果编写poc,难度有点大,于是可以利用一些反序列化工具来为各种框架生成反序列化漏洞利用的payload。例如phpggc,NotSoSecure等,在得知框架版本,查看工具中是否有符合版本漏洞,找到反序列化入口即可。

以上内容仅作学习,如有错误或瑕疵,欢迎批评指正,感谢阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值