GraphQL IDOR leads to information disclosure から学ぶ

ソース:

infosecwriteups.com

脆弱性:GraphQL

 

訳:

私はここで、情報漏洩につながる GraphQL IDOR (Insecure Direct Object Reference) に関する最近の発見を共有します。

 

GraphQLとは何ですか?

GraphQL Foundation は、「GraphQL は、API 用のオープンソースのデータ クエリおよび操作言語であり、既存のデータを使用してクエリを実行するためのランタイムです。」と定義しています。
現在では、Rest-API の代わりに GraphQL が使用されています。

 

脆弱性

redacted.com (プライベート プログラムであり、プライバシー ポリシーに従って名前は明らかにできません) を調査しているときに、Web アプリが API 管理に GraphQL を使用していることがわかり。

そこで、まず機密情報を抽出するためにイントロスペクション クエリを試しました。 クエリを渡すと、Users というフィールドが表示されたので、クエリを渡します。

 

Query: {__type (name: \”Users\”) {name fields{name type{name kind ofType{name kind}}}}}”}

 

「Users」フィールドの Types 定義を列挙するクエリを実行すると、_type「Users」にいくつかのフィールド (Email、mobile_number、user_id、location、api_key) が含まれていることがわかり。
そこで、フィールドに含まれる情報を抽出するためにクエリをもう 1 つ渡しましたが、403 Unauthorized 応答が返され。

 

Query: {Users{email,mobile_number,user_id,api_key}}

 

 

そこで、この Web アプリには脆弱性はないと考え、XSS を探し始め。
[プロフィール] をクリックし、名前を編集してリクエストを傍受すると、興味深いものを見つけました。
Web アプリは、新しい編集をリクエストする前にユーザーの以前の情報を抽出します。

 

Request: {“operationName”:”CurrentUserData”,”variables”:{“id”:” — base64 encode — “},”query”:”query CurrentUserData($id: ID!) {\n User(id: $id) {\n id\n email\n name\n mobile_number\n apiHostUrl\n SiteAdminUrl\n pages(first: 50) {\n nodes {\n id\n faviconUrl\n name\n code\n manageUrl\n __typename\n }\n __typename\n }\n __typename\n }\n}\n”}

 

そこで、そのリクエストをリピーターに送信しました。
そのリクエストには「id」という変数があり、これにはbase64の内容が含まれています。
そこで、base64エンコードされた文字列をデコードします。

 

Decode: oph:cloud:redacted::user/p5yhwx30
First Account: r0x4r@hhacker.com
Second Account: bcr_rox4r@hacker.com

 

「P5yhwx30」は私の「id」です。
そこで、redacted.com にもう 1 つのアカウントを作成し、その「id: oph:cloud:redacted::user/d5mzk1m2」をコピーし。

 

次に、2 番目のアカウントからログアウトし、最初のアカウントでログインし。
ここで同じクエリを渡しますが、「id」を 2 番目の「id」に変更して、 情報を入手できて。

 

 

 

しかし、別のユーザーの「ID」をどうやって取得するかという問題が待っています。
そこで列挙したところ、他のユーザーの「id」がプロフィールページのソースコードに含まれていることが分かり。
彼らのプロフィールにアクセスしてプロフィール ページのソースを表示し、「var_userID」を検索して「id」を取得するだけで。

 

ほなほな。