大数跨境

Python Web 框架 Django 修复SQL注入漏洞(附详细分析)

Python Web 框架 Django 修复SQL注入漏洞(附详细分析) OSCS
2022-07-06
0
导读:7月4日,OSCS 监测到 Django 官方修复了一个SQL注入漏洞。如果 Trunc() 方法的 kind 参数和 Extract()的 lookup_name 参数没有进行安全过滤,可能会造成S
OSCS(开源软件供应链安全社区)推出免费的漏洞、投毒情报订阅服务,社区用户可通过机器人订阅情报信息:https://www.oscs1024.com/?src=wx


漏洞概述


Django 是一个由 Python 语言编写的开源 Web 应用框架,Github 上 star 为 64.9K。


Python 开发者使用 Django 可以快速开发、设计和部署网站。


7月4日,OSCS 监测到 Django 官方修复了一个 SQL 注入漏洞。如果 Trunc() 方法的 kind 参数和 Extract() 方法的 lookup_name 参数没有进行安全过滤,可能会造成 SQL 注入的风险,建议各位开发者关注。


  • 漏洞影响等级:高危

  • 利用条件:

    • 代码中使用了 Trunc() 和 Extract() 方法

    • 其中 kind 参数和 lookup_name 参数可控

  • 利用成本:低

  • 影响版本:(∞, 3.2.14),[4.0, 4.0.6),官方已经在 4.0.6、3.2.14 版本修复此问题

  • CVE编号:CVE-2022-34265


更多漏洞详细信息可进入 OSCS 社区查看:https://www.oscs1024.com/hd/MPS-2022-19581


漏洞分析



以 Django 4.0 版本为例,可以通过官方提供的测试用例进行验证。


Extract() 方法将数据处理后返回一个 Extract 类型的对象,lookup_name 参数是传入的恶意数据。


DTModel.objects.filter 方法通过下图链路拼接出有恶意数据的 SQL 语句


add_q 方法中 self.where.add() 则会将 lookup_name 拼接到 SQL 语句的 WHERE 部分


官方通告中数据库函数 Trunc,利用条件与 Extract 相同,测试用例如下:


风险场景


Extract() 方法的作用是提取日期的某部分为一个数字,内置的 lookup_name 参数指定返回数字是指定时间的对应部分,如当 lookup_name = 'year',返回年份。


Trunc() 方法也是将一个日期截断为一个部分,其中的 kind 参数与 lookup_name 参数功能类似。


因此,如果业务逻辑中有类似时间截取的逻辑,对应的 year、day 等参数由前端传入(用户可控,如选择时间等逻辑)的话,攻击者可以加入 payload,从而对数据库进行操作。


修复方案


将组件 Django 升级至 3.2.14 及以上版本

将组件 Django 升级至 4.0.6 及以上版本


参考链接

https://www.openwall.com/lists/oss-security/2022/07/04/2

https://nvd.nist.gov/vuln/detail/CVE-2022-34265

https://www.djangoproject.com/weblog/2022/jul/04/security-releases/






扫码关注我们

获取最新安全情报

【声明】内容源于网络
0
0
OSCS
携手全球开发者,共建开源生态安全
内容 0
粉丝 0
OSCS 携手全球开发者,共建开源生态安全
总阅读0
粉丝0
内容0