PHP反序列化漏洞

PHP反序列化漏洞

  • PHP类与对象
  • magic方法
  • PHP序列化与反序列化
    • 序列化serialize
    • 反序列化unserialize
  • PHP反序列化漏洞
  • Typecho反序列化漏洞
    • 源码分析
    • POC编写
    • 漏洞复现
  • PHP反序列化漏洞防御

PHP类与对象

  • 类Class
    一个共享相同结构和行为的对象的集合
  • 对象Object
    对象是类的实例,用关键字new创建对象
  • 方法Method
    方法是依赖于类存在的,只能通过对象调用(类的静态方法能够通过类名直接调用)

magic方法

当满足一定条件时会自动调用

方法 作用
__construct() 对象创建时触发
__destruct() 对象销毁时触发
__toString() 对象被当成字符串时触发
__sleep() 调用serialize()时触发
__wakeup() 调用unserialize()时触发
__call() 调用不可访问的方法时触发
__callStatic() 静态方式中调用不可访问的方法时触发
__get() 从不可访问的属性读取数据时触发
__set() 将数据写入不可访问的属性时触发
__isset() 对不可访问的属性使用isset()或empty()时触发
__unset() 对不可访问的属性使用unset()时触发
__invoke() 对象被当成函数时触发

PHP序列化与反序列化

序列化与反序列化的作用:传输对象,用作缓存(Cookie、Session)

序列化serialize

序列化是将对象转换为字符串,不保存类中的方法。对字母大小写和空白(空格、回车、换行等)敏感,序列化后的内容是字节流格式

  • 序列化格式
    json字符串 json_encode、xml字符串 wddx_serialize_value、二进制格式、字节数组

私有成员变量序列化后的变量名为:%00类名%00私有成员变量名

反序列化unserialize

反序列化是将字符串恢复成对象,如果对象没有预定义,反序列化得到的对象是__PHP_Incomplete_Class,如果传递的字符串不可以反序列化,则返回FALSE

PHP反序列化漏洞

PHP反序列化漏洞又称对象注入,可能导致远程代码执行等安全问题

  • 漏洞成因
    unserialize函数参数可控,包含的PHP类中定义的magic方法或其他方法里有可控的危险操作
  • 利用方式
    反序列化出对象,修改成员变量的值,达到操作其他文件或者执行命令的目的

Typecho反序列化漏洞

漏洞影响Typecho 1.1(15.5.12)之前的版本

源码分析

  1. intall.php中GET方式传入finish参数且存在config.inc.php文件时,用Typecho_Cookie类get方法从COOKIE或POST获取参数__typecho_config的值,base64解码后进行反序列化存入config,创建Typecho_Db对象参数为config数组中adapter的值
    PHP反序列化漏洞_第1张图片
  2. 查看Db.php中Typecho_Db类的__construct方法,adapter的值传入adapterName,对adapterName进行了字符串拼接操作,如果adapterName的值是对象,则会触发对象所在类的__toString方法
    PHP反序列化漏洞_第2张图片
  3. 查看Feed.php中Typecho_Feed类的__toString方法,在成员变量_type的值与常量RSS2的值相等时,如果item数组author的值是对象,则访问对象所在类中不存在的属性screenName时会触发__get方法
    PHP反序列化漏洞_第3张图片
  4. Request.php中Typecho_Request类的__get方法调用了get方法,成员变量_params[screenName]的值赋给value,value值传入_applyFilter方法
    PHP反序列化漏洞_第4张图片
    _applyFilter方法中获取_filter数组的内容,不是数组则传入call_user_func(回调函数,参数),filter和value的值都可控
    PHP反序列化漏洞_第5张图片

POC编写

system调用计算器
PHP反序列化漏洞_第6张图片

漏洞复现

install.php中有跨站请求拦截,此处本地搭建就没加Referrer。提交数据成功弹出计算器
PHP反序列化漏洞_第7张图片

PHP反序列化漏洞防御

  • 对用户输入的内容过滤
  • 针对unserialize和Magic函数审计
  • 白名单,限制反序列化的类,不能动态传参

你可能感兴趣的:(常见漏洞,安全,php)