PHP反序列漏洞原理与实操-WEB安全社区-弘客官方【交流区】-弘客联盟

PHP反序列漏洞原理与实操

这一期我们来说一下php反序列

首先我们来说一下什么是反序列什么是序列化

在我们说到序列化之前还要说一下什么是面向对象,什么是类于对象

在php语言中定义一个类可以是类似于这样

d2b5ca33bd162207

 

可以看到,这个对象里面有一个成员变量,两个成员函数,其中两个成员函数的属性都是public成员变量的属性是protected

在php中有这些反序列和序列化的函数

d2b5ca33bd164920

这些函数可以改变php中的类与对象的数据结构,说白了,序列化就是将一个对象以一串二进制字符串来表示,反序列化就是将一个二进制字符串变成一个对象

值得注意的是,序列化后的对象,是不包含成员函数的,也就是说序列化后的对象,只会包含成员变量

反序列化绕过小Trick

php7.1+反序列化对类属性不敏感

我们前面说了如果变量前是protected,序列化结果会在变量名前加上\x00*\x00

 

但在特定版本7.1以上则对于类属性不敏感,比如下面的例子即使没有\x00*\x00也依然会输出abc

 

d2b5ca33bd162355

 

d2b5ca33bd163328

 

绕过__wakeup(CVE-2016-7124)

版本:

 

​ PHP5 < 5.6.25

 

​ PHP7 < 7.0.10

 

利用方式:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行

 

对于下面这样一个自定义类

 

d2b5ca33bd162111

 

d2b5ca33bd163453

 

下面我们来看实例

d2b5ca33bd160903

 

这一题是我之前就已经做出来过的,拿这一题来举例

d2b5ca33bd160918

 

打开后,我们可以直接看到,这一段php源代码

PHP反序列化漏洞:执行unserialize()时,先会调用__wakeup()。

当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常,从而跳过__wakeup()。

我们可以看到xctf类只拥有一个public的flag变量,值为111,public属性序列化后的格式为:数据类型,属性名长度,“属性名”数据类型:属性值长度:“属性值”。

d2b5ca33bd163603

 

通过url进行get传参就可以得到flag

d2b5ca33bd160937

 

题目来自攻防世界

Web类题目,flag都不一样,自己试试吧

请登录后发表评论

    没有回复内容