Day 11 - Pumpkin Pie -- 反序列化漏洞
这源码考的是php的反序列化漏洞
所谓的反序列化漏洞就是将一个对象进行序列化变成一个字符串,当这个字符串被反序列化的时候,如果这个字符串里面对应的对象的一些参数变化了,那么当再一次调用这个对象这个参数的时候,那个参数就会被改变成字符串所构造的那个数据。
一般来说,反序列化的漏洞都是由魔术方法导致的
常见魔术方法有:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
解析得有点拗口,拿代码来解析一下
可以看到,这里是将对象当字符串输出了,所以会执行__toString()魔术方法
输出a
改一下代码
这里执行了反序列化函数
可以看到这里的序列是一个对象,对象名为Demo 参数file的值为wowowo
如果执行这个就会输出 wowowo
因为这个序列一旦被反序列出来,就会成为一个对象,而这个被当成字符串使用,那么就会执行源码里面的__toString()方法
其他的魔术方法使用都大致一样
说白了就是,序列化一个相同的对象,但是里面的参数的值改变了,当源码中将这个序列返回成一个对象之后,如果源码再一次调用那个参数,那么就可以改变那个参数的值,相当于是重新赋值了
有了上面的知识,再去看这道题的源码
源码目的就是将$cachefile的值作为文件名,$template的值作为文件内容,保存为一个文件
保存文件的方法是:
这个方法是在代码结束之前执行的
而且代码中还有反序列化函数
那么思路就清晰了,
执行这个反序列化函数,生成一个对象,然后程序注销之前调用了createCache()
生成文件,文件名和文件内容都是可控,那么就可以生成任意文件了
下面就是构造序列了,绕过什么的,等下再解决
正常构造:
写一个class ,名字和源码的class要对应,然后要改变什么参数,就写进去,然后将这个对象序列化
但是这样子是不行的,因为源码里面有限制
有两个限制,第一个限制,前面两位不能是0:
但是一个对象序列化出来的就是0:
这里好绕过,这个对象用一个array() 括起来就好了,
第二个限制,进行正则匹配,0: 后面不可以是数字
这里在8前面加一个+号就可以
那么全部都可以了
将生成的序列,填写进cookie里面,发送过去
检查一下文件是否有生成,发现没有生成
这时还有一个知识点
那就是cookie的值,不可以有分号(;)
分号后面的不见了
可以用url编码
然后得到编码后的,注意要在8前面加上 + , + 的url编码是%2b
刷新一下,就会发现文件生成了