django order by注入分析CVE-2021-35042

该博客探讨了Django 3.1.13版本中关于`order_by`函数的安全问题。当使用表名.列名的方式进行排序时,可能导致SQL注入。通过`add_ordering`函数的警告和跳过安全验证的`continue`语句,攻击者可能利用这个漏洞插入恶意代码。修复方案是更新到Django 4.0及以上版本,因为新版本已不再支持这种排序方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

django-3.1.13下载地址
首先调用order_by函数的位置:django/db/models/query.py
在这里插入图片描述
函数做了两件事,一是清除当前所有的通过order_by函数调用的方法,也就清除Query类中的self.order_by参数。第二件事就是增加self.order_by参数

跟进add_ordering函数django/db/models/sql/query.py
在这里插入图片描述
这里有问题的地方是if '.' in item and ORDER_PATTERN.match(item):

django的orderby支持使用表名.列明的方式传参来进行排序
例如:order_by(app_article.name)
当传入的参数有.的时候会执行warnings.warn()并且执行continue

一旦执行continue就跳过了下面的self.names_to_path(item.split(LOOKUP_SEP), self.model._meta)而此函数是对参数进行安全验证的

如果去掉此continue,则会报错

然后具体处理表和列的文件在django/db/models/sql/conpiler.py
可以看到使用了self.quote_name_unless_alias来过滤table,而并没有对col进行过滤所。以导致在col处可以插入代码
在这里插入图片描述
利用:

http://your-ip:8000/vuln/?order=vuln_collection.name);select updatexml(1, concat(0x7e,(select @@version)),1)%23

请添加图片描述

修复:django4.0版本不支持使用表名.列明进行orderby查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值