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的漏洞成因。