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」に変更すると。
情報を入手することができて。
別のユーザ「id」を取得する方法については。
他のユーザの「id」がプロファイルページのソースコードに含まれていたので。
彼らのプロフィールに移動してプロフィールページのソースを表示するだけで。
「var_userID」を検索して「id」を取得できて。
Best regards, (^^ゞ