我正在尝试使用节点ZAP创建一个脚本。脚本需要在本地主机上执行站点的主动扫描,同时以超级管理员的身份登录;如果没有用户登录,则只能访问大约50个可用页面中的3个。
我让整个脚本工作,除了以用户的身份登录。现在,当我在ZAP桌面客户机中这样做时,我只需打开Firefox并亲自登录到该站点,会话就会自动设置为HTTP会话,并试图使用API复制该会话。以下是我目前的情况:
const ZapClient = require('zaproxy');
const cliArguments = require('minimist')(process.argv.slice(2));
const execSync = require('child_process').execSync;
const zapOptions = {
apiKey: cliArguments.apikey,
proxy: 'http://127.0.0.1:8080'
};
const zaproxy = new ZapClient(zapOptions);
const site = 'https://127.0.0.1';
const sessionName = 'zap_session';
const cookieName = 'site_session';
function createSession(resp) {
// generate a valid cookie for a user that exists in the system with admin rights
const userCookie = execSync(
`/command/to/generate/valid/cookie ${cliArguments.userid}`,
{cwd: __dirname}
).toString();
return zaproxy.httpSessions.createEmptySession(site, sessionName)
.then(resp => zaproxy.httpSessions.setActiveSession(site, sessionName), handleError)
.then(resp => zaproxy.httpSessions.addSessionToken(site, cookieName), handleError)
.then(resp => zaproxy.httpSessions.setSessionTokenValue(site, sessionName, cookieName, userCookie), handleError);
}脚本还有很多内容,但这是会话创建。如果我在这之后调用activeSession,我就会得到zap_session的响应,就像我所期望的那样。但是当我运行它并记录我的应用程序中的所有cookie时,不会将cookie传递给站点,Spider和Active扫描都无法扫描登录页面之外的任何内容。我已经成功地让它工作了几次,但它只对一次运行有效,然后每次后续运行都失败(在createEmptySession之前也删除会话时,它似乎也能工作,但这种情况也并不总是发生)。
有谁能洞察这一过程的正确过程吗?API文档非常糟糕,我在任何地方(甚至使用其他语言)都很难找到任何此类示例。我觉得奇怪的是,我需要进行4+ API调用来设置一个会话令牌,这让我觉得我的方法完全错误,但我没有什么可供判断的。
发布于 2020-03-26 09:27:54
“我只是打开火狐和登录到网站自己”-这实际上可以涵盖大量的罪恶。
没有一个标准的方式来实现网站的认证,有很多。虽然我们希望ZAP能够理解所有这些内容,但我们只是没有足够的人员来实现这一点。
这意味着您需要了解应用程序如何对您进行身份验证。如果它是一个简单的形式,那么它可能是相对直接的-看看https://www.zaproxy.org/faq/how-can-zap-automatically-authenticate-via-forms/。
如果它更复杂,那么ZAP应该仍然能够处理它,但我们需要更多的信息。我已经开始在十个视频中讨论ZAP中的身份验证:https://www.alldaydevops.com/zap-in-ten
如果您需要更多帮助,ZAP用户组可能是一个更好的论坛:https://groups.google.com/group/zaproxy-users
https://security.stackexchange.com/questions/227780
复制相似问题