题目
思路
先看以下部分
将 $function改为'phpinfo'看看里面有什么,发现
可能存放了flag,再看看后面有没有能读取文件的函数,发现file_get_contents函数,参数为$userinfo中"img"键所对应的值经base64解码后的内容,而$userinfo又是由$serialize_info反序列化后得到
再看看上面的部分
$serialize_info是$_SESSION序列化后的字符串经filter函数过滤后的值,而我们又可以通过extract函数通过post方法修改$_SESSION中的键值对,那么我们是否可以通过字符逃逸原理构造出键名为"img"的键值对呢?
在filter函数中,发现'php','flag','php5','php4','fl1g'被过滤,因为这些字符串被替换为空字符串,导致序列化后的字符串字符数量减少,但记录的长度不变,我们就可利用这点构造出自己想要的变量和值,比如:输入_SESSION[user]=flag&_SESSION[function]=lalala";},经过序列化并过滤后会得到s:4:"user";s:4:"";s:8:"function";s:6:"lalala";}";}(舍去),可以看到经过filter后user的值为";s:(这里是我随便举的例子,实际中会报错,可以在phpstudy中进行实验)
因此可构造payload
_SESSION[user]=flagflagflagflagflagphp&_SESSION[function]=";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1:"1";s:1:"2";}
最后修改一下base64编码的文件名