php反序列化漏洞的认识与学习

php序列化

序列化,即将php对象转换成字符串的一种操作,目的是为了有效地保护对象,并且不丢失其类型和结构

反序列化,即将符合格式的字符串转换为php对象,这个对象的类必须在反序列化之前定义,可以通过包含一个定义该类的文件来完成

序列化后

O:4:”text”:3:{s:10:”textflag”;s:7:”*text”;s:4:”text”;s:5:”text1”;}

String:s

Integer:i

Boolean:b

Null:N

Array:a

Object:o

QQ截图20220219185351.png

魔术方法

  1. __construct() //当对象创建的时候自动调用(但是在unserialize()时是不会自动调用的)
  2. __wakeup()//当unserialize()时自动调用
  3. __destruct()//当对象被销毁时自动调用
  4. __toString()//当反序化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用
  5. __get()//当从不可访问的属性读取数据
  6. __call()//在上下文中调用不可访问方法时触发

__wakeup()绕过

php5<5.6.25

php7<7.0.10

unserialize()会检查一个__wakeup()方法,如果存在,则会先调用—-wakeup()方法,预先准备对象需要的资源

反序列化时,如果对象属性个数值大于真实的属性个数时就会跳过__wakeup()的执行

构造pop链

POP面向属性编程常用于上层语言构造特定调用连的方法,与二进制利用中的面向返回编程的原理相同,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构造一组连续的调用链,最终达到攻击者的目的。