0

我想使用ZAP API对许多不同的 Web 应用程序执行经过身份验证的扫描。这些 Web 应用程序每个都有不同的登录机制,我不想通过许多不同的表单执行繁琐的登录过程,每个表单都需要手动配置。

更简单的解决方案是为每个应用程序使用 HTTP 会话 cookie 来执行这些经过身份验证的扫描,但是如果不创建与关联用户的上下文,我看不到执行此操作的机制。

我试图通过 http 会话添加一个新会话,尽管它们不适合这个用例:

def add_session(self, session_name, session_tokens):
        self.zap.httpsessions.create_empty_session(self.target_url, session_name, apikey=self.api_key)
        for token_name, token_value in session_tokens:
            self.zap.httpsessions.set_session_token_value(self.target_url, session_name,  token_name, token_value, apikey=self.api_key)
        self.zap.httpsessions.add_session_token(self.target_url, session_name, apikey=self.api_key)
        self.zap.httpsessions.set_active_session(self.target_url, session_name, apikey=self.api_key)

但是,在执行扫描时,任何手动添加的 cookie 都不会添加到对服务器的后续请求中。

例如,当执行爬虫时,会话信息被忽略:

def spider(self):
    scanid = self.zap.spider.scan(self.target_url, apikey=self.api_key)
    while (int(self.zap.spider.status(scanid)) < 100):
        print 'Spider progress %s%% ' % self.zap.spider.status(scanid)
        time.sleep(1.0)
    return self.zap.spider.full_results(scanid)

是否可以通过 ZAP API 将 cookie 添加到请求中来执行扫描?

或者是为我要登录和扫描的每个网站手动添加表单数据和上下文的唯一选项?

4

1 回答 1

1

是的,这是可能的——我们在 Mozilla 这样做。我使用的代码片段是:

zap.httpsessions.add_session_token(target + ":443", "sessionid")
zap.httpsessions.create_empty_session(target + ":443", "testsession")
zap.httpsessions.set_session_token_value(target + ":443", "testsession", "sessionid", session_cookie)
zap.httpsessions.set_active_session(target + ":443", "testsession")

这适用于爬虫和主动扫描,不需要上下文。我使用 Auth Stats ( https://github.com/zaproxy/zap-extensions/wiki/HelpAddonsAuthstatsAuthStats ) 插件来检查身份验证是否按预期工作。

干杯,西蒙

于 2016-12-13T14:33:36.733 回答