Невозможно выполнить сканирование zap-паука с помощью zap-java-api

Я пытаюсь запустить сканирование пауков для целевого URL, используя zap-java-api. Пожалуйста, найдите ниже код, который я получил онлайн.

import org.zaproxy.clientapi.core.ApiResponse;
import org.zaproxy.clientapi.core.ApiResponseElement;
import org.zaproxy.clientapi.core.ClientApi;

public class SimpleExample {

    private static final String ZAP_ADDRESS = "localhost";
    private static final int ZAP_PORT = 8500;
    private static final String ZAP_API_KEY =
            "q0tgadu0fperhi21q0870gc37"; // Change this if you have set the apikey in ZAP via Options / API

    private static final String TARGET = "https://demo.testfire.net/";

    public static void main(String[] args) {
        ClientApi api = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY);

        try {
            // Start spidering the target
            System.out.println("Spider : " + TARGET);
            // It's not necessary to pass the ZAP API key again, already set when creating the
            // ClientApi.
            ApiResponse resp = api.spider.scan(TARGET, null, null, null, null);
            String scanid;
            int progress;

            // The scan now returns a scan id to support concurrent scanning
            scanid = ((ApiResponseElement) resp).getValue();

            // Poll the status until it completes
            while (true) {
                Thread.sleep(1000);
                progress =
                        Integer.parseInt(
                                ((ApiResponseElement) api.spider.status(scanid)).getValue());
                System.out.println("Spider progress : " + progress + "%");
                if (progress >= 100) {
                    break;
                }
            }
            System.out.println("Spider complete");

            // Give the passive scanner a chance to complete
            Thread.sleep(2000);

            System.out.println("Active scan : " + TARGET);
            resp = api.ascan.scan(TARGET, "True", "False", null, null, null);

            // The scan now returns a scan id to support concurrent scanning
            scanid = ((ApiResponseElement) resp).getValue();

            // Poll the status until it completes
            while (true) {
                Thread.sleep(5000);
                progress =
                        Integer.parseInt(
                                ((ApiResponseElement) api.ascan.status(scanid)).getValue());
                System.out.println("Active Scan progress : " + progress + "%");
                if (progress >= 100) {
                    break;
                }
            }
            System.out.println("Active Scan complete");

            System.out.println("Alerts:");
            System.out.println(new String(api.core.xmlreport()));

        } catch (Exception e) {
            System.out.println("Exception : " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Я продолжаю получать это ниже исключения:

Spider : https://demo.testfire.net/
Exception : java.net.SocketException: Unexpected end of file from server
org.zaproxy.clientapi.core.ClientApiException: java.net.SocketException: Unexpected end of file from server
    at org.zaproxy.clientapi.core.ClientApi.callApiDom(ClientApi.java:350)
    at org.zaproxy.clientapi.core.ClientApi.callApi(ClientApi.java:331)
    at org.zaproxy.clientapi.gen.Spider.scan(Spider.java:239)
    at com_test.SimpleExample.main(SimpleExample.java:24)
Caused by: java.net.SocketException: Unexpected end of file from server
    at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
    at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at org.zaproxy.clientapi.core.ClientApi.getConnectionInputStream(ClientApi.java:361)
    at org.zaproxy.clientapi.core.ClientApi.callApiDom(ClientApi.java:348)
    ... 3 more

Я не уверен, что еще нужно пройти внутри сканирования паука, кроме целевого URL. следовательно, передавая его как ноль.

ApiResponse resp = api.spider.scan(TARGET, null, null, null, null);

Все, что я пытаюсь сделать, это запустить сканирование паука для целевого URL и генерировать html & xml отчет через zap-java-api. Любой рабочий пример по этому был бы очень полезным. Заранее спасибо.

1 ответ

Это признак того, что ZAP заблокировал ваш вызов API. Включен ли API в ZAP? Вы используете правильный ключ API?

Вы можете посмотреть в файле zap.log, который может иметь больше информации: https://github.com/zaproxy/zaproxy/wiki/FAQlogging

Это сообщение об ошибке...

Exception : java.net.SocketException: Unexpected end of file from server
org.zaproxy.clientapi.core.ClientApiException: java.net.SocketException: Unexpected end of file from server
    at org.zaproxy.clientapi.core.ClientApi.callApiDom(ClientApi.java:350)

... означает, что удаленный сервер хотя и принял соединение, но закрыл соединение, не отправив ответа.


Причины

У этой ошибки может быть много причин, и некоторые из них следующие:

  • Возможно, удаленная система слишком занята для обработки запроса, поэтому соединение разрывается.
  • В запросе могут быть отсутствующие / недопустимые значения заголовка, что вызывает внутреннюю ошибку, и сервер закрывает соединение вместо того, чтобы нормально отправлять ответ об ошибке HTTP.
  • Возможна сетевая задержка, из-за которой приложение случайным образом разрывает соединения.

Я не вижу такой проблемы в вашем блоке кода. Однако я подозреваю, что все настройки API не включены должным образом.


Решение

Убедитесь, что все настройки API включены в инструменте zap (ZAP -> Tool -> Options -> API):

Другие вопросы по тегам