خانه » CVE-2025-64459

CVE-2025-64459

Potential SQL injection via _connector keyword argument in QuerySet and Q objects

توسط Vulnerbyte Alerts
193 بازدید
هشدار سایبری CVE-2025-64459

چکیده

آسیب‌پذیری بحرانی SQL Injection در فریم‌ورک Django از طریق پارامتر _connector در کلاس Q و متدهای QuerySet.filter()، exclude() و get() با استفاده از dictionary unpacking (kwargs) شناسایی شده است. مهاجم بدون احراز هویت می‌تواند از راه دور کوئری‌های SQL دلخواه اجرا کند و منجر به دور زدن احراز هویت، افشای اطلاعات حساس، تغییر یا حذف داده‌ها شود.

توضیحات

آسیب‌پذیری CVE-2025-64459 ناشی از خنثی‌سازی نادرست المنت‌های ویژه در دستورات SQL مطابق با CWE-89 است. این ضعف در نحوه‌ی مدیریت پارامتر داخلی _connector در کلاس Q و منطق تولید شرط‌های WHERE در فریم‌ورک Django رخ می‌دهد.

کلاس Q در Django برای ساخت شرط‌های منطقی پیچیده در بخش WHERE کوئری‌های پایگاه داده استفاده می‌شود و امکان ترکیب شرط‌ها با رابط‌های منطقی مانند AND و OR را فراهم می‌کند. به‌صورت پیش‌فرض، مقدار پارامتر _connector برابر با AND است، اما این مقدار می‌تواند به‌صورت صریح به OR یا XOR نیز تغییر داده شود تا نحوه‌ی اتصال شرط‌ها مشخص گردد.

این ضعف امنیتی زمانی ایجاد می‌شود که توسعه‌دهندگان برای ساخت فیلترهای کوئری، از بازگشایی دیکشنری (dictionary unpacking یا kwargs) و ورودی‌های کنترل‌شده توسط کاربر، مانند request.GET یا request.POST، به‌طور مستقیم در متدهایQuerySet.filter()، QuerySet.exclude()،QuerySet.get()یا سازنده‌ی کلاس Q استفاده می‌کنند؛ الگویی که در پیاده‌سازی APIهای جستجو بسیار رایج است.

در این شرایط، اگر مهاجم پارامتر _connector را به‌عنوان یک کلید در دیکشنری ورودی ارسال کند، مقدار آن مستقیماً به‌عنوان رابط‌های منطقی اتصال شرط‌ها در ساختار منطقی شرط WHERE استفاده می‌شود. این مقدار بدون انجام اعتبارسنجی کافی، در فرآیند تولید رشته‌ی نهایی SQL به کار گرفته می‌شود و به مهاجم اجازه می‌دهد بخش های مخرب SQL را تزریق کند. برای مثال، ارسال درخواستی مانند http://example.com/search?username=guest&_connector=) OR 1=1 OR (&is_active=False، باعث تولید شرطی از نوع SQL می‌شود که به دلیل وجود عبارت OR 1=1 همواره برقرار است و در نتیجه تمامی رکوردهای پایگاه داده بازگردانده می‌شوند. این وضعیت می‌تواند منجر به دور زدن احراز هویت (Authentication Bypass)، افشای اطلاعات حساس و حتی تغییر یا حذف داده‌ها شود. این آسیب‌پذیری به‌راحتی قابل خودکارسازی است و مهاجم می‌تواند تنها با ارسال پارامتر _connector همراه با الگوهای متداول تزریق SQL، حمله را از راه دور و بدون نیاز به احراز هویت اجرا کند. همچنین، کد اثبات مفهومی (PoC) به‌صورت عمومی در GitHub منتشر شده است که شامل محیط Docker، اسکریپت حمله و نمایش عملی دور زدن احراز هویت و افشای اطلاعات کاربران (از جمله حساب‌های مدیریتی) می‌باشد. انتشار عمومی این PoC، احتمال بهره‌برداری فعال و گسترده از این ضعف را به‌طور قابل توجهی افزایش داده است.

Django این آسیب‌پذیری را به‌طور کامل پچ کرده است. در نسخه‌های پچ‌شده، مقدار پارامتر _connector به‌صورت سخت‌گیرانه اعتبارسنجی می‌شود و تنها مقادیر مجاز AND، OR یا XOR پذیرفته می‌شوند. این اقدام از تزریق مقادیر دلخواه به منطق تولید SQL جلوگیری کرده و آسیب‌پذیری را به‌طور کامل برطرف می‌کند.

CVSS

Score Severity Version Vector String
9.1 CRITICAL 3.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N

لیست محصولات آسیب پذیر

Versions Product
affected from 5.2 before 5.2.8

affected from 5.1 before 5.1.14

affected from 4.2 before 4.2.26

Django

لیست محصولات بروز شده

Versions Product
unaffected at 5.2.8

unaffected at 5.1.14

unaffected at 4.2.26

Django

استفاده محصول در ایران

در این جدول، تعداد صفحات ایندکس‌شده در گوگل با دامنه .ir که Django را ذکر کرده اند، ثبت شده است. این داده صرفاً برای برآورد تقریبی حضور محصولات در وب ایران استفاده شده و نمایانگر میزان نصب دقیق و استفاده واقعی نیست.

Approx. Usage in .ir Domain via Google

(Total Pages)

Search Query (Dork) Product
173,000 site:.ir “Django” Django

نتیجه گیری

این آسیب‌پذیری با شدت بحرانی امکان اجرای SQL Injection را از راه دور و بدون نیاز به احراز هویت فراهم می‌کند. در صورت بهره‌برداری موفق، مهاجم می‌تواند منجر به افشای اطلاعات حساس، تغییر یا حذف داده‌ها و دور زدن مکانیزم‌های احراز هویت شود. با توجه به انتشار عمومی PoC و ارائه پچ امنیتی رسمی، اجرای فوری اقدامات زیر برای جلوگیری از سوءاستفاده ضروری است:

  • به‌روزرسانی فوری: تمامی پروژه‌های مبتنی بر Django باید در اسرع وقت به نسخه‌های 2.8، 5.1.14 یا 4.2.26 به‌روزرسانی شوند. این اقدام مؤثرترین و قطعی‌ترین راهکار برای رفع آسیب‌پذیری است و باید در اولویت قرار گیرد. سایر اقدامات نقش مکمل را دارند و می‌توانند به کاهش ریسک این آسیب پذیری و مقابله با حملات مشابه کمک کنند.
  • بررسی و اصلاح کد: تمامی بخش‌های کد که از الگوهای Q(**kwargs)، filter(**kwargs)، exclude(**kwargs) و get(**kwargs) استفاده می‌کنند باید شناسایی و اصلاح شوند. هرگز ورودی کاربر را مستقیماً به‌صورت Dictionary Unpacking به این متدها ارسال نکنید. به‌جای آن، تنها فیلدهای مجاز را به‌صورت لیست سفید (Whitelist) تعریف کنید. برای مثال:
clean_filters = {k: v for k, v in request.GET.items() if k in allowed_filters}

# Now safe to unpack

User.objects.filter(**clean_filters)

 

همچنین می توان از کلاس Q به‌صورت صریح، کنترل‌شده و بدون اتکا به ورودی خام کاربر استفاده کرد.

  • استفاده از ORM به شیوه امن: از متدهای filter با پارامترهای ثابت یا شرطی که به‌صورت دستی و ایمن ساخته شده‌اند استفاده کنید و از بازگشایی دیکشنری از منابع غیرقابل اعتماد مانند GET و POST به‌طور کامل اجتناب نمایید.
  • مانیتورینگ و تشخیص: لاگ‌های پایگاه داده و کوئری‌های غیرعادی یا کُند را به‌صورت مستمر نظارت کنید. همچنین استفاده از فایروال اپلیکیشن وب (WAF) مانند ModSecurity یا Cloudflare WAF با قوانین مخصوص تزریق SQL توصیه می‌شود.
  • محدودسازی دسترسی شبکه: دسترسی به اپلیکیشن Django را با فایروال، شبکه‌های خصوصی مجازی (VPN) یا شبکه‌های خصوصی ابری (VPC) محدود کنید تا سطح حمله کاهش یابد.
  • تست نفوذ و ممیزی امنیتی: پس از اعمال به‌روزرسانی‌ها، تست نفوذ روی تمامی اندپوینت‌های مرتبط با جستجو و فیلتر انجام دهید تا اطمینان حاصل شود هیچ الگوی کدنویسی آسیب‌پذیری در سیستم باقی نمانده است.

اجرای سریع به‌روزرسانی‌ها و اصلاح الگوهای کدنویسی آسیب‌پذیر، ریسک بهره‌برداری از این آسیب‌پذیری بحرانی را به‌طور قابل توجهی کاهش داده و امنیت برنامه‌های مبتنی بر Django را در برابر حملات تزریق SQL تضمین می‌کند.

امکان استفاده در تاکتیک های Mitre Attack (در زمان اجرای حمله)

Initial Access (TA0001)
مهاجم با ارسال درخواست HTTP ساده به APIهای جستجو یا فیلترهای عمومی Django که از ورودی‌های کاربر در QuerySet یا Q objects استفاده می‌کنند، بدون نیاز به احراز هویت وارد سیستم می‌شود و شرط‌های WHERE را دستکاری می‌نماید. شرط کلیدی در اینجا وجود الگوی توسعه‌ای ناامن است که دیکشنری ورودی کاربر را مستقیماً unpack کرده و پارامتر _connector را بدون اعتبارسنجی بپذیرد، تا مهاجم بتواند منطق SQL را تغییر دهد و دسترسی اولیه را برقرار سازد.

Execution (TA0002)
در این فاز، مهاجم با تزریق مقدار مخرب در پارامتر _connector از طریق request.GET یا POST، کوئری SQL دلخواه را در backend اجرا می‌کند که منجر به پردازش شرط‌های دستکاری‌شده توسط ORM Django می‌گردد. لازمه موفقیت، عدم اعمال محدودیت روی مقادیر connector در سمت سرور است، به طوری که عبارات تزریقی مانند الگوهای منطقی نادرست مستقیماً به رشته SQL تبدیل شده و بدون پاکسازی اجرا گردند.

Credential Access (TA0006)
پس از اجرای کوئری مخرب، مهاجم اطلاعات احراز هویت کاربران از جمله هش رمزهای عبور، توکن‌های جلسه و جزئیات حساب‌های مدیریتی را استخراج می‌کند، زیرا شرط‌های دور زده‌شده تمام رکوردها را افشا می‌نماید. این گام وابسته به ساختار پایگاه داده است که فیلدهای حساس را در جداول کاربران ذخیره کرده و API هدف بدون pagination یا محدودیت خروجی عمل کند.

Discovery (TA0007)
مهاجم با تحلیل نتایج کوئری‌های موفق، ساختار پایگاه داده، جداول موجود، ستون‌ها و روابط بین داده‌ها را کشف می‌کند تا نقاط ضعف بعدی را شناسایی نماید. شرط لازم، قابلیت اجرای کوئری‌های متوالی بدون rate limiting یا logging مشکوک است، که اجازه می‌دهد مهاجم به تدریج schema کامل را نقشه‌برداری کرده و سرویس‌های وابسته را بیابد.

Collection (TA0009)
داده‌های حساس استخراج‌شده از پایگاه داده به صورت batch جمع‌آوری و به سرور مهاجم منتقل می‌شوند، اغلب از طریق خروجی JSON API یا دانلود مستقیم رکوردها. موفقیت این مرحله به پایداری اتصال وب و عدم وجود مکانیزم‌های دفاعی مانند WAF که الگوهای SQLi را مسدود کنند، بستگی دارد تا حجم بالایی از اطلاعات بدون اختلال گردآوری گردد.

Impact (TA0040)
بهره‌برداری از این آسیب‌پذیری محرمانگی کامل داده‌های کاربران را نابود کرده و امکان دور زدن احراز هویت، سرقت اطلاعات حساس، تغییر یا حذف رکوردهای پایگاه داده را فراهم می‌آورد؛ در نهایت سایت به ابزاری برای حملات گسترده تبدیل شده و مالک با ریسک افشای عمومی داده‌ها، نقض قوانین حریم خصوصی و از دست دادن اعتماد کاربران روبرو می‌گردد، مگر آنکه پچ Django فوراً اعمال شود.

منابع

  1. https://www.cve.org/CVERecord?id=CVE-2025-64459
  2. https://www.cvedetails.com/cve/CVE-2025-64459/
  3. https://docs.djangoproject.com/en/dev/releases/security/
  4. https://www.djangoproject.com/weblog/2025/nov/05/security-releases/
  5. https://vulmon.com/vulnerabilitydetails?qid=CVE-2025-64459
  6. https://vuldb.com/?id.331275
  7. https://shivasurya.me/security/django/2025/11/07/django-sql-injection-CVE-2025-64459.html
  8. https://github.com/stanly363/CVE-2025-64459-Poc
  9. https://nvd.nist.gov/vuln/detail/CVE-2025-64459
  10. https://cwe.mitre.org/data/definitions/89.html

همچنین ممکن است دوست داشته باشید

پیام بگذارید