出品|MS08067实验室(www.ms08067.com)

本文作者:守拙(Ms08067实验室追洞小组成员)

一、漏洞名称:

通过StringAgg(分隔符)的潜在SQL注入漏洞

二、漏洞编号:

CVE-2020-7471

三、漏洞描述:

Django 1.11.28之前的1.11.x、2.2.10之前的2.2.x和3.0.3之前的3.0.x版本允许SQL注入,如果不受信任的数据用作StringAgg分隔符(例如,在存在多行数据下载的Django应用程序中,使用用户指定的列分隔符进行下载的场景)。通过向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

五、漏洞分析

聚合函数StringAgg的delimiter参数未经任何转义就嵌入到sql语句中,导致sql注入

六、实验环境及准备:

1.数据库:postgresql,版本无所谓,本文中使用kali虚拟机中自带的数据库,允许外部连接

  • 修改如下文件,监听所有端口
/etc/postgresql/12/main/postgresql.conf

  • 修改如下文件,允许外部连接
/etc/postgresql/12/main/pg_hba.conf

  • 重启服务后,连接数据库并创建测试数据库
登陆:psql -U postgres -h [kali主机的IP]
创建测试数据库:CREATE DATABASE test,后面poc中会用到
其他postgresql语法可以参考菜鸟教程

2.POC: https://github.com/Saferman/CVE-2020-7471,运行环境django3.0.2

  • 安装django3.0.2

    pip installdjango==3.0.2
  • 使用pycharm调试POC代码,参考POC中的readme文档

  • 初始化数据库后可以用pgadmin连接看下,test数据库中应该有如下表

  • Vul_app_info表中应该如下字段和数据

七、复现步骤:

POC测试脚本中有两个函数query()和query_with_evil(),前者用于模糊测试,后者用于注入点证明

1.模糊测试

  • 通过运行query()函数的异常捕获可以知道有两个特殊字符让程序产生了报错(%和’)
  • 将程序中异常捕获注释掉,payload使用%和’单独测试

  • 通过报错可以看出分号没有转义导致sql语句报错,并直接在报错信息返回了拼接后的sql语句。将断点打在执行sql语句并产生报错的代码块去看完整的sql

  • 得到程序运行的实际sql语句
SELECT "vul_app_info"."gender", STRING_AGG("vul_app_info"."name", \'\'\') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 21

2.注入点证明

  • 通过注入sql语句使查询结果区别与程序原本的查询结果来证明注入点的可用
  • 程序原本执行的sql语句,最后是limit 21
SELECT "vul_app_info"."gender", STRING_AGG("vul_app_info"."name", \'- \') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 21
  • 注入后的 sql 语句,最后是 limit 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 OFSET 1 --
  • 运行结果验证

八、其他思考:

1. 漏洞利用场景

  • Django 应用返回聚合数据的场景
  • 用于聚合的字符用户可控
  • 数据库得是 postgresql 数据库
  • 好像不容易存在这种场景...

2. 漏洞挖掘思路

  • 针对可能存在问题的函数,构建测试环境
  • 针对该函数进行模糊测试,看是否有 sql 语句报错信息
  • 如果模糊测试成功让 sql 语句报错,进行注入点利用验证

3. 漏洞修复

  • 新版本中将delimiter 参数用Value函数处理了一下,再传递到sql中

  • 升级django版本(3.1.6)再debug一下

  • 分割符的地方用了%s,没有直接拼接进去,根据Value函数的注释说法是将参数放到sql的参数列表中,最终以下面的方式执行,则不存在sql注入风险
sql="SELECT * FROM user_contacts WHERE username = %s"
user='zhugedali'
cursor.execute(sql,[user])

4.同类型函数

  • 在postgresql数据库中和StringAgg函数一样可以传递分隔符参数的函数还有
array_to_string(array_agg(name),'-')

  • 但是django中没有找到这个函数的API(没有提供或者是我太菜了没找到..)





转载请联系作者并注明出处!

Ms08067安全实验室专注于网络安全知识的普及和培训。团队已出版《Web安全攻防:渗透测试实战指南》,《内网安全攻防:渗透测试实战指南》,《Python安全攻防:渗透测试实战指南》,《Java代码安全审计(入门篇)》等书籍。

团队公众号定期分享关于CTF靶场、内网渗透、APT方面技术干货,从零开始、以实战落地为主,致力于做一个实用的干货分享型公众号。

官方网站:https://www.ms08067.com/

扫描下方二维码加入实验室VIP社区

加入后邀请加入内部VIP群,内部微信群永久有效!

追洞小组 | 实战CVE-2020-7471漏洞的更多相关文章

  1. 追洞小组 | fastjson1.2.24复现+分析

    出品|MS08067实验室(www.ms08067.com) 本文作者:爱吃芝士的小葵(Ms08067实验室追洞小组成员) 1.靶场搭建 2.漏洞复现 3.漏洞分析 4.漏洞修复 5.心得 靶场搭建 ...

  2. [网站安全] [实战分享]WEB漏洞挖掘的一些经验分享

    WEB漏洞有很多种,比如SQL注入,比如XSS,比如文件包含,比如越权访问查看,比如目录遍历等等等等,漏洞带来的危害有很多,信息泄露,文件上传到GETSHELL,一直到内网渗透,这里我想分享的最主要的 ...

  3. CVE补丁安全漏洞【学习笔记】

    更新安卓系统的CVE补丁网站:https://www.cvedetails.com/vulnerability-list/vendor_id-1224/product_id-19997/version ...

  4. JMeter分布式压测实战(2020年清明假期学习笔记)

    一.常用压力测试工具对比 简介:目前用的常用测试工具对比 1.loadrunner 性能稳定,压测结果及颗粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多. 2.Apache ab(单接口 ...

  5. vmware漏洞之二——简评:实战VMware虚拟机逃逸漏洞

    下文取自360,是vmware exploit作者自己撰写的.本文从实验角度对作者的文章进行解释,有助于学习和理解.文章虚线内或红色括号内为本人撰写. ------------------------ ...

  6. DVWA靶机实战-文件上传漏洞(二)

    继续打靶机:当前靶机的安全级别:medium 第一步 上传一句话木马,这次没有之前那么顺利了,文件显示上传失败,被过滤. 点开右下角view source查看源码: 只允许上传image/jpeg格式 ...

  7. CVE¬-2020-¬0796 漏洞复现(本地提权)

    CVE­-2020-­0796 漏洞复现(本地提权) 0X00漏洞简介 Microsoft Windows和Microsoft Windows Server都是美国微软(Microsoft)公司的产品 ...

  8. 漏洞都是怎么编号的CVE/CAN/BUGTRAQ/CNCVE/CNVD/CNNVD

    在一些文章和报道中常常提到安全漏洞CVE-1999-1046这样的CVE开头的漏洞编号,这篇文章将常见的漏洞ID的表示方法做下介绍: 1.以CVE开头,如CVE-1999-1046这样的 CVE 的英 ...

  9. 通过Web安全工具Burp suite找出网站中的XSS漏洞实战(二)

    一.背景 笔者6月份在慕课网录制视频教程XSS跨站漏洞 加强Web安全,里面需要讲到很多实战案例,在漏洞挖掘案例中分为了手工挖掘.工具挖掘.代码审计三部分内容,手工挖掘篇参考地址为快速找出网站中可能存 ...

随机推荐

  1. word2vector代码实践

    引子 在上次的 <word2vector论文笔记>中大致介绍了两种词向量训练方法的原理及优劣,这篇咱们以skip-gram算法为例来代码实践一把. 当前教程参考:A Word2Vec Ke ...

  2. Netty(四)基于Netty 的简易版RPC

    3.1 RPC 概述 下面的这张图,大概很多小伙伴都见到过,这是 Dubbo 官网中的一张图描述了项目架构的演进过程 它描述了每一种架构需要的具体配置和组织形态.当网站流量很小时,只需一个应用,将所有 ...

  3. 攻防世界ctf bug

    bug 考查: 逻辑漏洞.文件内容检测绕过 ,文件头是位于文件开头的一段承担一定任务的数据,一般开头标记文件类型,如gif的gif89a,或gif87a, png的x89PNG\x0d\x0a,等等 ...

  4. μC/OS-III---I笔记10---内存管理

    内存管理: 平时经常用到一些windows内存管理的软件,有一些内存管理的软件进行内存碎片的整理,在频繁分配和释放内存的地方会造成大量的内存碎片.内存碎片是如何形成的呢?书中是这样写的:在不断的分配和 ...

  5. CSS3 弹性盒子(Flex Box)

    1 CSS3 弹性盒子(Flex Box) 1 http://caniuse.com/#search=flex%20box https://www.w3.org/TR/css-flexbox-1/ C ...

  6. Github Actions All In One

    Github Actions All In One https://github.com/features/actions https://github.com/marketplace?type=ac ...

  7. js 实现各种算法 APP

    js 实现各种算法 APP 常见算法: 排序,搜索/查找,枚举,遍历,最短路径,二叉树 open source web app desktop app react native app flutter ...

  8. xcode upgrade & git bug

    xcode upgrade & git bug ➜ op-static git checkout feature/select-seat-system Agreeing to the Xcod ...

  9. redis源码之SDS

    1:SDS介绍 我们在redis中执行命令 set key name 的时候,key和name都是字符串类型,而且字符串(string)在redis中是会经常用到的类型,那redis是如何保存字符串的 ...

  10. python常用内置方法index\extend\count\reverse\sort

    定义列表:(有2个值相同) a = ['XiaoBao','aiaoHao','biaoLiao','ciaoQing','eiaoLi','QiBao','biaoLiao'] 列表的索引: fir ...