打开解题网址:
根据题目提示,审查源码:
直接访问 Archive_room.php:
尝试点击中间的 SECRET 超链接,竟然说没看清,那么应该是藏了某些东西在 secret.php 和 end.php 的跳转过程中:
直接上burpsuite,对页面跳转进行抓包:
发现一个 secr3t.php,访问获得源码:
看来是代码审计:
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
看到 data ,input ,tp等词眼,想到前不久刚学的 php 伪协议;
函数作用分析:
- highlight_file(FILE) ,使php 代码高亮;
- error_reporting(0), 不报错;
- strstr() ,查找一个子串是否在另一个字符串中存在,存在则返回子串以及后面剩余部分,区分大小写;
- stristr() ,与 strstr() 函数作用相同,不区分大小写;
代码分析:
源码中提示 flag 在flag.php中,而要使得 include()将flag.php 包含进来,则要使得 前面的 if 不成立,而 if 不成立,需要满足4个条件:
- file 变量不能含有 …/ 这样目录穿越的字符;
- file 变量不能含有 tp,input,data 这几个字符;
既然 input,tq,data …/, 被禁用,那我们就无法进行目录穿越,或者shell写入连接蚁剑,所以想到使用 php://filter 这个php伪协议;
构造payload :
secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
payload 解析:
php://fliter: 用于读取文件源码;
read: php://filter的参数,用于读取数据;
convert.base64-encode 将读取的PHP代码(数据流)进行base64 编码,否则php代码会被执行而不再页面显示;
resource:指向要读取的文件,(要筛选的数据流);
大致过程是通过php://filter 伪协议对flag.php 进行base64数据流读取:
复制,解码,得到 flag.php 源码,得到flag.
关于一些函数具体用法请自行查阅资料,关于 php伪协议,请参阅大佬们写的文章:
php伪协议总结