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

news/2024/7/9 21:16:36 标签: 安全, python, 数据库, postgresql, 经验分享

文章目录

  • 漏洞简介
  • 漏洞影响版本
  • 一、漏洞原理分析
  • 二、相关说明
  • 三、复现
  • 总结


漏洞简介

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

漏洞影响版本

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

一、漏洞原理分析

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

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

python">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语句:

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

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

python">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数据库使用的默认配置(包括密码),就无需修改任何任何配置,可以跳过这一步,我更改了初始密码故需要更改。

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

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

python">python3 manage.py migrate
python3 manage.py makemigrations vul_app
python3 manage.py migrate vul_app

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

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

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

总结

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


http://www.niftyadmin.cn/n/1091075.html

相关文章

CodeForces - 475D CGCDSSQ

Discription Given a sequence of integers a1, ..., an and q queries x1, ..., xq on it. For each query xi you have to count the number of pairs (l, r) such that 1 ≤ l ≤ r ≤ n and gcd(al, al  1, ..., ar)  xi. is a greatest common divisor …

优秀自我简介200字_200元/篇起 | 深夜秘杏酱公众号长期征稿(新号大量收稿)...

是新朋友吗?记得先点蓝字关注我哦~“深夜秘杏酱”征稿函新号大量收稿 欢迎写手大大们踊跃投稿哦Hi!我们是一个专注女生性知识科普及女生情感生活的新号——深夜秘杏酱!我们希望能在这个新成立的公众号上跟各位小姐姐分享各种搞怪有…

四则运算的调查问卷

需求获取方式:联系亲朋好友以及通过认识的老师让帮忙做调查并通过社交媒体发布问卷 调查问卷链接:https://www.wjx.cn/pq/22674762.aspx?t636596846614795000 查结果统计分析: 1.您的性别是 : 2.您的身份是? 3.您的所…

使用计算机键盘的基本步骤,电脑如何用键盘开机_台式电脑键盘开机方法-win7之家...

在启动台式电脑的时候,最常见的方式无疑就是通过按主机上的开机键,这样就能够打开电脑进入系统,可是当主机上的开机键没反应时,我们能否通过键盘来操纵台式电脑的启动过程呢?那么电脑如何用键盘开机呢?接下…

【MAVEN】常用配置记录

1. 配置文件修改 - 修改local库的位置 - 配置源mirror&#xff0c;推荐很流畅的一个阿里源2017.3.30流畅可用 <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http:/…

转: 关于在linux下清屏的几种技巧

转&#xff1a; 关于在linux下清屏的几种技巧 http://www.cnblogs.com/5201351/p/4208277.html转载于:https://www.cnblogs.com/igfirstblog/p/8880432.html

系统架构师主题整理之一:软件系统开发模型及其应用

1 软件开发常见模型及其概念 瀑布模型&#xff1a;传统模型&#xff0c;从需求开始&#xff0c;按照需求分析、概要设计、详细设计、单元测试、集成测试、系统测试这个流程实践软件工程。适合需求比较明确&#xff0c;有较好的领域经验积累和沉淀的项目。 原型模型&#xff1a;…

100w氮化镓充电器_国内首款100W氮化镓充电器来了!3C1A接口性价比惊人

USB PD作为未来最具潜力的数码产品充电标准&#xff0c;已经迅速普及开来&#xff0c;绝大部分数码产品快充需求亦基于USB-C接口进行&#xff0c;这让以往一个C口搭配多个A口的充电器设计惯例变得不合时宜。7月18日SHARGE闪极科技在深圳举行“闪极100W超充旗舰发布会”&#xf…