Jarvis OJ 神盾局的秘密

Jarvis OJ 神盾局的秘密

首先打开网页后,发现一张图片,下载下来看了一下,没有什么发现。让后回到刚才的网页,打开控制器,发现图片是以文件包含的形式传过来的,所以就可以联想,它既然可以包含图片,那应该也就可以包含文件。Jarvis OJ 神盾局的秘密于是我们需要在url里面试,我们目前就只知道有一个叫showimg.php的文件,所以我们就从它开始试。base64转码后,提交到url,
Jarvis OJ 神盾局的秘密让后成功访问了,打开页面原代码,看见了php代码。(页面源代码)

从代码中,我们可以了解到,我们可以传递一个参数,让后它会base64解密,并对它进行过滤,如果有…,/,pctf,//,这样的字眼,就返回do not file。如果没有这些字眼的话,就把传入的参数当作文件名,读取出来(如果有这个文件的话)。这相当于告诉我们第一个页面是如何进行文件包含的。
Jarvis OJ 神盾局的秘密然后再回到文件包含的页面,看看index.php文件里有什么,一般每个文件夹下都会有一个index.php文件作为索引文件,它可以不用选择,就自动打开。我们访问后,同样打开页面原代码,又看到一个php代码,
Jarvis OJ 神盾局的秘密大致意思是,定义一个shield类的对象$x,传递一个class的参数,把这个参数赋给$x,所以class传递的参数肯定也是一个对象。总结一下就是传递一个参数calss,让后反序列化一下赋给$x。但为什么要给它传值了,我们再打开下一个php页面。看见一个类,和一个提示,//flag is in pctf.php。它说flag在pctg.php里,这也就解释了为什么以一个源代码读取文件时,要把pcrf给过滤掉(要是第一个就能把它读取出来,那也太简单了把!!!)其实我感觉一点也不简单,第一次写根本不会!!!
Jarvis OJ 神盾局的秘密这个类里有一个数据成员,一个构造函数,和一个普通函数,构造函数负责给数据成员赋值,而这个普通函数厉害了,它可以读取本对象(this)的数据成员($file)所代表的文件,并以字符的形式返回。也就是说,要是我们定义一个对象,并把它的数据成员赋值为ptcf.php的,让后调用这个对象的普通函数,它就回读取出来它,也就是我们要的flag。再把第二个代码连起来,第二个函数里就是声明了这样的一个类,而且还调用了它的普通函数。
Jarvis OJ 神盾局的秘密所以我们本来传递class=new Shiels(“pctf.php”),让后赋值给$s,就可以了,但题非得把class参数给反序列化一下,所以我们就必循先把“ new Shiels(“pctf.php”) ”这个东西给序列化,再传给$s。提醒一下我们不是把“new Shiels(“pctf.php”) ”这个字符串序列化,而是把这个对象序列化,所以我们要在第三个代码得基础上,添加

$a= new Shield(‘pctf.php’);

echo serialize($a);

Jarvis OJ 神盾局的秘密在自己得服务器上运行,让后得到“new Shield(‘pctf.php’);”序列化后得结果:
Jarvis OJ 神盾局的秘密再把它赋值给class,让后逻辑就连得通了:

$a= new Shield(‘pctf.php’);

得:
$a=O:6:“Shield”:1:{s:4:“file”;s:8:“pctf.php”;}

$g=class=$a=O:6:“Shield”:1:{s:4:“file”;s:8:“pctf.php”;}
$g=unserialize($g);

$g=Shield(‘pctf.php’);
赋值
s=s=a=Shield(‘pctf.php’);
调用函数,返回对象得数据成员所指向得文件,并输出
echo x>readfile();return@filegetcontents(x->readfile(); return @file_get_contents(this->file);
连起来就是 echo file_get_contents(‘pctf.php’);

最后出flag
Jarvis OJ 神盾局的秘密