使用 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 Field
和 POST Data
字段显示得非常完美。
我一直在关注 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 Field
和 POST Data
字段显示得非常完美。