CVE-2020-7471 Django SQL注入漏洞复现

2020-05-18 17:35:45 浏览数 (1)

0x01漏洞简介

CVE-2020-7471:通过StringAgg(分隔符)的潜在SQL注入

django.contrib.postgres.aggregates.StringAgg聚合函数使用适当设计的定界符进行了SQL注入。

Django是高水准的由Python编程语言驱动的一个开源Web应用程序框架,起源于开源社区。使用Django,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序,应用广泛。2月11日,绿盟科技监测发现此漏洞PoC已公开,请相关用户尽快升级Django至修复版本,修复此漏洞。

参考链接: https://www.djangoproject.com/weblog/2020/feb/03/security-releases

0x02 影响范围

受影响版本:

  • Django 1.11.x < 1.11.28
  • Django 2.2.x < 2.2.10
  • Django 3.0.x < 3.0.3
  • Django 主开发分支

不受影响产品版本:

  • Django 1.11.28
  • Django 2.2.10
  • Django 3.0.3

0x03 漏洞复现

  • ·复现靶机kalil 2019.3
  • ·复现Django版本 3.0.2

一、环境部署

通过git先获取到漏洞的环境与poc

代码语言:javascript复制
git clone https://github.com/Saferman/CVE-2020-7471.git

1、 安装 django 漏洞版(3.0.2)

代码语言:javascript复制
pip3 installdjango==3.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

2、安装postgre 数据库

代码语言:javascript复制
apt-get installpostgresql-11

我这里的postgre 默认的就已经安装了这个版本了所以就没有装,大家如果没有装的需要安装

3、启动postgre 数据库

代码语言:javascript复制
service postgresql start

没有回显是正常的,如果担心可以看一下端口有没有开启postgre端口为5432

4、连接postgre 数据库在安装完毕后,系统会创建一个数据库超级用户 postgres并且密码为空。然后我们以管理员身份 postgres 登陆(注:这里postgres是系统用户)

代码语言:javascript复制
sudo -i -u postgres 

5、切换到postgres这个用户之后我们输入psql进入postgres的shell,并且我们可以看到我们这里psql的版本是11.5的

6、到这一步之后我们修改postgre的密码为root并创建一个zerosec的数据库

代码语言:javascript复制
ALTER USER postgres WITH PASSWORD 'root';
代码语言:javascript复制
CREATE DATABASE zerosec;

7、 把之前git下载好的文件打开修改配置文件~/CVE-2020-7471/sqlvul_project/settings.py

8、 找到第78行DATABASES修改databases里面的配置信息

修改前

修改后

9、使用django初始化数据表分别执行一下几句

代码语言:javascript复制
python3 manage.py migrate
代码语言:javascript复制
python3 manage.py makemigrationsvul_app

这里no changes …. 不要紧的可以不用care

python3 manage.py migrate vul_app

这里的no migration to apply 可以不用care 走形式

这样初始化环境就已经全部完成了。

二、 进入攻击环节(想必有同学要问了 数据库里面木有数据怎么办 别急接着往下看)

回到我们之前的psql shell中我们执行 “c zerosec”

c zerosec 的意思是选择zerosec数据库

然后我们d 看一下数据库中所有的表

我们查询一下我们要利用到的vul_app_info 中的内容

可以看到这里是空的,那么不要激动,经过我分析之后发现本来应该要在

python3 manage.py makemigrations vul_app 这一步的时候要执行sql语句的但是我发现migrations 里面初始化的数据是空的,那么问题来了数据跑去哪了呢 经过后面发现 在poc中有一段代码是用来导入数据的。

好了 到这里大家应该就明白接下来要做什么了

执行POC代码

这时候我们再去查询一下数据库。

数据就进去了,当然这不是重点 重点是我们poc执行成功了。

在POC中我们可以看到作者用了‘转义了’的实意,从而构成了后面语句的拼接。

到这里本次复现就结束了,下周会分析CVE-2020-7471的漏洞成因。

0 人点赞