漏洞簡介
Django 在2022年發布的安全更新,修復了在 QuerySet 的 annotate(), aggregate(), extra() 等函式中存在的 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 方法
環境搭建
搭建特定版本的 django 專案
利用 pycharm 創建一個 python 專案
?
創建完成專案后在 Settings 中找到 Project: CVE202228346 對應的 Python Interpreter
添加存在問題的 Django 版本
?
在 Terminal 中執行命令,創建 django 專案
django-admin startproject CVE202228346?
?
配置啟動設定
?
?
運行后就啟動了最簡單的 django 專案
?

?
撰寫配置漏洞代碼
折騰來折騰去,出現了很多問題,一度想要放棄說直接采用 docker ,但是在不斷的試錯下,最侄訓是撰寫成功
因為對 python 的 django 不太熟悉,所以其中可能更多的是比較偏向于基礎的操作
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
進入到專案目錄下創建命令 創建第一個應用
?
在 settings.py 中添加配置
在 urls.py 中添加 對應的 url,urls.py 相當于路由決議器,將路由決議到對應的 views.py 中對應的函式上
?
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 主要定義了對應路由所回應的函式
?
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")
三個函式分別是 helloword 函式,往資料庫中加引數,以及查詢資料庫中的欄位
?
撰寫好代碼后,需要對資料庫執行初始化操作
python manage.py makemigrations
python manage.py migrate
?
漏洞復現
先訪問 initialize 為資料庫中添加資訊
構造 payload
http://127.0.0.1:8000/demo/?field=demo.name" FROM "demo_user" union SELECT "1",sqlite_version(),"3" --
?
漏洞分析
發現一個問題,在加上斷點除錯以后,每次運行輸出的結果跟不加斷點運行的結果存在很大的差異,結果完全不同,不斷嘗試之后發現是因為在某些地方加上斷點之后,在除錯器中查看變數和狀態可能會影響程式的執行速度和記憶體使用情況,為了方便的輸出某些位置的變數,采用 print 的方法結合斷點除錯,

通過 get 傳入的引數 field
CVE202228346.demo.views.users?

此處的**{field: Count("name")}? 用來表示拆分字典
跟進 annotate? 對傳入引數的處理
django.db.models.query.QuerySet.annotate?
?
繼續將引數傳入到 _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 對應的值 以及執行的 SQL 陳述句
整個漏洞分析下來,仍然有很多不太清楚的地方,可能再分析幾個關于 Django 的漏洞會好一些
?
漏洞修復
在 add_annotation? 添加了 check_alias? 來對傳入的引數進行校驗
更多網安技能的在線實操練習,請點擊這里>>
合天智匯:合天網路靶場、網安實戰虛擬環境
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552227.html
標籤:其他
上一篇:IntelliJ IDEA 最新激活碼:2023、2022及以下版本通用(親測有效)
下一篇:返回列表
