网络启示录2025撰写 - 火灾试验

· 3min · Juicecat

##审判大火

对于此练习,我们为我们提供了一个带有WebApp和包含源代码的ZIP文件的URL。

查看源代码,我们看到它是由UWSGI和Substisord管理的Docker映像内部的烧瓶WebApp index.md-2.png 当我们访问网站时,我们会受到此屏幕的欢迎:index.md-3.png

最后一行对我脱颖而出。在源代码中检查此页面的Jinja模板此处向我们显示了明显的解决方案:模板注入: index.md-4.png

因此,我现在知道,模板注入可能是胜利的道路。我现在需要的是一个可以将有效载荷注入未逃脱的字段。幸运的是,我们实际上只有一个真正的领域进入了应用程序 - 一开始就进入了战士的用户名。 搜索源以寻找模板,我们看到另一个实例:index.md-5.png 因此,这似乎是一个明显的方向。让我们将用户名设置为_BRACE0_

玩游戏后,我们受到了这个屏幕的欢迎 -
index.md-6.png

查看数据,有几个有趣的信息:

1。应用程序路径:/app/venv/lib/python3.12/site-packages/flask/app.py 2。访问evalexec之类的危险函数 3。会话数据显示注射工作的工作:'warrior_name': '_BRACE0_' 4。访问当前应用程序上下文:current_app': <HTB 'application.app'>

因此,要找到标志,我们可以:

  • open通过__builtins__函数
  • os模块
  • 各种Python执行功能

我最终得到了SSTI有效载荷``{{ url_for.globals.builtins.open('/app/flag.txt').read() }}BT10_,它只是读取标志。不幸的是,Web表单限制了字符名称的长度,因此我们需要实际使用burpsuite拦截请求并用有效载荷替换我们的名称: index.md-7.png

然后,播放了序列后,我们被旗帜迎接了:) index.md-1.png