php代码审计之反序列化漏洞

目录

php反序列化

Phar反序列化概要

phar文件的结构:

原生类序列化

Session反序列化

Session反序列化的特殊利用


php反序列化

什么是反序列化?

序列化就是将一个对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。反序列化则相反将字符串重新恢复成对象


serialize()                序列化
unserialize()           反序列化

漏洞原理:
PHP将所有以__ (两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以__为前缀。
常见的魔术方法:

  • __construct()当以个对象创建时被调用
  • __destruct()当一个对象销毁时被调用
  • __toString()当一个对象被当作一个字符串使用
  • __sleep() 在对象在被序列化之前运行
  • __wakeup将在序列化之后立即被调用

PHP类中的特殊属性
序列化为了能把整个类对象的各种信息完完整整的压缩,格式化,也会将属性的权限序列化进去。但不同类型的属性会有不同的格式
1. Public 权限
可以内部调用,实例调用等
2. Private权限                                                  ( test flag)反序列化时会多两个空字节00==>可以传递%00test%00flag进行反序列化
被private修饰的只能是同一个类的可以访问
3. Protected权限                                             ( * test)同样多了两个空字节==>%00*%00test进行反序列化
对继承的类开放,没继承的类不开放

 

Phar反序列化概要


除了unserialize()来利用反序列化漏洞之外,还可以利用phar文件以序列化的形式存储用户自定义的meta-data这一特性,扩大php反序列化漏洞的攻击面。该方法在文件系统函数(file__exists()、 is__dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作。
来自Secarma的安全研究员Sam Thomas发现了-种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞。这个新的攻击方式被他公开在了美国的BlackHat会议演讲上,演讲主题为:”不为人所知的php反序列化漏洞”。它可以使攻击者将相关漏洞的严重程度升级为远程代码执行。我们在RIPS代码分析引擎中添加了对这种新型攻击的检测。

因此可以构造一个恶意的phar包,使得代码能够被反序列化,在使用phar://协议读取文件时,文件会被

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值