反序列化漏洞

序列化基础知识

序列化:将一个对象转化成字节流 | 反序列化:将字串字符流还原成对象

php中用 serialize() 实现序列化 , 用unserialize()反序列化

例如序列: O:7:"Student":1:{s:4:"name";s:8:"deelmind";}

在属性各种类型的属性名被序列化的时候

protected属性被序列化的时候属性值会变成%00*%00属性名

private属性被序列化的时候属性值会变成%00类名%00属性名

  • 变量类型:7位字符(类名长度):"类名名称":属性数量:

image-20200908213723363.png

反序列化漏洞:利用系统在调用unserialize()的时候会触发魔法函数 ,而如果这些魔法函数中包含一些比较危险的函数,而这个危险函数里面参数是我们可控的,那我们就可以精心构造一个序列 ,让它反序列化(反序列化过程中对一些参数赋值),达到攻击效果。

__construct():当对象创建(new)时会自动调用。(构造函数)

__destruct():当对象被销毁时会自动调用。(析构函数)

__wakeup():unserialize() 时会自动调用。

__sleep():serialize()时会自动调用

__tosting(): 把类当作字符串使用时触发

__get(): 用于从不可访问的属性读取数据

invoke():当把一个类当作函数使用时自动调用

类型一:普通反序列化漏洞

反序列化漏洞题目:https://www.freebuf.com/column/151447.html

该类题型是结合 --伪协议php://input (post传参)来满足题目条件--存在include()文件包含,用php://filter 来读取服务器上的php文件--最后一个参数才涉及到反序列化漏洞

类型二:绕过wakeup()函数的反序列化漏洞

image-20200909171227388.png

绕过_wakeup():将属性数量设置为比真实属性数量大,就不会执行_wakeup()函数

类型三:Session反序列化漏洞:

原理是利用php中存储session不是存储在内存中的,而是存储成文件的,而存储方式有下面三种。

对于session存储image-20200909210825340.png

的时候,会将其序列化,利用这个php存储session的特殊的序列化产生漏洞。

php中存储session方法

image-20200909203249781

各种处理方式对应的session格式

"php":

image-20200909203249781.png

"php_binary":

image-20200909203803161.png

"php_serialize":

image-20200909203342687.png

image-20200909211240444.png

博客讲解 :https://blog.csdn.net/nzjdsds/article/details/82703639?utm_source=app

类型四:反序列化字符逃逸

类型题目:[安洵杯 2019]easy_serialize_php

原理:在一个序列x:x{xxxxx} 花括号的后面添加字符后不会改变本来反序列后的结果,因此可以精心构造序列化的属性,利用闭合关系改变本来题目的属性(或者说使后面的某些属性无效)

1.按正常需求填入参数 先弄出序列

2.从‘将被替换成空的变量’后面的引号开始往后一直数到下一个属性分号之前(主要数出来的数最好是被替换字符的整数倍,如flag的四倍24等)

3.根据上面将变量修改后 先序列化出来看看

  1. 在后面增加属性值(确保和原本题目序列化后数量一样
posted @ 2020-09-14 23:31  cjz12138  阅读(573)  评论(1)    收藏  举报