Django Trunc 和 Extract 方法存在 SQL 注入漏洞(CVE-2022-34265)

漏洞简述

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

7月4日,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版本修复此问题

漏洞分析

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

Django Trunc 和 Extract 方法存在 SQL 注入漏洞(CVE-2022-34265)

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

Django Trunc 和 Extract 方法存在 SQL 注入漏洞(CVE-2022-34265)

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

(test_extract_trunc.py)test_extract_lookup_name_sql_injection
                                |
                    (manager.py)manager_method
                                |
                    (models/query.py)filter
                                |
                (models/query.py)_filter_or_exclude
                                |
              (models/query.py)_filter_or_exclude_inplace
                                |
                   (models/sql/query.py)add_q
Django Trunc 和 Extract 方法存在 SQL 注入漏洞(CVE-2022-34265)

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

Django Trunc 和 Extract 方法存在 SQL 注入漏洞(CVE-2022-34265)

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

def test_trunc_lookup_name_sql_injection(self):
        start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321)
        end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123)
        if settings.USE_TZ:
            start_datetime = timezone.make_aware(start_datetime)
            end_datetime = timezone.make_aware(end_datetime)
        self.create_model(start_datetime, end_datetime)
        self.create_model(end_datetime, start_datetime)
        msg = "Invalid kind: "
        with self.assertRaisesMessage(ValueError, msg):
            DTModel.objects.filter(
                start_datetime__date=Trunc(
                    "start_datetime",
                    "year', start_datetime)) OR 1=1;--",
                )
            ).exists()

风险场景

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

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

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

参考链接

https://www.oscs1024.com/hd/MPS-2022-19581

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

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

https://github.com/django/django/commit/54eb8a374d5d98594b264e8ec22337819b37443c

https://docs.djangoproject.com/zh-hans/4.0/ref/models/database-functions/

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

发布者:墨菲安全,转发请注明出处:https://www.murphysec.com/blog/vulnerability-analysis/4312.html

(1)
上一篇 2023年1月4日 18:45
下一篇 2023年1月5日 14:17

相关推荐

  • 被忽视15年的Python漏洞 导致35万项目陷入代码执行风险

    Python 编程语言中一个被忽视了 15 年的漏洞现在重新成为人们关注的焦点,它可能影响超过 350,000 个开源存储库并可能影响代码执行。

    2023年2月6日
  • “Dirty Pipe”的故事-Linux 内核提权漏洞 (CVE-2022-0847)

    漏洞简述 3月7日,开发者 Max Kellermann 在他的博客(https://dirtypipe.cm4all.com/)中披露了一个能导致 Linux 权限提升的漏洞,编号为 CVE-2022-0847,他称之为 “The Dirty Pipe Vulnerability” (“脏管道”漏洞)。 Linux 5.10版本前的一次 commit 中,…

    2023年1月4日
  • CVE-2023-23752 Joomla未授权访问漏洞分析

    Joomla 在海外使用较多,是一套使用 PHP 和 MySQL 开发的开源、跨平台的内容管理系统(CMS)。Joomla 4.0.0 至 4.2.7 版本中的 ApiRouter.php#parseApiRoute 在处理用户的 Get 请求时为对请求参数有效过滤,导致攻击者可向 Joomla 服务端点发送包含 public=true 参数的请求

    2023年2月23日
  • Apache Spark UI 命令注入漏洞(CVE-2022-33891)

    OSCS(开源软件供应链安全社区)推出免费的漏洞、投毒情报订阅服务,社区用户可通过机器人订阅情报信息,具体订阅方式详见:https://www.oscs1024.com/?src=wx 漏洞概述 7月18日,OSCS监测到Apache发布安全公告,修复了一个Apache Spark UI中存在的命令注入漏洞。漏洞编号:CVE-2022-33891,漏洞威胁等…

    漏洞分析 2023年1月5日
  • Apache ShardingSphere-Proxy <5.3.0 身份认证绕过(CVE-2022-45347)

    漏洞简介 2022年12月22日,Apache 官方公告发布 ShardingSphere-Proxy 5.3.0 之前版本存在身份绕过漏洞(CVE-2022-45347)。当 ShardingSphere-Proxy 使用 MySQL 作为后端数据库时,由于 ShardingSphere-Proxy 在客户端认证失败后没有完全清理数据库会话信息,攻击者可利…

    2023年1月9日

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-180-9568

邮件:hi@murphysec.com

工作时间:周一至周五,10:00-19:00,节假日休息

关注公众号

20230105-100741