diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 2445e641e..68541dbef 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -57,7 +57,7 @@ query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofTy **エラー** -**エラー**が**表示**されるかどうかを知ることは興味深いことであり、それは有用な**情報**に貢献します。 +**エラー**が**表示**されるかどうかを知ることは興味深いです。これは有用な**情報**に貢献します。 ``` ?query={__schema} ?query={} @@ -170,9 +170,9 @@ name ### クエリ -データベース内にどのような情報が保存されているかがわかったので、**いくつかの値を抽出してみましょう**。 +データベースにどのような情報が保存されているかがわかったので、**いくつかの値を抽出してみましょう**。 -イントロスペクションでは、**どのオブジェクトを直接クエリできるか**を見つけることができます(オブジェクトが存在するからといってクエリできるわけではありません)。次の画像では、"_queryType_"が"_Query_"と呼ばれ、"_Query_"オブジェクトのフィールドの1つが"_flags_"であり、これもオブジェクトのタイプであることがわかります。したがって、フラグオブジェクトをクエリできます。 +イントロスペクションでは、**どのオブジェクトを直接クエリできるか**を見つけることができます(オブジェクトが存在するからといって、クエリできるわけではありません)。次の画像では、"_queryType_"が"_Query_"と呼ばれ、"_Query_"オブジェクトのフィールドの1つが"_flags_"であり、これもオブジェクトのタイプであることがわかります。したがって、フラグオブジェクトをクエリできます。 ![](<../../images/Screenshot from 2021-03-13 18-17-48.png>) @@ -184,7 +184,7 @@ name ```javascript query={flags{name, value}} ``` -次の例のように、**クエリするオブジェクト**が**文字列**のような**プリミティブ****タイプ**である場合は、次のようにクエリできます: +次の例のように、**クエリするオブジェクト**が**プリミティブ****タイプ**(例えば**文字列**)の場合は、次のようにクエリできます。 ```javascript query = { hiddenFlags } ``` @@ -207,7 +207,7 @@ query = { hiddenFlags } ![](<../../images/image (90).png>) -注意すべきは、**パラメータ** "_**user**_" と "_**password**_" を要求できることを **発見** したことです。存在しないものを探そうとすると (`query={user(uid:1){noExists}}`) このエラーが発生します: +私は、**パラメータ** "_**user**_" と "_**password**_" を要求できることを **発見** したことに注意してください。なぜなら、存在しないものを探そうとすると (`query={user(uid:1){noExists}}`) このエラーが発生するからです: ![](<../../images/image (707).png>) @@ -219,7 +219,7 @@ query = { hiddenFlags } ### 検索 -このセットアップでは、**データベース**には **人** と **映画** が含まれています。 **人** は **メール** と **名前** で識別され、**映画** は **名前** と **評価** で識別されます。 **人** は互いに友達になり、映画を持つこともでき、データベース内の関係を示します。 +このセットアップでは、**データベース**には **人** と **映画** が含まれています。 **人** はその **メール** と **名前** で識別され、**映画** はその **名前** と **評価** で識別されます。 **人** は互いに友達になったり、映画を持ったりでき、データベース内の関係を示します。 **名前** で人を **検索** し、彼らのメールを取得できます: ```javascript @@ -335,7 +335,7 @@ releaseYear ### 1つのAPIリクエストでのバッチブルートフォース この情報は[https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/)から取得されました。\ -**異なる認証情報で多くのクエリを同時に送信する**ことでGraphQL APIを通じて認証を行います。これは古典的なブルートフォース攻撃ですが、GraphQLのバッチ機能により、1つのHTTPリクエストで複数のログイン/パスワードペアを送信することが可能になりました。このアプローチは、外部のレート監視アプリケーションを欺いて、すべてが正常であり、パスワードを推測しようとするブルートフォースボットがいないと考えさせることができます。 +**異なる認証情報で多くのクエリを同時に送信する**ことでGraphQL APIを通じて認証を行います。これは古典的なブルートフォース攻撃ですが、GraphQLのバッチ機能により、HTTPリクエストごとに1つ以上のログイン/パスワードペアを送信することが可能になりました。このアプローチは、外部のレート監視アプリケーションを欺いて、すべてが正常であり、パスワードを推測しようとするブルートフォースボットがいないと考えさせることができます。 以下は、**同時に3つの異なるメール/パスワードペア**を使用したアプリケーション認証リクエストの最も簡単なデモです。明らかに、同じ方法で1回のリクエストで数千を送信することが可能です: @@ -393,7 +393,7 @@ ws.send(JSON.stringify(graphqlMsg)) ``` ### **露出したGraphQL構造の発見** -イントロスペクションが無効になっている場合、JavaScriptライブラリにプリロードされたクエリをウェブサイトのソースコードで調べることは有効な戦略です。これらのクエリは、開発者ツールの`Sources`タブを使用して見つけることができ、APIのスキーマに関する洞察を提供し、潜在的に**露出した機密クエリ**を明らかにします。開発者ツール内で検索するためのコマンドは次のとおりです: +イントロスペクションが無効になっている場合、JavaScriptライブラリにプリロードされたクエリをウェブサイトのソースコードで調べることは有用な戦略です。これらのクエリは、開発者ツールの`Sources`タブを使用して見つけることができ、APIのスキーマに関する洞察を提供し、潜在的に**露出した機密クエリ**を明らかにします。開発者ツール内で検索するためのコマンドは次のとおりです: ```javascript Inspect/Sources/"Search all files" file:* mutation @@ -417,7 +417,7 @@ GraphQLリクエストは通常、Content-Type **`application/json`**を使用 ```javascript query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ``` -したがって、前述のようなCSRFリクエストは**プレフライトリクエストなしで送信される**ため、CSRFを悪用してGraphQLに**変更**を**加える**ことが可能です。 +したがって、前述のようなCSRFリクエストは**プレフライトリクエストなしで**送信されるため、CSRFを悪用してGraphQLに**変更**を**加える**ことが可能です。 ただし、Chromeの`samesite`フラグの新しいデフォルトクッキー値は`Lax`であることに注意してください。これは、クッキーがGETリクエストでのみサードパーティのウェブから送信されることを意味します。 @@ -429,7 +429,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ## GraphQLにおけるクロスサイトWebSocketハイジャック -GraphQLのCRSF脆弱性を悪用するのと同様に、**保護されていないクッキーを使用してGraphQLでの認証を悪用するためにクロスサイトWebSocketハイジャックを実行することも可能であり、ユーザーがGraphQLで予期しないアクションを実行することを強制できます。** +GraphQLのCRSF脆弱性を悪用するのと同様に、**保護されていないクッキーを使用してGraphQLでの認証を悪用するためにクロスサイトWebSocketハイジャックを実行することも可能です**。これにより、ユーザーがGraphQLで予期しないアクションを実行することになります。 詳細については、以下を確認してください: @@ -439,7 +439,7 @@ GraphQLのCRSF脆弱性を悪用するのと同様に、**保護されていな ## GraphQLにおける認可 -エンドポイントで定義された多くのGraphQL関数は、リクエスターの認証のみをチェックし、認可はチェックしない場合があります。 +エンドポイントで定義された多くのGraphQL関数は、リクエスターの認証のみを確認し、認可は確認しない場合があります。 クエリ入力変数を変更すると、機密アカウントの詳細が[漏洩](https://hackerone.com/reports/792927)する可能性があります。 @@ -465,7 +465,7 @@ GraphQLでは、エイリアスはAPIリクエストを行う際に**プロパ GraphQLエイリアスの詳細な理解のために、以下のリソースを推奨します: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases)。 -エイリアスの主な目的は多数のAPI呼び出しの必要性を減らすことですが、エイリアスを利用してGraphQLエンドポイントに対してブルートフォース攻撃を実行するという意図しない使用例が特定されています。これは、一部のエンドポイントがブルートフォース攻撃を阻止するために**HTTPリクエストの数**を制限するレートリミッターによって保護されているため可能です。しかし、これらのレートリミッターは、各リクエスト内の操作の数を考慮しない場合があります。エイリアスを使用することで、単一のHTTPリクエスト内に複数のクエリを含めることができるため、そのようなレート制限を回避することができます。 +エイリアスの主な目的は多数のAPI呼び出しの必要性を減らすことですが、エイリアスを利用してGraphQLエンドポイントに対してブルートフォース攻撃を実行するという意図しない使用例が特定されています。これは、一部のエンドポイントがブルートフォース攻撃を防ぐために**HTTPリクエストの数**を制限するレートリミッターによって保護されているため可能です。しかし、これらのレートリミッターは、各リクエスト内の操作の数を考慮しない場合があります。エイリアスを使用することで、単一のHTTPリクエスト内に複数のクエリを含めることができるため、そのようなレート制限を回避できます。 以下の例を考えてみてください。これは、エイリアス付きのクエリを使用してストアの割引コードの有効性を確認する方法を示しています。この方法は、複数のクエリを1つのHTTPリクエストにまとめるため、レート制限を回避できる可能性があり、同時に多数の割引コードの確認を可能にします。 ```bash @@ -482,11 +482,11 @@ valid } } ``` -## DoS in GraphQL +## GraphQLにおけるDoS -### Alias Overloading +### エイリアスのオーバーロード -**Alias Overloading**は、攻撃者が同じフィールドに対して多くのエイリアスでクエリを過負荷にするGraphQLの脆弱性であり、バックエンドリゾルバがそのフィールドを繰り返し実行する原因となります。これによりサーバーリソースが圧倒され、**サービス拒否(DoS)**につながる可能性があります。例えば、以下のクエリでは、同じフィールド(`expensiveField`)がエイリアスを使用して1,000回要求されており、バックエンドはそれを1,000回計算することを強いられ、CPUやメモリが枯渇する可能性があります: +**エイリアスのオーバーロード**は、攻撃者が同じフィールドに対して多くのエイリアスでクエリをオーバーロードし、バックエンドリゾルバがそのフィールドを繰り返し実行するGraphQLの脆弱性です。これによりサーバーリソースが圧倒され、**サービス拒否(DoS)**につながる可能性があります。例えば、以下のクエリでは、同じフィールド(`expensiveField`)がエイリアスを使用して1,000回要求され、バックエンドがそれを1,000回計算することを強制され、CPUやメモリが枯渇する可能性があります: ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "Content-Type: application/json" \ @@ -505,11 +505,11 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \ -d '[{"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}, {"query": "query cop { __typename }"}]' \ 'https://example.com/graphql' ``` -この例では、10の異なるクエリが1つのリクエストにバッチ処理され、サーバーにすべてを同時に実行させることを強制します。より大きなバッチサイズや計算コストの高いクエリで悪用されると、サーバーが過負荷になる可能性があります。 +この例では、10の異なるクエリが1つのリクエストにバッチ処理され、サーバーがそれらを同時に実行することを強制します。より大きなバッチサイズや計算コストの高いクエリで悪用されると、サーバーが過負荷になります。 ### **ディレクティブオーバーローディング脆弱性** -**ディレクティブオーバーローディング**は、GraphQLサーバーが過剰で重複したディレクティブを持つクエリを許可する場合に発生します。これは、サーバーのパーサーとエグゼキュータを圧倒する可能性があり、特にサーバーが同じディレクティブロジックを繰り返し処理する場合に顕著です。適切な検証や制限がない場合、攻撃者は多数の重複ディレクティブを持つクエリを作成することで、計算またはメモリ使用量を高め、**サービス拒否(DoS)**を引き起こすことができます。 +**ディレクティブオーバーローディング**は、GraphQLサーバーが過剰で重複したディレクティブを持つクエリを許可する場合に発生します。これは、サーバーのパーサーとエグゼキュータを圧倒する可能性があり、特にサーバーが同じディレクティブロジックを繰り返し処理する場合に顕著です。適切な検証や制限がない場合、攻撃者は多数の重複ディレクティブを持つクエリを作成することでこれを悪用し、高い計算またはメモリ使用を引き起こし、**サービス拒否(DoS)**につながる可能性があります。 ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -517,7 +517,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \ -d '{"query": "query cop { __typename @aa@aa@aa@aa@aa@aa@aa@aa@aa@aa }", "operationName": "cop"}' \ 'https://example.com/graphql' ``` -前の例では、`@aa` は宣言されていない可能性があるカスタムディレクティブです。通常存在する一般的なディレクティブは **`@include`** です: +前の例では、`@aa` は宣言されていない可能性のあるカスタムディレクティブです。通常存在する一般的なディレクティブは **`@include`** です: ```bash curl -X POST \ -H "Content-Type: application/json" \ @@ -535,7 +535,7 @@ curl -X POST \ ### **フィールド重複脆弱性** -**フィールド重複**は、GraphQLサーバーが同じフィールドを過剰に繰り返すクエリを許可する脆弱性です。これにより、サーバーは各インスタンスのためにフィールドを冗長に解決する必要があり、重要なリソース(CPU、メモリ、データベース呼び出し)を消費します。攻撃者は、数百または数千の繰り返されたフィールドを持つクエリを作成することができ、高負荷を引き起こし、最終的には**サービス拒否(DoS)**につながる可能性があります。 +**フィールド重複**は、GraphQLサーバーが同じフィールドを過剰に繰り返すクエリを許可する脆弱性です。これにより、サーバーは各インスタンスのためにフィールドを冗長に解決する必要があり、重要なリソース(CPU、メモリ、データベース呼び出し)を消費します。攻撃者は何百または何千もの繰り返されたフィールドを持つクエリを作成でき、高負荷を引き起こし、最終的には**サービス拒否(DoS)**につながる可能性があります。 ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \ @@ -551,12 +551,16 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): 使用されている graphql のフィンガープリンティング - [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): スキーマを取得し、機密データを検索し、認可をテストし、スキーマをブルートフォースし、特定のタイプへのパスを見つけるために使用できるツールキット。 - [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): スタンドアロンまたは [Burp 拡張機能](https://github.com/doyensec/inql) として使用できます。 -- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): CLI クライアントとしても使用でき、攻撃を自動化できます: `python3 graphqlmap.py -u http://example.com/graphql --inject` +- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): CLI クライアントとしても使用でき、攻撃を自動化します: `python3 graphqlmap.py -u http://example.com/graphql --inject` - [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): **GraphQL スキーマ内の特定のタイプに到達するさまざまな方法をリストするツール**。 - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL のスタンドアロンおよび CLI モードの後継 -- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): 高度な GraphQL テスト用の Burp 拡張機能または Python スクリプト。_**スキャナー**_ は InQL v5.0 のコアであり、GraphQL エンドポイントまたはローカルのイントロスペクションスキーマファイルを分析できます。すべての可能なクエリとミューテーションを自動生成し、分析のために構造化されたビューに整理します。_**アタッカー**_ コンポーネントを使用すると、バッチ GraphQL 攻撃を実行でき、実装が不十分なレート制限を回避するのに役立ちます: `python3 inql.py -t http://example.com/graphql -o output.json` +- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): 高度な GraphQL テストのための Burp 拡張機能または Python スクリプト。_**スキャナー**_ は InQL v5.0 のコアであり、GraphQL エンドポイントまたはローカルのイントロスペクションスキーマファイルを分析できます。すべての可能なクエリとミューテーションを自動生成し、分析のために構造化されたビューに整理します。_**アタッカー**_ コンポーネントを使用すると、バッチ GraphQL 攻撃を実行でき、これは不適切に実装されたレート制限を回避するのに役立ちます: `python3 inql.py -t http://example.com/graphql -o output.json` - [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): 一部の Graphql データベースの助けを借りて、イントロスペクションが無効になっていてもスキーマを取得しようとします。 +### 一般的な脆弱性を悪用するためのスクリプト + +- [https://github.com/reycotallo98/pentestScripts/tree/main/GraphQLDoS](https://github.com/reycotallo98/pentestScripts/tree/main/GraphQLDoS): 脆弱な graphql 環境におけるサービス拒否脆弱性を悪用するためのスクリプトのコレクション。 + ### クライアント - [https://github.com/graphql/graphiql](https://github.com/graphql/graphiql): GUI クライアント