使用 ZAP 进行基于脚本的身份验证时,如何在 CSRF 字段中配置该死的易受攻击的 Web 应用程序的 user_token?

How to configure the user_token of Damn Vulnerable Web Application within CSRF field while Script based authentication using ZAP?

我一直在关注 Script Based Authentication 使用 ZAP 的该死的易受攻击的 Web 应用程序的文档。我通过 Manual Explore 导航到 http://localhost/dvwa/login.php,这在我的本地主机上打开了 DVWA 应用程序,如下所示:

并将 URL 添加到 默认上下文

我还创建了具有以下配置的 dvwa 脚本:

并修改了 dvwa 脚本:

现在,当我尝试 配置上下文身份验证 时,dvwa 脚本会加载,但 CSRF 字段不会显示。

此外,POST Data 甚至没有出现,但显示了 Extra POST Data

我是不是遗漏了一些步骤?有人可以帮我吗?

Script Based Authentication 部分文档中针对使用 ZAP 的该死的易受攻击的 Web 应用程序修改后的脚本

似乎不​​完整。

完整脚本可在Setting up ZAP to Test Damn Vulnerable Web App (DVWA)获取,如下:

function authenticate(helper, paramsValues, credentials) {
    var loginUrl = paramsValues.get("Login URL");
    var csrfTokenName = paramsValues.get("CSRF Field");
    var csrfTokenValue = extractInputFieldValue(getPageContent(helper, loginUrl), csrfTokenName);
    var postData = paramsValues.get("POST Data");

    postData = postData.replace('{%username%}', encodeURIComponent(credentials.getParam("Username")));
    postData = postData.replace('{%password%}', encodeURIComponent(credentials.getParam("Password")));
    postData = postData.replace('{%' + csrfTokenName + '%}', encodeURIComponent(csrfTokenValue));

    var msg = sendAndReceive(helper, loginUrl, postData);
    return msg;
}

function getRequiredParamsNames() {
    return [ "Login URL", "CSRF Field", "POST Data" ];
}

function getOptionalParamsNames() {
    return [];
}

function getCredentialsParamsNames() {
    return [ "Username", "Password" ];
}

function getPageContent(helper, url) {
    var msg = sendAndReceive(helper, url);
    return msg.getResponseBody().toString();
}

function sendAndReceive(helper, url, postData) {
    var msg = helper.prepareMessage();

    var method = "GET";
    if (postData) {
    method = "POST";
    msg.setRequestBody(postData);
    }

    var requestUri = new org.apache.commons.httpclient.URI(url, true);
    var requestHeader = new org.parosproxy.paros.network.HttpRequestHeader(method, requestUri, "HTTP/1.0");
    msg.setRequestHeader(requestHeader);

    helper.sendAndReceive(msg);

    return msg;
}

function extractInputFieldValue(page, fieldName) {
    // Rhino:
    var src = new net.htmlparser.jericho.Source(page);
    // Nashorn:
    // 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 '';
}

使用此脚本,CSRF FieldPOST Data 字段显示得非常完美。