Flask内存马各种姿势与查杀
xt 发表于 陕西 WEB安全 1683浏览 · 2025-06-09 10:08

Flask内存马各种姿势详解

本篇以jinja2 ssti视角研究Flask高版本内存马

拿request对象

app.view_functions相关

因为高版本给add_url_rule加了装饰器@setupmethod,这个装饰器会先调用app._check_setup_finished, 所以得将app._got_first_request改为False

路由装饰器

Python
复制代码
add_url_rule

add_url_rule最后还是调用url_map.add(rule_obj)然后view_functions[endpoint] = view_func

这里就不用改app._got_first_request=False

endpoint装饰器会view_functions[endpoint] = view_func,但是有@setupmethod

反正老多了比如_method_route("PATCH", rule, options)

劫持路由函数

比如存在

@app.route("/") def index():

app.before_request_funcs相关

这函数也装饰了@setupmethod

向before_request_funcs字典里加

app.after_request_funcs相关

函数只能返回response对象

向after_request_funcs字典里加

app.error_handler_spec相关

其他

app.teardown_request (无回显呀,感觉没啥意义)

重写某些每次请求都会执行的函数,这样会比较危险,而且不容易有回显

回显相关

可以对Response类做更改

然后就是对Response对象的更改(有些只做了类型标准,没有初始化的属性就只能改响应对象啦),但是每次请求都创建新响应对象,所以我觉得这个作用不大,本质上跟生成响应没啥区别

题外

改static_folder读任意文件

现成的Python内存马管理工具:https://github.com/orzchen/PyMemShell

Flask内存马查杀

如何在 Flask 应用的内存中查杀内存马(Webshell),重点是如何通过操作 Flask 应用对象 <Flask 'app'> 来发现并清除恶意代码。

内存马通常是通过动态代码注入的方式存在于内存中,利用 Flask 应用的生命周期和钩子函数来隐藏自身行为。查杀内存马关键在于:

找到 Flask 进程对应的 Python 运行环境

访问 Flask 应用对象,分析其属性和注册的钩子、路由等

识别并定位恶意注入的函数或钩子,进行清除或禁用

环境准备

这里我们使用 pyrasite 这个开源工具,能够注入代码到运行中的 Python 进程,实时交互并调试。

安装 pyrasite

建议直接从 GitHub 克隆最新版安装,pypi的不行

查杀步骤

1. 找到 Flask 进程 ID

使用命令查看运行中的 Flask 应用:

ps aux | grep python

或者针对 Flask 启动脚本查找:

ps aux | grep app.py

假设 Flask 进程 PID 为 8

2. 注入交互 Shell

注入 Python 交互式 shell 到 Flask 进程:

pyrasite-shell 8

这样就可以在 Flask 进程中执行任意 Python 代码。

3. 访问 Flask 应用对象

进入 shell 后,找到 Flask 应用对象。一般常见变量名是 appapplication,如果不知道变量名,可通过 globals()locals() 查找。

常用属性包括:

4. 查找恶意钩子或路由

查看所有注册的路由及对应函数:

5. 分析错误处理钩子

6. 反汇编可疑函数

利用 Python 的 dis 模块对可疑函数进行反汇编,查看底层字节码逻辑:

通过字节码分析判断函数是否含有执行系统命令、执行动态代码等行为。

0 条评论
某人
表情
可输入 255