首页 > 技术文章 > 攻防世界 serialize3

r1kka 2021-09-22 23:14 原文

根据题目serialize3可知,这是一道关于反序列化的题,打开靶场环境

 

 

首先进行代码审计

代码中存在一个magic函数__wakeup(),执行该函数后会退出并返回"bad requests"。结合后面的?code=,我们的目的应该是构造URL去绕过__wakeup()

因为在执行unserialize()函数时会自动调用__wakeup(),假如我们直接对类进行序列化后传参给code,页面返回"bad requests"时,说明进行了反序列化操作

 

 

 

 

 

 此时直接构造payload:?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";}

 

 

果不其然进行了反序列化操作,此时我们要做的就是想办法绕过__wakeup()

这里就需要提到一个知识点:当序列化字符串当中属性个数值大于实际的属性个数时,就会导致反序列化异常,从而绕过__wakeup()

这里还需要对序列化的格式进行一下说明

 

 

比如:O:4:"xctf":1:{s:4:"flag";s:3:"111";} ;表示序列化的是对象,被序列化的类名为"xctf",长度为4;被序列化的对象属性个数为1;属性名为"flag",长度为4,数据类型为s(字符串类型);属性值为"111",长度为3,数据类型为s

常见的属性的数据类型有:b:boolean、i:integer、d:double、s:string

所以我们只需要将被序列化的对象属性个数改为比1大的数便可进行绕过

payload:?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}

 

 

 

 

关于php中的序列化与反序列化:

php提供serialize()来进行序列化操作,unserialize()来进行反序列化操作

tips:①当属性为private时,会在类名两侧加上空字节,可在空字节处加上%00防止丢失

         ②序列化对象只会序列化对象中的属性值,不会序列化其函数

magic方法:

形如__wakeup(),__construct(),__destruct()以两个下划线开头的方法称为magic方法。在一定条件下有特殊功能

与序列化和反序列化有关的magic方法

 

php反序列化漏洞:

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

产生原因:如果一个php代码中使用了unserialize函数去调用某一类,该类中会自动执行一些自定义的magic方法,这些magic方法中如果包含了某一些危险的操作,或者这些magic方法会去调用类中带有危险操作的函数,如果这些危险操作时我们可控的,那么就可以进行一些不可描述的操作了。

 

 

参考文章:https://blog.csdn.net/silence1_/article/details/89716976

 

 

推荐阅读