Shikata Ga Nai

Private? There is no such things.

GraphQL IDOR leads to information disclosureを訳してみた

Hello there, ('ω')ノ

 

GraphQLIDORは情報開示につながります

 

脆弱性:

 IDOR

 

記事:

 https://infosecwriteups.com/graphql-idor-leads-to-information-disclosure-175eb560170d

 

今回は、情報開示につながる。

GraphQL IDOR(Insecure Direct Object Reference)の調査結果を共有することに。

 

GraphQLとは。

「GraphQLは、API用のオープンソースのデータクエリおよび操作言語であり。

既存のデータでクエリを実行するためのランタイム」と定義していて。

現在、Rest-APIの代わりにGraphQLが使用されていて。

 

脆弱性:

redacted.com(仮定)の偵察を行っているときに。

WebアプリがAPI管理にGraphQLを使用していることがわかったので。

最初にイントロスペクションクエリを試して機密情報を抽出して。

クエリを渡した後、Usersというフィールドが表示されたので。

 

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

 

Users」フィールドにTypes定義を列挙するクエリを実行すると。

_type “Users” email,mobile_number,user_id,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”}

 

⇩見やすくすると。

 

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”

}

 

そこで、そのリクエストをリピータに送信すると。

そのリクエストには、base64に何かを含む「id」という変数があったので。

その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」に変更すると。

情報を入手することができて。

 

f:id:ThisIsOne:20220227162012p:plain

 

別のユーザ「id」を取得する方法については。

他のユーザの「id」がプロファイルページのソースコードに含まれていたので。

彼らのプロフィールに移動してプロフィールページのソースを表示するだけで。

「var_userID」を検索して「id」を取得できて。

 

Best regards, (^^ゞ