我需要有关 NTLM 身份验证配置的帮助。
我目前正在使用 OWASP ZAP 测试 AJAX Web 应用程序。该应用程序可通过 HTTPS 访问,并启用了 NTLM 身份验证。当我运行扫描时,ZAP 没有保持 NTLM 协商的正确顺序。 NTLM 连接的预期方式是:
- 客户端发送 GET 来接收网站
- 服务器发送 WWW-Authenticate: Negotiate 和 WWW-Authenticate: NTLM with 401 code
- 客户端使用 Authorization:Negotiate 发送身份验证信息
- 服务器以 WWW-Authenticate 响应:协商并以请求的页面和代码 200 响应。
这种情况发生在扫描期间,但只有前两个步骤 - 在收到协商/NTLM 质询后,ZAP 才开始下一个测试。 不过,每隔几次测试,ZAP 就会尝试跳过第 3 步来执行测试:
- ZAP 发送授权:与使用 base64 编码的 NTLM 协商,
- 服务器发送 WWW-Authenticate: Negotiate 和 WWW-Authenticate: NTLM with 401 code
之后,ZAP 只是跳过测试并在 zap.log 中保存一个条目:
“2018-07-16 18:07:57,969 [ZAP-ActiveScanner-1] 错误 HttpMethodDirector - 乱序 NTLM 响应消息 org.apache.commons.httpclient.auth.MalformedChallengeException:乱序 NTLM 响应消息”。
你知道这里可能是什么问题吗?下面我将向您发送我对配置所做的事情,我的日志记录选项是什么以及我收到了哪些错误。
重现行为的步骤:
- 打开为 ZAP 配置了代理的 Web 浏览器,然后单击https://example.com:9443/service上的整个 Web 应用程序(这是一个 AJAX 服务)。我没有使用 AJAX 蜘蛛,因为它通常不提供数据验证输入的有效输入。
- 会话属性:使用https://example.com:9443/service创建新上下文。*
- 会话属性:身份验证:HTTP/NTLM 身份验证
端口:8443
领域:留空(也尝试使用 {AD Domain} 和 {AD Domain}.local)
登录响应中标识的正则表达式模式:{string_from_logged_in_response}
- 会话属性:用户:从域中添加一个有效用户(尝试了“{username}”和“{AD Domain}{username}”)
4.Forced User:第三步设置的用户名
会话管理:HTTP认证会话管理
授权:HTTP 状态码:401
正文包含正则表达式:“访问受限”(放置在 webapp 的 401 页面上的字符串)。至少上述条件之一必须匹配。
配置后运行扫描:
在站点树上,右键单击https://example.com:9443/service -> 攻击 -> 主动扫描
在活动扫描范围选项卡中:
起点:https ://example.com:9443/service
政策:默认
上下文:上面配置的一个(步骤1)
用户:上面配置的那个(第3步)
- 开始扫描。
我遇到的日志 - 解析请求正文也有一个错误:
2018-07-16 18:07:57,414 [Thread-607] INFO HostProcess - Scanning 90 node(s) from https://example.com:9443/service as {user}
2018-07-16 18:07:57,418 [Thread-607] INFO HostProcess - start host https://example.com:9443/service | TestRemoteFileInclude strength MEDIUM threshold MEDIUM
2018-07-16 18:07:57,442 [Thread-607] ERROR HttpMethodDirector - Out of sequence NTLM response message
org.apache.commons.httpclient.auth.MalformedChallengeException: Out of sequence NTLM response message
at org.zaproxy.zap.network.ZapNTLMScheme.processChallenge(ZapNTLMScheme.java:131)
at org.apache.commons.httpclient.auth.AuthChallengeProcessor.processChallenge(AuthChallengeProcessor.java:162)
at org.apache.commons.httpclient.HttpMethodDirector.processWWWAuthChallenge(HttpMethodDirector.java:773)
at org.apache.commons.httpclient.HttpMethodDirector.processAuthenticationResponse(HttpMethodDirector.java:747)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:221)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.parosproxy.paros.network.HttpSender.executeMethod(HttpSender.java:333)
at org.parosproxy.paros.network.HttpSender.runMethod(HttpSender.java:562)
at org.parosproxy.paros.network.HttpSender.send(HttpSender.java:523)
at org.parosproxy.paros.network.HttpSender.sendAuthenticated(HttpSender.java:501)
at org.parosproxy.paros.network.HttpSender.sendAuthenticated(HttpSender.java:490)
at org.parosproxy.paros.network.HttpSender.sendAndReceive(HttpSender.java:405)
at org.parosproxy.paros.network.HttpSender.sendAndReceive(HttpSender.java:362)
at org.parosproxy.paros.core.scanner.HostProcess.obtainResponse(HostProcess.java:507)
at org.parosproxy.paros.core.scanner.HostProcess.scanMessage(HostProcess.java:460)
at org.parosproxy.paros.core.scanner.HostProcess.processPlugin(HostProcess.java:371)
at org.parosproxy.paros.core.scanner.HostProcess.run(HostProcess.java:302)
at java.lang.Thread.run(Unknown Source)
2018-07-16 18:50:03,583 [ZAP-ActiveScanner-0] WARN VariantJSONQuery - Failed to parse the request body: Input is invalid JSON; does not start with '{' or '[', c=-1
java.lang.IllegalArgumentException: Input is invalid JSON; does not start with '{' or '[', c=-1
at org.parosproxy.paros.core.scanner.VariantJSONQuery.parseObject(VariantJSONQuery.java:117)
at org.parosproxy.paros.core.scanner.VariantJSONQuery.parseContent(VariantJSONQuery.java:61)
at org.parosproxy.paros.core.scanner.VariantAbstractRPCQuery.setRequestContent(VariantAbstractRPCQuery.java:167)
at org.parosproxy.paros.core.scanner.VariantAbstractRPCQuery.setMessage(VariantAbstractRPCQuery.java:51)
at org.parosproxy.paros.core.scanner.AbstractAppParamPlugin.scan(AbstractAppParamPlugin.java:161)
at org.parosproxy.paros.core.scanner.AbstractPlugin.run(AbstractPlugin.java:380)
at java.lang.Thread.run(Unknown Source)
记录设置:
log4j.logger.org.parosproxy.paros=DEBUG
log4j.logger.org.zaproxy.zap=DEBUG
log4j.logger.org.apache.commons.httpclient=DEBUG
log4j.logger.httpclient.wire.header=DEBUG
log4j.logger.net.htmlparser.jericho=ERROR
安装配置:
ZAP: 2.7.0
Add-on: Set of default Add-ons.
OS: Windows 10 17134
Java: Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Browser: clicking through the application was done with Chrome, version 67.0.3396.99