CVE-2020-7471 Django漏洞复现及浅析

一、 CVE-2020-7471介绍
2020年2月3日,Django 官方发布安全通告公布了一个通过StringAgg(分隔符)实现利用的潜在SQL注入漏洞(CVE-2020-7471)。攻击者可通过构造分隔符传递给聚合函数contrib.postgres.aggregates.StringAgg,从而绕过转义符号(\)并注入恶意SQL语句。
受影响版本:
• Django 1.11.x < 1.11.28
• Django 2.2.x < 2.2.10
• Django 3.0.x < 3.0.3
不受影响产品版本:
• Django 1.11.28
• Django 2.2.10
• Django 3.0.3

二、漏洞复现
1、kali下安装受影响的django版本 

  

 

 2.创建测试数据库

  

 

连接数据库,修改密码为123456,并建立数据库test

  

 

 

3.下载poc:git clone https://github.com/Saferman/CVE-2020-7471.git

 

4.修改CVE-2020-7471/sqlvul_project/settings.py

  

 

5.初始化测试数据库test中的表

  

 

 查看数据库是没数据的

 

 

 

6.运行poc python3 CVE-2020-7471.py

 

 

7.再次查看数据库,数据插入成功

 

 

三、.POC浅析

 

     initdb函数:给管理器添加初始测试数据

 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语句的执行。

 

 

参考原文链接:https://blog.csdn.net/qq_29365787/article/details/108600613

posted @ 2021-04-28 18:29  西瓦沙拉  阅读(1872)  评论(0编辑  收藏  举报