WUSTCTF2020-朴实无华

[WUSTCTF2020]朴实无华

这个题的各种编码还是挺烦人的……

image-20210412000152394

robots.php里有:/fAke_f1agggg.php,结果确实fake……

抓包发现:

image-20210412000414721

访问:

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("去非洲吧");
}
?>

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 md5
import re

for 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!

……

作者

inanb

发布于

2021-04-12

更新于

2021-08-23

许可协议


:D 一言句子获取中...