题目
点开页面显示如下
页面显示了一行报错:Cannot modify header information - headers already sent by (output started at /var/www/html/index.php:3) in /var/www/html/index.php on line 4
意思为不能修改报头信息-报头已经发送(输出开始于/var/www/html/index.php:3)在/var/www/html/index.php第4行
查看源代码也没有其他线索,用dirsearch扫一下看看
扫到一个robots.txt,访问之后页面显示如下
访问fAke_flagggg.php,显示如下
查看源码什么也没有,抓包试一下
访问这个页面,出现了乱码
用的火狐,按alt查找修改文字编码就可以了,显示如下
<?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 "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
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 "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
去非洲吧
level1代码中,intval()函数将num转换为整数类型,并进行比较判断,如果num小于2020且$num+1大于2021,则输出消息"我不经意......"
关键在于intval函数,intval函数参数填入科学计数法的字符串,会以e前面的数字作为返回值而对于科学计数法+数字则会返回字符串类型
通过
level2是md5,找到一串数字使它md5加密后的数值和原来的相等,php具有弱类型,==进行比较的时候会先将字符串类型转化为相同,再比较
典型的md5绕过,绕过原理就是加密前后都是0e开头的字符串
通过
level3代码中
-
使用**
strstr($get_flag, " ")
函数检查$get_flag
是否包含空格** 。如果$get_flag
中不包含空格,则执行下面的代码;否则,输出一条消息"快到非洲了"并终止程序的执行。 -
如果
$get_flag
中不包含空格,则使用str_ireplace("cat", "wctf2020", $get_flag)
函数将$get_flag
中的所有"cat"替换为"wctf2020",并将结果重新赋值给$get_flag
。
很明显,这里过滤了cat命令,但是查看文件的linux
命令还有很多,例如tac less more tail
都可以作为替代。
空格绕过可以使用**$IFS$9**
已经知道了flag文件在当前目录下
所以最终的payload为
?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
参考文章链接: