[BJDCTF 2nd]文件探测

[BJDCTF 2nd]文件探测

那天,我见过的最强剑客,提起了天下最强的宝剑······却早已没了剑心。

记录一道BJDCTF第二次比赛的题目,相比于上一次的题目,这次的题目质量更好,对选手要求更高,这里记录一个web的文件探测;进入题目,花里胡哨的页面没有什么用;查找信息,发现响应包里面有个提示,hint;;home.php我们进去访问一下。

[BJDCTF 2nd]文件探测

[BJDCTF 2nd]文件探测

有个提示,显示我们处在system.php之下,我们这里看到url里面有个file;于是想到php伪协议,进行文件源码读取,这里键入php://filter/convert.base64-encode/resource=system;读取system.php的源码;解码;;得到php;;

[BJDCTF 2nd]文件探测

[BJDCTF 2nd]文件探测

这里经过代码审计,发现有个危险函数file_get_contents,但是这里false了。我们不能进行任意文件读取,所以只好利用ssrf了;

[BJDCTF 2nd]文件探测

这里回到system.php页面,发现post提交数据;仔细审计代码,发现提交q1 q2 q3这里读源码看到,并没有对q1采取任何的措施,所以这里可以任意填;

[BJDCTF 2nd]文件探测

然后我们发现q2提交以后,后面会拼接y1ng.txt 这里我们可以采用一种类似于闭合的方式进行闭合;?s1mple=1;;那么拼接以后就成为了::xxxxxx?s1mple=1.y1ng.txt 这样也算是类似闭合了;这里q3;有点讲究;;

[BJDCTF 2nd]文件探测

[BJDCTF 2nd]文件探测

我们看到,访问方法必须是GET和POST开头,但是没有过滤结尾,三个都过去以后进行格式化输出;但是我们看到这里输出的是%d;是数字,肯定无法读取源码;;

但是sprintf()是有格式化字符串漏洞的,我们往里面注%s 就可以打到输出字符串的效果,这里我们应该想到,我们结果$method是和%d连起来的,这里我们为了避免出错,就直接将%d转义,这里的转义并不是 \ 可以转义的,当时在这里卡了一下,后来上网查了一下,发下这里转义是要用到%%,所以我们传入GET%s%就可以将后面的%d转义掉;从而输出字符串;

这里我们ssrf读取admin.php;因为是本地文件包含,所以我们直接http://127.0.0.1/admin.php?s1mple=1 GET%s%,进行admin.php的读取,读取的源码如下,;

[BJDCTF 2nd]文件探测

这里简单分析了一下,首先亮出了aes的加密方法;;

[BJDCTF 2nd]文件探测

然后进行了check;;这里我们不难发现,只要不去乱修改cookie,是不会触发的;可以过去;;

[BJDCTF 2nd]文件探测

然后对你的真实ip进行了判断,并且有回显‘;;

接下来就是重头戏了

[BJDCTF 2nd]文件探测

用我们的真实ip md5作为session;然后这里需要get传参,必须满足if的条件以后才可以得到flag,否则就返回爬;这里我们可以看一下,两个比较方的生成方式,dect是我们直接get进去的,然而难点就在cipher;

[BJDCTF 2nd]文件探测

我们知道php是具有为随机性的,他的种子可以被反向爆破出来,(buu有一道题);但是这里出了问题;;具体的原因是因为这里只是取得了种子的长度;然后用不能被破解的函数生成了一个新的随机数,这样就难破解了;;当时就是卡在了这里很长时间,然后仔细想想,怎么绕过去;;这里看到种子是被给了 session 然后赋值给了data;然后再用data进行aes加密,这里如果我们将其置为空,那么也就没有所谓的data,那么加密就是可见的了,;;也算是逻辑上的一个漏洞吧;

那就简单了;;构造poc,进行aes加密,令data置为空,并进行urlencode,然后删除PHPsession;最后go;从而打到效果;;flag是动态的哦~~~~

[BJDCTF 2nd]文件探测