ORM Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
この投稿では、例えば次のようなコードを使用することでDjango ORMを脆弱にする方法が説明されています。
すべてのrequest.data(これはjsonになります)がデータベースからオブジェクトをフィルタリングするために直接渡されることに注意してください。攻撃者は予期しないフィルターを送信することで、予想以上のデータを漏洩させることができます。
例:
ログイン: 簡単なログインで、登録されているユーザーのパスワードを漏洩させようとします。
パスワードをブルートフォースして漏洩させることが可能です。
リレーショナルフィルタリング: 操作に使用されることすら予想されていなかった列から情報を漏洩させるために、リレーションを横断することが可能です。例えば、次のリレーションを持つユーザーによって作成された記事を漏洩させることが可能であれば: Article(created_by
) -[1..1]-> Author (user
) -[1..1]-> User(password
).
すべての記事を作成したユーザーのパスワードを見つけることが可能です
多対多のリレーショナルフィルタリング: 前の例では、記事を作成していないユーザーのパスワードを見つけることができませんでした。しかし、他のリレーションシップを追うことでこれは可能です。例えば: Article(created_by
) -[1..1]-> Author(departments
) -[0..*]-> Department(employees
) -[0..*]-> Author(user
) -[1..1]-> User(password
).
この場合、記事を作成したユーザーの部門にいるすべてのユーザーを見つけ、その後にパスワードを漏洩させることができます(前のjsonではユーザー名を漏洩させているだけですが、その後にパスワードを漏洩させることが可能です)。
Djangoのグループと権限の多対多関係をユーザーと悪用する: さらに、AbstractUserモデルはDjangoでユーザーを生成するために使用され、デフォルトでこのモデルにはPermissionおよびGroupテーブルとの多対多関係があります。これは基本的に、同じグループにいるか、同じ権限を共有している場合に、1人のユーザーから他のユーザーにアクセスするためのデフォルトの方法です。
フィルター制限のバイパス: 同じブログ投稿では、articles = Article.objects.filter(is_secret=False, **request.data)
のようなフィルタリングの使用をバイパスすることが提案されました。is_secret=Trueのアーティクルをダンプすることが可能です。なぜなら、リレーションシップからArticleテーブルに戻ることができ、非秘密の記事から秘密の記事を漏洩させることができるからです。結果は結合され、is_secretフィールドは非秘密の記事でチェックされる一方で、データは秘密の記事から漏洩します。
関係を悪用することで、表示されるデータを保護するためのフィルターをバイパスすることが可能です。
エラー/時間ベースのReDoS: 前の例では、フィルタリングが機能しているかどうかによって異なる応答が得られることが期待されていましたが、それをオラクルとして使用するためです。しかし、データベースで何らかのアクションが行われ、応答が常に同じである可能性もあります。このシナリオでは、データベースエラーを発生させて新しいオラクルを得ることが可能かもしれません。
SQLite: デフォルトではregexpオペレーターがありません(サードパーティの拡張機能を読み込む必要があります)
PostgreSQL: デフォルトのregexタイムアウトがなく、バックトラッキングに対してより耐性があります
MariaDB: regexタイムアウトがありません
以下はこの投稿から抽出されたトリックです。
完全な検索制御:
全てのJavaScriptボディがprismaに渡されてクエリを実行することが可能です。
元の投稿の例では、これは誰かによって作成されたすべての投稿をチェックし(各投稿は誰かによって作成されます)、その誰かのユーザー情報(ユーザー名、パスワードなど)も返します。
以下は、パスワードを持つ誰かによって作成されたすべての投稿を選択し、パスワードを返します:
完全な where 句の制御:
攻撃者が where
句を制御できる状況を見てみましょう:
ユーザーのパスワードを直接フィルタリングすることが可能です:
startsWith
のような操作を使用すると、情報が漏洩する可能性があります。
多対多のリレーショナルフィルタリングによるフィルタリングのバイパス:
Category
-[*..*]-> Article
の多対多の関係を利用して、未公開の記事を漏洩させることが可能です:
すべてのユーザーを漏洩させることも可能であり、いくつかのループバック多対多関係を悪用することができます:
エラー/タイムクエリ: 元の投稿では、タイムベースのペイロードを使用して情報を漏洩させるための最適なペイロードを見つけるために実施された非常に広範なテストセットを読むことができます。これは:
Where the {CONTAINS_LIST}
は、正しい漏洩が見つかったときに応答が遅延することを確認するための1000の文字列のリストです。
これらのトリックはこの投稿で見つかりました。
Ransack 4.0.0.0では、検索可能な属性と関連付けのために明示的な許可リストの使用が強制されることに注意してください。
脆弱な例:
注意してください、クエリは攻撃者によって送信されたパラメータによって定義されます。例えば、リセットトークンをブルートフォースすることが可能でした:
ブルートフォースと潜在的な関係を利用することで、データベースからより多くのデータを漏洩させることが可能でした。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)