[TOC]

华科第一届网络安全挑战赛wp

web

secure_shell

考点:exec()无回显

对于这类题有个很简单的方法,直接将flag写进文件,然后路径读取就行

先测试一下能不能执行 cmd=1;sleep 4

发现反应了4秒,能执行

然后直接 cat /f* > 1.txt

最后访问/1.txt路径就行

pyssrf

考点:ssrf漏洞

打开有个提示 /get?site=

直接file读取flag

/get?site=file:///flag

碎碎念:以为很难。。。试了半天。。。。

misc

一闪一闪亮晶晶

考点:凯撒与base64结合,starry语言

根据提示,“凯撒大帝想学习一下Starry语言,你能帮帮他么吗”,一定跟凯撒密码和starry语言有关。

下载文件,是一串重复度非常高的字符串

1
JDBhJDBsJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLxprJDBhJDBhJDBsJDBrJDBhJDBsLjBsJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzprJDthMjBhJDBhLzBhJDBhJDBhDjthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtLLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJBphLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphDjBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBLJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJD4hJDBhJDBhMjBsJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjphLzBhJDBhJDBvJBphJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhDjBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBLJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJBphJDBhJDtrJDBhMjBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhDjBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLhphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJD4hJDBhJD4hLzBhJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrDjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphLzBhJDBhJDBvJDBhJDBsJDBhJDBhJDBLLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLhphLzBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhDjBsLjBsJDBhJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDpLJDBhJDBhJDtrLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJBphJDthJDphJDBhJDBsLjBsJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhDjBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhLzphJDBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLhphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhDjBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBLJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJBphLzphJDBhJDBhMjBhJDBhJDBvJDBhJDBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthDjBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBsJDBhJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJBphJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsDjBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBLJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhMjBhJDBhMjBsJDBhMjBhJDBhLxphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhDjBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBLJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhLzBhJDBhJDBhLxphJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphMjBvJD4hLzBhJDBhMjBhJDBhDjthJDBhJDBhJDthJDphJDBhJDBsLjBrJDthJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBLJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJBphJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhDjBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBLJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJBphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhMjBhJDBhMjBhJDBhMjBhJDBhDj4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBLJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLxprJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhDjBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphMjBvJDthMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBLJDBhJDthJDphJDBhJDBsLjBsJDBhJDBhJD4=

看到末尾的=,想到base64,所以是凯撒与base64的结合。

先用脚本爆破凯撒,将结果用base64编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import base64
# 截取文件最前面一部分进行猜测,因为根据后面可知这一部分是近似的四字符反复重复
key = "JDBhJDBsJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBh"

# 遍历凯撒加密中25种的可能性
for n in range(0, 26):
str_encrypt = ""
for letter in key:
if "a" <= letter <= "z":
str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
elif "A" <= letter <= "Z":
str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
else:
str_encrypt += letter

# 输出每一种可能性最后的结果
print(base64.decodebytes(str_encrypt.encode()))

image-20241119234133869

结果中发现只有当n=25时,会出现starry语言特有的+,*等符号

于是用脚本将其全部转化成starry语言

1
2
3
4
5
6
7
8
9
10
11
12
import base64
with open("C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.txt", "r", encoding="utf-8") as f: #flag.txt是凯撒密码的文本
str_encrypt = ""
n = 25
for letter in f.read():
if "a" <= letter <= "z":
str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
elif "A" <= letter <= "Z":
str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
else:
str_encrypt += letter
open("C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.starry", "wb").write(base64.decodebytes(str_encrypt.encode()))

最后用starry语言转换脚本转换就能得到flag

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import sys
fp = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.starry') #flag.starry是保存的starry语言文件
data = fp.read()
fs = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\f.txt', 'w') #f.txt是输出的中间文件
sub = 0
for i in data:
if i == '\n':
continue
elif i == ' ':
sub += 1
elif i == '+':
if sub == 1:
fs.write('dup\n')
sub = 0
elif sub == 2:
fs.write('swap\n')
sub = 0
elif sub == 3:
fs.write('rotate\n')
sub = 0
elif sub == 4:
fs.write('pop\n')
sub = 0
else:
fs.write('push ' + str(sub-5) + '\n')
sub = 0
elif i == '*':
if sub == 0:
fs.write('+\n')
sub = 0
elif sub == 1:
fs.write('-\n')
sub = 0
elif sub == 2:
fs.write('*\n')
sub = 0
elif sub == 3:
fs.write('/\n')
sub = 0
elif sub == 4:
fs.write('%\n')
sub = 0
else:
print('error!!!')
sub = 0
sys.exit()
elif i == '.':
if sub == 0:
fs.write('num_out\n')
sub = 0
else:
fs.write('char_out\n')
sub = 0
else:
print('error!!!!')
sys.exit()
fp.close()
fs.close()
fp = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\f.txt', 'r')
data = []
for line in fp:
line = line.strip('\n')
if line[:4] == 'push':
data.append(int(line.split(' ')[1]))
elif line == '*':
x = data[-1]
y = data[-2]
data = data[:-2]
data.append(x * y)
elif line == '+':
x = data[-1]
y = data[-2]
data = data[:-2]
data.append(x + y)
elif line == '-':
x = data[-1]
y = data[-2]
data = data[:-2]
if (x-y)<0:
data.append(y-x)
else:
data.append(x-y)
elif line == 'dup':
x = data[-1]
data.append(x)
elif line == 'char_out':
x = data[-1]
data = data[:-1]
print(chr(x),end="")
else:
print('error!!!')
sys.exit()

flag{785c45ea-d2a1-4993-8d4f-325323d5bcd9}