Shikata Ga Nai

Private? There is no such things.

$1000 Bug using simple Graphql Introspection queryを訳してみた

Hello there, ('ω')ノ

 

単純な Graphql イントロスペクション クエリを使用した $1000 のバグを。

 

脆弱性:

 認証バイパス

 GraphQL

 

記事:

 https://infosecwriteups.com/1000-bug-using-simple-graphql-introspection-query-b68da8260877

 

今回は、アプリケーションの多要素認証 (MFA) 実装のセキュリティ テストに

おける経験について説明を。

テストプロセスの一環として、パスワード保護をバイパスしてリカバリコードを

取得しようとし。

次の記事では、テスト プロセスの詳細と、認証をバイパスするための取り組みの

結果を共有して。

 

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

 

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

 

GraphQL は、クライアントが必要なデータだけをリクエストできるようにする

API のクエリ言語で。

Facebook によって開発され、REST API の代替として近年ますます人気が

高まっていて。

GraphQL の主な利点の 1 つはその柔軟性で。

これにより、クライアントは 1 回のリクエストで複数のリソースをリクエストし、

リクエストの形式と正確に一致するレスポンスを受け取ることができ。

これは、クライアントが必要なものを正確に指定できるため、データの

オーバーフェッチまたはアンダーフェッチを心配する必要がないことを意味し。

 

さらに、GraphQL には、言語とそのツールの改善に常に取り組んでいる開発者の

強力で活発なコミュニティがあり。

GraphQL には多くのメリットがあり、活気に満ちたサポーターのコミュニティが

あるため、API として GraphQL が非常に人気のある選択肢となったのも

不思議ではなく。


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

GraphQL イントロスペクションは、ユーザが API 自体をクエリすることで

GraphQL API の機能を発見できるようにする機能で。

これには、API でサポートされるタイプ、フィールド、クエリに関する

情報が含まれ。

イントロスペクション クエリを使用すると、開発者は外部ドキュメントを

参照することなく、GraphQL API の構造と機能について詳しく学ぶことができ。

 

これは、さまざまなタイプやフィールドを持つ大規模で複雑な API を

操作する場合に特に役立ち。

検索エンジン向けに最適化するには、

“GraphQL,” “introspection,” “query,” “API,” “types,” “fields,” “queries.”などの

関連キーワードを段落に含めることが重要で。

さらに、明確で簡潔な言葉を使用すると、読みやすさが向上し、

より幅広い視聴者がコンテンツにアクセスしやすくなって。


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 拡張機能: InQL スキャナ


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

アプリケーションのクロールにかなりの時間を費やしましたが、

脆弱性は見つからず。

 

次のステップとして、アプリケーションの多要素認証 (MFA) の実装を有効にして

テストすることにし。

MFA を有効にすると、必要な MFA 入力を提供できなかった場合にログインに

使用できるリカバリ コードがアプリケーションに表示されることに気付き。

気になったので、再度リカバリコードにアクセスして。

リカバリ コード オプションをクリックすると、パスワードの入力を求める

ポップアップが表示され。

このことから、パスワードを入力せずにリカバリ コードにアクセスできるので

はないかと疑問に思い。

 

 

ここで、InQl Scanner Burp Suite 拡張機能を開いて、

イントロスペクション クエリを実行しようとし。

アプリケーションのgraphqlエンドポイントを配置し、

「ロード」をクリックして。

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


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

 

クエリを確認しているときに、リカバリ コードに関連するクエリを

1 つ見つけたので、それをテストすることにし。

クエリをコピーしてリピータに貼り付け。

驚いたことに、応答では、パスワードを要求せずにリカバリ コードを取得し。

最後に、必要なパスワードを入力せずにリカバリ コードを取得する方法を

発見して。

 

 

Best regards, (^^ゞ