web-dev-qa-db-ja.com

ブルートフォースモードでOWASP ZAPを使用した認証リクエストでCSRFトークンを取得する方法

私はOWASP ZAPの新人なので、あなたの助けが必要です。

脆弱性サイト-DVWAがあります。私はブルートフォースでトークン(CSRF)に取り組んでいます。

ページが読み込まれると、ログイン、パスワード、ユーザートークンを含むHTMLフォームが表示されます。 3番目のフィールドは、動的トークン(CSRF)によって埋められます。

CSRFトークンでブルートフォースを使用する必要があります。

  1. ロードされたページからuser_tokenを受信します
  2. Fuzzerからフォームを送信する

私が理解しているように、ロードされたページからuser_tokenを受信するためのスクリプトを作成し、承認リンクでAttak-> Fuzzを実行してから、user_token値を選択し、各リクエストでそれを埋めるプレイロードスクリプトを追加する必要があります。

しかし、このスクリプトの作成方法をインターネット上で見つけることはできません。誰かが私を助けてくれますか?

1
user2264941

ファザーを使用する場合、実際にはより簡単なオプションがあります。 「Anti-CSRF Token Refresher」メッセージプロセッサを追加します。これにより、トークンが自動的に再生成されます。)利用できない場合は、トークン名についてZAPに通知する必要があります。

現在、CSRFトークンは本文ではなくURLでのみサポートされていることに注意してください。

ああ、そして次のバージョンのfuzzerアドオンの参考までに、メッセージでCSRFトークンがファジングされていることが検出された場合、このメッセージプロセッサがデフォルトで追加されます:)

1
Simon Bennetts

これはFAQ役立つかもしれません。スクリプトを介してトークンを処理するときのdvwaとファジングをカバーします: https://github.com/zaproxy/zaproxy/wiki/FAQvulnappdvwa

var SOURCE_URL = "http://localhost/DVWA/vulnerabilities/brute/";
var CSRF_TOKEN_NAME = "user_token";
var REQUEST_URI = new org.Apache.commons.httpclient.URI(SOURCE_URL, true);

function processMessage(utils, message) {
    var msg = message.cloneRequest();
    msg.getRequestHeader().setURI(REQUEST_URI);
    var csrfTokenValue = extractInputFieldValue(getPageContent(utils, msg), CSRF_TOKEN_NAME);

    var params = message.getUrlParams();
    replace(params, CSRF_TOKEN_NAME, encodeURIComponent(csrfTokenValue));
    message.getRequestHeader().setGetParams(params);
}

function processResult(utils, fuzzResult){
    return true;
}

function getPageContent(utils, msg) {
    utils.sendMessage(msg);
    utils.addMessageToResults("Refresh " + CSRF_TOKEN_NAME, msg)
    return msg.getResponseBody().toString();
}

function extractInputFieldValue(page, fieldName) {
    var Source = Java.type("net.htmlparser.jericho.Source");
    var src = new Source(page);

    var it = src.getAllElements('input').iterator();

    while (it.hasNext()) {
        var element = it.next();
        if (element.getAttributeValue('name') == fieldName) {
            return element.getAttributeValue('value');
        }
    }
    return '';
}

function replace(params, name, value) {
    var it = params.iterator();

    while (it.hasNext()) {
        var param = it.next();
        if (param.getName() == name) {
            param.setValue(value);
            return;
        }
    }
}
0
kingthorin