RadvanSec
1.04K subscribers
189 photos
27 videos
144 files
605 links
"Security is Just an Illusion"
" امنیت فقط یک توهم است "

RadvanSec.com

Youtube , Instagram : @RadvanSec
Download Telegram
🔴 آسیب پذیری از نوع SQL injection با شناسه ی CVE-2025-57833 در جنگو اصلاح شده که امتیاز 7.1 و شدت بالا داره.

نسخه های تحت تاثیر:

- Django main
- Django 5.2
- Django 5.1
- Django 4.2

نسخه های اصلاح شده: نسخه های 4.2.24, 5.1.12, 5.2.6 و بالاتر

آسیب ‌پذیری در عملکرد FilteredRelation رخ میده و زمانی فعال میشه که به همراه expansionِ **kwargs در متدهای QuerySet.annotate یا QuerySet.alias استفاده بشه.

- تابع FilteredRelation یک قابلیت ORM در Django هست که امکان میده روی یک رابطه (مثل ForeignKey) شرط بزنیم. مثلا کد زیر فقط کامنتهای فعال هر پست میگیره:


qs = Post.objects.annotate(
active_comments=FilteredRelation("comments", condition=Q(comments__is_active=True))
)

- متد annotate برای اضافه کردن ستونهای محاسباتی (مثل count، sum) به کوئری استفاده میشه.

- متد alias دقیقاً مثل annotate هستش، ولی ستون جدید ایجاد نمیکنه، فقط یک اسم مستعار روی عبارت SQL میذاره.

مثلا در کد زیر num_comments یک alias برای COUNT(comments) میشه.


qs = Post.objects.annotate(num_comments=Count("comments"))


- در پایتون وقتی تابعی صدا زده میشه، میشه پارامترها رو مستقیم داد، یا اینکه از dict** استفاده کرد. در حالت مستقیم:


greet(name="onhexgroup", age=25)


بصورت dict** :


info = {"name": "onhexgroup", "age": 25}
greet(**info)

در این حالت پایتون محتویات دیکشنری رو بشکل keyword argument باز میکنه یعنی معادل این میشه:


greet(name="onhexgroup", age=25)


در جنگو هم اگه این داشته باشیم:


user_alias = "custom_label" # ورودی کاربر
qs = Order.objects.annotate(**{user_alias: F("payment__amount")})
print(str(qs.query))


خروجی SQL:


SELECT "myapp_order"."id",
"myapp_payment"."amount" AS "custom_label"
FROM "myapp_order"
LEFT OUTER JOIN "myapp_payment"
ON ("myapp_order"."id" = "myapp_payment"."order_id");


در جنگو همیشه alias داخل "" قرار میگیره اما در FilteredRelation وقتی alias از طریق kwargs وارد میشه، alias بصورت خام میره داخل SQL. بنابراین اگه مهاجم این ورودی رو بده:


user_alias = 'custom_label"; DROP TABLE users; --'
qs = Order.objects.annotate(**{user_alias: F("payment__amount")})
print(str(qs.query))

تبدیل میشه به :
‍‍

sql
SELECT "myapp_order"."id",
"myapp_payment"."amount" AS custom_label"; DROP TABLE users; --
FROM "myapp_order"


و در نتیجه SQLinjection فعال میشه.

اینجا میتونید رایت آپ کامل و POC این آسیب پذیری رو بررسی کنید.

#جنگو #پایتون
#Django #SQLInjection #SQLi

⭐️ @ZeroSec_team
8
⚠️ 𝗖𝗿𝗶𝘁𝗶𝗰𝗮𝗹 𝗩𝘂𝗹𝗻𝗲𝗿𝗮𝗯𝗶𝗹𝗶𝘁𝘆 𝗶𝗻 𝗗𝗷𝗮𝗻𝗴𝗼 𝗙𝗿𝗮𝗺𝗲𝘄𝗼𝗿𝗸
The Django library has announced a very critical vulnerability (CVE-2025-57833) that allows attackers to perform SQL Injection on servers using the framework

🔍 𝗪𝗵𝗮𝘁 𝗵𝗮𝗽𝗽𝗲𝗻𝗲𝗱?
• The flaw is in the FilteredRelation component inside the ORM.
• An attacker can exploit it by passing a specially crafted dictionary to QuerySet.annotate() or QuerySet.alias().
• Result: SQL Injection = ability to manipulate queries, access sensitive data, or even take full control of the server.

⚠️ 𝗔𝗳𝗳𝗲𝗰𝘁𝗲𝗱 𝘃𝗲𝗿𝘀𝗶𝗼𝗻𝘀:
• Django 5.2
• Django 5.1
• Django 4.2 (LTS)
• And also the main development branch.

🛡️ 𝗪𝗵𝗮𝘁’𝘀 𝘁𝗵𝗲 𝘀𝗼𝗹𝘂𝘁𝗶𝗼𝗻?
Immediate update required to:
• Django 5.2.6
• Django 5.1.12
• Django 4.2.24
-
#CyberSecurity
#Django
#SQLInjection
#CVE2025

⭐️ @ZeroSec_team
👍53