MOCTF PUBG 反序列化+文件备份+linux文件读取
简介:
这道题考核了很多ctf的有关知识点,我也纠结了好久才可以彻底明白,今天发出来自己的解题思路和大家分享一下。。。
考点:
php反序列化漏洞,文件备份以及linux文件读取的有关知识
不太了解php反序列化漏洞的可以查看这篇博客:
https://www.freebuf.com/column/161798.html
题目总览:
好,我们开始解题,首先右键审查源码,发现有什么新的东西…发现这是一个文件的备份名称,我们赶快访问一下。。
下载之后审查源码
上面发现包含了一个新文件class.php和当pos等于school时的反序列化函数,因此,我们尝试用同样的方法下载了class.php
发现了3个php魔法方法,没有基础的朋友可以先看一下我之前的总结附带绕过__wakeup魔法方法的代码,,,
还有个waf.php,但是奈何暂时没有方法读取。。。。
先擦干泪水,现在我们来逐个审计这些函数的内容:::
__wakeup()函数在其所在对象反序列化的时候自动调用。所以如果我们构造sheldon对象并反序列化后,我们的对象内部就会自动调用__wakeup()函数,他会把序列化bag的内容转换为nothing,weapon的内容转化为kar98K,如果我们不能绕过这个函数,那一定就不可以继续判断执行
这个函数意思是传入一个参数b,而b为一个函数并执行这个函数,用作后面的使用。。。本篇最重要的函数诞生了,这是我们这次使用最重要的函数,__call魔法函数,__call()有两个参数,第一个参数会接受不存在的方法名,第二个参数则以数组的方式接受不存在方法的多个参数。
然后进行函数内部的判断,首先,它会把file[0].php的存在性,然后执行 system("php .//class//method=win.php|cat class/flag,从而满足if的条件,又可以执行的内容为system(“php .//win.php|cat class/flag.php”)**切记传参数的顺序传递反了就凉了。。。。这是我们最后必定会执行的函数,这里面也有条件:
1,先对成员执行waf函数(奈何看不了waf.php,很多东西都过滤了也不曾知道,有点尴尬…)。
2,然后if中条件满足的话,对bag成员执行Get_air_drops函数,否则就die输出一行字。
然后我们来构建payload:::
http://120.78.57.208:6001/?LandIn=school&pubg=O:7:“sheldon”:4:{s:3:“bag”;s:27:"//win.php| cat ./class/flag";s:6:“weapon”;s:3:“AWM”;}
或者这样:
http://120.78.57.208:6001/?LandIn=school&pubg=O:7:“sheldon”:4:{s:6:“weapon”;s:3:“AWM”;s:3:“bag”;s:27:"//win.php| cat ./class/flag";}
就是反着传了一下。。。
然后右键查看源码 就可以找到flag》》》》》》》》
moctf{Try_Learn_PhP_h4rder_wow}