$1000 Bug using simple Graphql Introspection query から学ぶ

ソース:

infosecwriteups.com

脆弱性:GraphQL

 

訳:

この投稿では、アプリケーションの多要素認証 (MFA) 実装のセキュリティ テストにおける私の経験について説明します。 テストプロセスの一環として、パスワード保護をバイパスしてリカバリコードを取得しようとしました。 次の記事では、テスト プロセスの詳細と、認証をバイパスするための取り組みの結果を共有します。

 

Testing の方法論: キャプチャバイパス

https://securitycipher.com/docs/captcha-bypass/

 

テスト方法:GraphQL

https://securitycipher.com/docs/graphql-inprogress/

 

GraphQLとは

GraphQL は、クライアントが必要なデータだけをリクエストできるようにする API のクエリ言語です。
Facebook によって開発され、REST API の代替として近年ますます人気が高まっています。
GraphQL の主な利点の 1 つはその柔軟性で。
これにより、クライアントは 1 回のリクエストで複数のリソースをリクエストし、リクエストの形式と正確に一致するレスポンスを受け取ることができます。
これは、クライアントが必要なものを正確に指定できるため、データのオーバーフェッチまたはアンダーフェッチを心配する必要がないことを意味します。
さらに、GraphQL には、言語とそのツールの改善に常に取り組んでいる開発者の強力で活発なコミュニティがあります。
GraphQL には多くの利点があり、活気に満ちたサポーターのコミュニティがあるため、API として GraphQL が非常に人気のある選択肢となったのも不思議ではありません。

 

GraphQL イントロスペクション クエリ

GraphQL イントロスペクションは、ユーザーが API 自体をクエリすることで GraphQL API の機能を発見できるようにする機能です。
これには、API でサポートされるタイプ、フィールド、クエリに関する情報が含まれます。
イントロスペクション クエリを使用すると、開発者は外部ドキュメントを参照することなく、GraphQL API の構造と機能について詳しく学ぶことができます。
これは、さまざまなタイプやフィールドを持つ大規模で複雑な API を操作する場合に特に役立ちます。
検索エンジン向けに最適化するには、「GraphQL」、「イントロスペクション」、「クエリ」、「API」、「タイプ」、「フィールド」、「クエリ」などの関連キーワードを段落に含めることが重要です。
さらに、明確で簡潔な言葉を使用すると、読みやすさが向上し、より幅広い視聴者がコンテンツにアクセスしやすくなります。

 

GraphQL でイントロスペクションを実行する方法

これは、ターゲット上で GraphQL イントロスペクションを実行するための完全なリクエストです (有効な場合)。

以下の本文で POST リクエストを送信します

 

{"query": "query IntrospectionQuery{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}"}

 

サーバーは完全なスキーマ (クエリ、変更、オブジェクト、フィールドなど) で応答する必要があります。
スキーマJSON で表示されていても、すぐに読めなくなる可能性があります。
まず、JSON 応答をファイルに抽出します。
私の意見では、スキーマを取得したら、それを「GraphQL Voyager」などのツールにインポートするのが最善の方法です。 

 

私が使用したツール

Burp Suite pro

Burp Suite Extension: InQL Scanner

 

この脆弱性を入手した経緯

アプリケーションのクロールにかなりの時間を費やしましたが、脆弱性は見つかりませんでした。

 

次のステップとして、アプリケーションの多要素認証 (MFA) の実装を有効にしてテストすることにしました。
MFA を有効にすると、必要な MFA 入力を提供できなかった場合にログインに使用できるリカバリコードがアプリケーションに表示されることに気付きました。 

 

気になったので、再度リカバリーコードにアクセスしてみました。 リカバリコードオプションをクリックすると、パスワードの入力を求めるポップアップが表示されました。
このことから、パスワードを入力せずにリカバリ コードにアクセスできるのではないかと疑問に思いました。

 

 

ここで、InQl Scanner Burp Suite 拡張機能を開いて、イントロスペクション クエリを実行しようとしました。

アプリケーションのgraphqlエンドポイントを配置し、「Load」をクリックしました。

応答では、アプリケーションに関連するすべてのクエリを取得できました。

 

ダミーアプリケーションのサンプルクエリ

 

クエリを確認しているときに、リカバリ コードに関連するクエリを 1 つ見つけたので、それをテストすることにしました。
クエリをコピーしてリピーターに貼り付けました。
驚いたことに、応答では、パスワードを要求せずにリカバリコードを取得しました。
最後に、必要なパスワードを入力せずにリカバリ コードを取得する方法を発見しました。 

 

 

 

ほなほな。