Day 11

这源码考的是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

 

刷新一下,就会发现文件生成了

原文地址:https://www.cnblogs.com/nienie/p/9769297.html