ソース:
脆弱性: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」を取得するだけで。
ほなほな。