CVE-2020-7471原理分析及复现


漏洞简介

2020年2月3日,Django 官方发布安全通告公布了一个通过StringAgg(分隔符)实现利用的潜在SQL注入漏洞(CVE-2020-7471)。攻击者可通过构造分隔符传递给聚合函数contrib.postgres.aggregates.StringAgg,从而绕过转义符号(\)并注入恶意SQL语句。

漏洞影响版本

在这里插入图片描述
在这里插入图片描述

一、漏洞原理分析

在 Github 仓库查找 django 的 commit 记录,发现官方对其的修复:
在这里插入图片描述

从这里我们知道几个信息,漏洞函数位于下面的模块之中:

from django.contrib.postgres.aggregates import StringAgg

官方对 delimiter 使用Value(str(delimiter))处理后进行防御,Value处理过的参数会被加到sql的参数列表里,之后会被diango内置的过滤机制过滤,从而防范SQL漏洞。

二、相关说明

在这里插入图片描述
POC脚本如下(可到https://github.com/Saferman/CVE-2020-7471下载):
在这里插入图片描述
initdb()函数
给管理器添加初始测试数据[(‘li’,‘male’),(‘zhao’,‘male’),(‘zhang’,‘female’)];

query()函数
进行模糊测试,找出当delimiter 的值为哪些字符时,会让程序运行出现错误(即使用哪些字符可能会干扰SQL语句的执行(将delimiter 输入的字符带入了SQL语句,破坏原有语句)),测试结果得出是单引号和百分号

query_with_evil()函数
进行注入点证明测试时,payload前后两个不同的赋值,是为了得到两个不同的结果,前一个使用正确的分隔符-,后一个是使用同样的分隔符-,但是后面带有SQL语句:

') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 1 OFFSET 1 -- 

数据库进行查询时,使得整个查询语句变为了:

SELECT "vul_app_info"."gender", STRING_AGG("vul_app_info"."name", '-') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 1 OFFSET 1 -- 

这里的payload = ‘-\’) AS … LIMIT 1 OFFSET 1 – ‘中的\’,反斜杠的作用只是在payload字符串赋值时转义单引号,payload中的-’),使得STRING_AGG(“vul_app_info”.“name”, ‘-’)右括号闭合了,导致了后面的SQL语句的执行,因为输出只出现一条,是因为使用了LIMIT,证明该SQL语句确实被执行了。

三、复现

1.使用pip命令安装有漏洞版本的django。
2.安装postgresql
3.下载CVE-2020-7471到本地

在这里插入图片描述
4.创建测试数据库test,初次安装postgres 数据库,系统会创建一个数据库超级用户 postgres,密码为空。使用命令(sudo -i -u postgres)进入postgres数据库,并创建测试数据库(test)。
5.修改配置文件
修改文件…/CVE-2020-7471/sqlvul_projects/settings.py 里面的第78列下的数据库配置,如果之前安装postgres数据库使用的默认配置(包括密码),就无需修改任何任何配置,可以跳过这一步,我更改了初始密码故需要更改。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'test',         # 数据库名称
        'USER': 'postgres',
        'PASSWORD': '123', # 数据库用户密码
        'HOST': '127.0.0.1',    # 数据库地址
        'PORT': '5432',
    }
}

在这里插入图片描述
6.利用CVE中的代码初始化测试数据库test中的表

python3 manage.py migrate
python3 manage.py makemigrations vul_app
python3 manage.py migrate vul_app

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.运行 POC 脚本(CVE-2020-7471.py)查看结果
注入后的输出只出现一条,是因为使用了LIMIT,证明注入成功,实际正常应该输出两条。

在这里插入图片描述
在这里插入图片描述

总结

如果遇到真实环境中有 django 开发的服务返回一些查询的聚合内容,并且允许用户指定哪种连接符的时候,应该多加思考是否该服务未更新为最新版本,以便尽快更新。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值