漏洞簡介
Django 在2022年發(fā)布的安全更新,修復了在 QuerySet 的 annotate(), aggregate(), extra() 等函數(shù)中存在的 SQL 注入漏洞。
影響版本
2.2<= Django Django <2.2.28?3.2<= Django Django <3.2.13?4.0<= Django Django <4.0.4
需要使用了 annotate 或者 aggregate 或 extra 方法
環(huán)境搭建
搭建特定版本的 django 項目
利用 pycharm 創(chuàng)建一個 python 項目
?
創(chuàng)建完成項目后在 Settings 中找到 Project: CVE202228346 對應的 Python Interpreter
添加存在問題的 Django 版本
?
在 Terminal 中執(zhí)行命令,創(chuàng)建 django 項目
django-admin startproject CVE202228346
?
?
配置啟動設置
?
?
運行后就啟動了最簡單的 django 項目
?
?
編寫配置漏洞代碼
折騰來折騰去,出現(xiàn)了很多問題,一度想要放棄說直接采用 docker ,但是在不斷的試錯下,最終還是編寫成功
因為對 python 的 django 不太熟悉,所以其中可能更多的是比較偏向于基礎的操作
【----幫助網(wǎng)安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網(wǎng)安學習成長路徑思維導圖
?、?60+網(wǎng)安經(jīng)典常用工具包
?、?100+SRC漏洞分析報告
④ 150+網(wǎng)安攻防實戰(zhàn)技術電子書
?、?最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰(zhàn)技巧手冊
?、?最新網(wǎng)安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
進入到項目目錄下創(chuàng)建命令 創(chuàng)建第一個應用
?
在 settings.py 中添加配置
在 urls.py 中添加 對應的 url,urls.py 相當于路由解析器,將路由解析到對應的 views.py 中對應的函數(shù)上
?
urlpatterns = [
? ?path('admin/', admin.site.urls),
? ?path('index/',views.index),
? ?path('demo/',views.users),
? ?path('initialize/',views.loadexampledata)
]
?
models.py 是創(chuàng)建表結構的時候使用,通過類的定義,可以創(chuàng)建一個表
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 主要定義了對應路由所響應的函數(shù)
?
from django.db.models import Count
from django.http import HttpResponse
from django.shortcuts import render
from .models import User
?
# Create your views here.
def index(request):
? ?return HttpResponse('hello world')
?
def users(request):
? ?field = request.GET.get('field', 'name')
? ?user_amount = User.objects.annotate(**{field: Count("name")})
? ?html = ""
? ?for u in user_amount:
? ? ? ?html += "<h3>Amoount of users: {0}</h3>".format(u)
? ?return HttpResponse(html)
?
def loadexampledata(request):
? ?u = User(name="Admin")
? ?u.save()
? ?u = User(name="Staff1")
? ?u.save()
? ?u = User(name="Staff12")
? ?u.save()
? ?return HttpResponse("ok")
三個函數(shù)分別是 helloword 函數(shù),往數(shù)據(jù)庫中加參數(shù),以及查詢數(shù)據(jù)庫中的字段
?
編寫好代碼后,需要對數(shù)據(jù)庫執(zhí)行初始化操作
python manage.py makemigrations
python manage.py migrate
?
漏洞復現(xiàn)
先訪問 initialize 為數(shù)據(jù)庫中添加信息
構造 payload
http://127.0.0.1:8000/demo/?field=demo.name" FROM "demo_user" union SELECT "1",sqlite_version(),"3" --
?
漏洞分析
發(fā)現(xiàn)一個問題,在加上斷點調試以后,每次運行輸出的結果跟不加斷點運行的結果存在很大的差異,結果完全不同。不斷嘗試之后發(fā)現(xiàn)是因為在某些地方加上斷點之后,在調試器中查看變量和狀態(tài)可能會影響程序的執(zhí)行速度和內存使用情況,為了方便的輸出某些位置的變量,采用 print 的方法結合斷點調試。
通過 get 傳入的參數(shù) field
CVE202228346.demo.views.users
?
此處的**{field: Count("name")}
? 用來表示拆分字典
跟進?annotate
? 對傳入?yún)?shù)的處理
django.db.models.query.QuerySet.annotate
?
?
繼續(xù)將參數(shù)傳入到?_annotate
? 進行處理
django.db.models.query.QuerySet._annotate
?
在將?kwargs
? 的值?update
? 到?annotations
? 后,調用?add_annotation
? 進行處理
django.db.models.sql.query.Query.add_annotation
??
add_annotation
? 也是漏洞存在的關鍵位置,因為修復漏洞的關鍵位置也在此處
調用?resolve_expression
? 解析表達式
django.db.models.aggregates.Aggregate.resolve_expression
?
?
django.db.models.expressions.Func.resolve_expression
?
?
django.db.models.expressions.F.resolve_expression
??
?
django.db.models.sql.query.Query.resolve_ref
?
最后我們可以看到 clone 對應的值 以及執(zhí)行的 SQL 語句
整個漏洞分析下來,仍然有很多不太清楚的地方,可能再分析幾個關于 Django 的漏洞會好一些
?
漏洞修復
在?add_annotation
? 添加了?check_alias
? 來對傳入的參數(shù)進行校驗
更多網(wǎng)安技能的在線實操練習,請點擊這里>>文章來源:http://www.zghlxwxcb.cn/news/detail-438635.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-438635.html
到了這里,關于Django SQL注入漏洞分析(CVE-2022-28346)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!