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

相关推荐

  • 二月最新漏洞列表

    Apache IoTDB-Workbench <0.13.3 存在身份验证绕过漏洞(CVE-2023-24829),Apache Linkis <1.3.1 任意客户端文件读取漏洞(CVE-2022-44644),Apache Linkis <1.3.1 存在反序列化漏洞(CVE-2022-44645),Apache InLong 存在任意文件读取漏洞(CVE-2023-24977)

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

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

    2023年2月6日
  • Ghost 博客系统后台代码执行漏洞分析

    漏洞简述 Ghost 是以Node.js语言开发的一款开源博客程序,在Github上其star为超过4万。 漏洞分析 漏洞因为需要后台权限,有一定利用条件,有趣的点在于Ghost的RCE漏洞是由于moment.js下的路径遍历和文件包含漏洞,再加上Ghost中的文件上传和指定locale功能。moment.js中的文件包含漏洞,在一般情况下可能影响较小,但结…

    2023年1月4日
  • Apache IoTDB grafana-connector模块SQL注入分析

    漏洞简述 Apache IoTDB 是面向IoT场景存储时序数据的数据管理系统,具备跟Grafana、spark等系统的集成能力。 4月8日,IoTDB 修复了其中 grafana-connector 模块中的 SQL 注入漏洞。 由于 grafana-connector 模块中 BasicDaoImpl 类的 querySeriesInternal 方法存…

    2023年1月4日
  • Onedev v7.4.14 路径遍历漏洞分析(CVE-2022-38301)

    漏洞简述 OneDev 是开源的一体化轻量DevOps平台,在OneDev 7.4.14及以前版本中存在路径遍历漏洞,具有项目管理权限的攻击者可以将恶意 jar 文件上传到 lib 目录,覆盖原有jar包,攻击者可利用此漏洞在服务器中写入任意文件或远程执行恶意代码。 漏洞分析 问题代码分析 项目管理员可以在 OneDev 的`build`模块对自己的一个项目…

    2023年1月9日

发表回复

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

联系我们

400-180-9568

邮件:hi@murphysec.com

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

关注公众号

20230105-100741