litweb
LitCTF2026 lit_ezsql
|---------------|
| 题目描述 注注注! |

题目描述的很明确了
sql注入

可以确认数据库一共有5列

发现是宽字节注入
宽字节注入:
宽字节注入原理简介
当输入单引号 ' 时,后端会自动将其转义为 \'(即 %5c%27)。 如果在输入的前面加上一个高位字节(例如 %df),合并后就变成了 %df%5c。在 GBK 编码中,%df%5c 会被系统误认为是一个宽字符(繁体字 運),从而把反斜杠 %5c 吃掉。这样,后面的单引号 %27 就能成功闭合,引发 SQL 注入。
验证是否能正常拼接:

注入成功
注意:
因为 # 在 URL 里有特殊含义,需要手动 URL 编码为 %23

得到数据库名字为ezsql
爆表名:

爆列名:
这里因为后端有 addslashes 转义,单引号会变成 \',在这里没有宽字节帮它吃掉反斜杠,会导致整个 SQL 语句直接崩溃报错,所以我们不能直接加上单引号(像这样 where table_name='flag_store')
直接用十六进制(Hex)代替字符串(最常用、最推荐)
我们可以把字符串 flag_store 转换成十六进制。在 SQL 中,以 0x 开头的十六进制串会被数据库自动识别为字符串,从而彻底摆脱单引号。
flag_store 转成十六进制是:666c61675f73746f7265
在前面加上 0x,变成:0x666c61675f73746f7265

得到flag

LitCTF2026 Northbridge Document Hub
|---------------------------------------------------------------------------------------|
| 题目描述 Northbridge 文档中心接入了 kkFileView 兼容的文件预览网关。 研究员账号已开放,试着从解析缓存里找到本季度财务归档中的 flag。 |
查看源码发现了账号密码

定义了文件预览的网关:
JavaScript
|--------------------------------------------------------------------------------------|
| Plain TextfileGateway: { path: "/kkfileview/getCorsFile", queryKey: "urlPath", ... } |
这告诉了我们接下来要攻击的精确路径是 /kkfileview/getCorsFile,接收的参数是 urlPath。

登录成功之后,我们访问/ect/passwd


发现成功读取
在 Linux 系统中,运维人员或管理员执行过的所有终端命令,都会被系统自动记录到一个隐藏文件中,叫做 .bash_history。
Payload 构造:将绝对路径 /root/.bash_history 转换成 Base64。
发送请求:通过接口读取该文件 ()()()()。


成功发现/opt/kkfileview/cache/parsed/q1_finance_report_2026.zip /tmp/q1_finance_report_2026.zip
我们继续访问

返回包有PK,明显是压缩包

然后把地址复制到bp的浏览器,会自动下载zip
解压之后得到flag

LitCTF2026 华辰企业服务运营平台
|-------------------------------------------------------------------------|
| 题目描述 某客服工单系统上线后,保留了大量运维与调试能力。 你需要从系统暴露面和服务器中收集关键信息,完成权限突破并还原完整 flag |


用dirsearch扫描之后发现/actuator可以被访问

页面返回了一串 JSON 格式的数据,其中包含了大量的链接(如 /beans、/env、/mappings、/heapdump 等)
漏洞原理: 正常的系统应该对 /actuator 路由进行拦截并提示登录(401 Unauthorized)。如果能直接看到这串 JSON,说明该系统没有对管理端点做访问控制
这一步基本已经定性:
是 Spring Boot
Actuator 没关
而且是未授权可访问
这几个端点分别能干这些事:
env:看环境变量、应用配置
configprops:看配置属性绑定结果
mappings:看所有路由
heapdump:导出 JVM 堆内存
beans:看 Bean 和组件
threaddump:看线程状态
访问env

得到flag
LitCTF2026 lit_ezssti
|-------------------|
| 题目描述 缺什么补什么(x |


说明:
不是直接 Jinja2 执行
或者至少 {{...}} 这条路不通
测试 ${...}

结果:
回显 WAF
说明:
服务端有 关键字/语法黑名单
${...} 这种写法被拦了
测试代码块写法

这个点非常关键,说明两件事:
<% ... %> 里的代码真的执行了
异常信息会被页面直接回显出来
所以这题本质上已经通了:
你能执行 Python 代码
你还能通过 raise Exception(...) 把想看的内容显示出来
因为:
<% ... %> 能执行代码
普通 {{...}} 不执行
报错模式很像 Python 模板渲染
这很像 Mako / 类 Mako 模板语法
确定他的类型并不重要,重要的是我们能进行注入了


这题的黑名单很可能会拦:
.
__
flag
某些常见危险片段
因此后面要尽量绕开:
不写 os.getcwd
改写成 getattr(os,"getcwd")

得到当前工作目录

查看根目录的信息,发现有flag,但是我们没法直接读取,因为flag被过滤了

Payload:
|---------------------------------------------------------------------------|
| Python<% raise Exception(getattr(open("/"+chr(102)+"lag"),"read")()) %> |
LitCTF2026 lit_reverse_my_web
|--------------------|
| C题目描述 Web手也要会逆向么喵? |

附件:


我们先注册账号,然后进入平台

这里目录叫做flag,而且不让我们访问,那很明显这题的思路就是提权了,我们进行抓包

很明显就是jwt提权

只要我们能找到key,然后重构一个管理员jwt就行了

1)右上:取密文字节
这说明:
reverseMyWeb_internal_jwtsecret_encKey 就是密文数组起始地址
rcx 是下标 i
movzx byte ptr r8+rcx 是在读第 i 个密文字节
2)右下:异或解密
所以这题的密钥恢复公式已经被你亲手确认了:
添加到对话
明文密钥 = encKey 每字节异或 0x5A

得到密文
28172d05686a686c0536332e392e3c05302d2e05293f39283f2e05313f237b7b
|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Cenc = bytes.fromhex( "28172d05686a686c0536332e392e3c05302d2e05293f39283f2e05313f237b7b" ) key = bytes(b ^ 0x5A for b in enc) print(key) print(key.decode()) |
所以最终密钥就是

rMw_2026_litctf_jwt_secret_key!!

我们将身份更改成admin,之后重新放包

得到flag