网络知识 娱乐 Python Web 框架 Django 修复SQL注入漏洞(附详细分析)

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

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 版本为例,可以通过官方提供的测试用例进行验证。

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

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

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

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

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

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

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

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

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

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

风险场景

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/