【问题标题】:Example of a working OWASP Zap script with authenticated scan using API使用 API 进行身份验证扫描的有效 OWASP Zap 脚本示例
【发布时间】:2019-05-10 03:59:19
【问题描述】:

有人可以展示一个能够执行上述操作的脚本吗?我在网上找到了大量的说明并尝试了很多不同的方法,但仍然无法让 Zap 登录到页面以执行完整扫描。

我得到的最好的是这样的:

 'http://XXX',
 'http://XXX/robots.txt',
 'http://XXX/sitemap.xml',
 'http://XXX/webui',
 'http://XXX/webui/index.html',
 'http://XXX/webui/index.html?Password=ZAP&Username=ZAP',
 'http://XXX/webui/login',
 'http://XXX/webui/login/assets',
 'http://XXX/webui/login/assets/images',
 'http://XXX/webui/login/assets/images/companylogo.png',
 'http://XXX/webui/login/assets/styles',
 'http://XXX/webui/login/assets/styles/login.css',
 'http://XXX/webui/login/login.js',
 'http://XXX/webui/login/redirect.js',
 'http://XXX/webui?Password=ZAP&Username=ZAP'

非常感谢

from zapv2 import ZAPv2
from random import randint
import socket
zap_ip = 'zap' #name of a Docker container running Zap
target = 'http://example.com'
auth_url = target + "webui/index.html"
scanners = ['90020', '90029']
# authorized Web UI user
username = test
password = test
auth_data = 'password={%password%}&username={%username#%}'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
zap = ZAPv2(proxies={'http': 'http://' + zap_ip + ':' + str(port),
    'https': 'http://' + zap_ip + ':' + str(port)})
new_context = randint(1, 100000000000)
session = zap.core.session_location
session_name = 'session_1.session' if zap.core.session_location == \
    'session_0.session' else 'session_0.session'
zap.core.new_session(name=session_name)
zap.core.load_session(session_name)
context_id = zap.context.new_context(new_context)
zap.context.include_in_context(new_context, '.*')
zap.ascan.disable_all_scanners()
for scanner in scanners:
    zap.ascan.enable_scanners(scanner)
all_rules = [scanner for scanner in \
    zap.ascan.scanners() if scanner['enabled'] == 'true']
start_url = auth_url if auth_url else target
zap.urlopen(start_url)
auth_method_name = 'formBasedAuthentication'
authmethod_configparams = 'loginUrl=%s&loginRequestData=%s' % (auth_url, auth_data)
authcred_configparams = 'username=%s&password=%s' % (username, password)
zap.authentication.set_authentication_method(contextid=context_id,
    authmethodname=auth_method_name, 
    authmethodconfigparams=authmethod_configparams)
user_id = zap.users.new_user(contextid=context_id, name=username)
zap.users.set_authentication_credentials(contextid=context_id,
    userid=user_id,
    authcredentialsconfigparams=authcred_configparams)
zap.users.set_user_enabled(contextid=context_id, userid=user_id, enabled=True            zap.forcedUser.set_forced_user(context_id, user_id)
zap.forcedUser.set_forced_user_mode_enabled('true')
spider = zap.spider.scan_as_user(url=target, contextid=context_id, 
    userid=user_id, recurse='false')
while (int(zap.spider.status()) < 100):
    time.sleep(2)
zap.ascan.scan(target)
zap.ascan.remove_all_scans()
zap.core.delete_all_alerts()
zap.context.remove_context(new_context)

【问题讨论】:

标签: python owasp zap


【解决方案1】:

一般来说,身份验证很痛苦。有很多不同的方式可以实现身份验证,除了非常通用的建议之外,真的很难提供任何东西。

但是,您有一个类似“http://XXX/webui?Password=ZAP&Username=ZAP”的 URL,这意味着您没有正确配置某些内容,因为这些是 ZAP 蜘蛛提供的默认值。

如果您能提供更多关于您的应用程序的预期和您正在做什么的详细信息,那么我们应该能够提供更多帮助。

【讨论】:

  • 它连接到代理,创建上下文,使用基于表单的身份验证来执行主动扫描 - 请参阅我在编辑中添加的代码。非常感谢。
  • 所以我建议做同样的事情,但 ZAP 桌面在本地运行,这样您就可以准确地看到发生了什么。此常见问题解答有一些很好的诊断建议:github.com/zaproxy/zaproxy/wiki/FAQformauth#diagnosing-problems(不仅适用于基于表单的身份验证)