Санитизировать/проверить переменную, чтобы избежать атаки межсайтового скриптинга

Я получаю эту проблему со сканированием безопасности CheckMarx:

Метод exec в строке 69 элемента web\src\main\java\abc\web\actions\HomeAction.java получает пользовательский ввод для элемента CNF_KEY_COSN. Затем значение этого элемента проходит через код без надлежащей очистки или проверки и в конечном итоге отображается пользователю в методе logException в строке 905 из web\src\main\java\gov\abc\external\info\ServiceHelper.java. Это может привести к атаке Cross-Site-Scripting.

Строка 69 из HomeAction.java:

String cosn = (String) request.getParameter(CNF_KEY_CON);

Строка 905 в ServiceHelper.java просто регистрирует ошибку:

private static void logException(InfoServiceException exception, String message) {
    String newMessage = message + ": " + exception.getMessageForLogging();
    try {
        log.error(newMessage, exception);
    } catch (Exception e) {
        // fallback to console
        System.out.println("error logging exception ->");
        e.printStackTrace(System.out);
        System.out.println("exception ->");
        System.out.print(newMessage);
        if (exception != null) exception.printStackTrace(System.out);
    }
}

Изменен другой блок кода в HomeAction.java на:

if(cosn!= null && cosn.matches("[0-9a-zA-Z_]+")) {
  ...
}

Но это не помогло. Как проверить/очистить/закодировать строку 69. Любая помощь очень ценится.

Спасибо


person Harry    schedule 07.05.2020    source источник
comment
Как говорит Чекмаркс, существует поток от cosn к logException (но вы говорите, что метод log.error). Вы говорите, что добавили санитарию в HomeAction.java, но мы не знаем, находится ли эта санитария в уязвимом потоке.   -  person baruchiro    schedule 08.05.2020
comment
@baruchiro Извините, что не добавил полный код метода. Отредактировал пост. Спасибо   -  person Harry    schedule 08.05.2020


Ответы (3)


Вы можете очистить строки от XSS-атак, используя Jsoup. Для этого существует clean() метод. Вы должны сделать что-то вроде этого, чтобы очистить ввод:

String sanitizedInput = Jsoup.clean(originalInput, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
person A.Stern    schedule 08.05.2020
comment
Стерн, спасибо. Я сделал следующие изменения, но все равно не повезло......... String sanitizedCosn = null; if (cosn != null) { sanitizedCosn = Jsoup.clean(cosn, , Whitelist.none(), new OutputSettings().prettyPrint(false)); } - person Harry; 08.05.2020
comment
Еще одно редактирование: String cosn = (String) Jsoup.clean(request.getParameter(CNF_KEY_COSN), Whitelist.none(), new OutputSettings().prettyPrint(false)); Все та же ошибка - person Harry; 08.05.2020
comment
Итак, когда вы говорите, что это вызвало ту же ошибку, вы имеете в виду, что вы отправили что-то вроде ‹script›alert('\test')‹/script›, и оно появилось в сообщении об исключении таким же образом? - person A.Stern; 09.05.2020
comment
Нет, CheckMarx (анализатор кода) по-прежнему сообщает об этом как о высокой угрозе безопасности. То же сообщение об ошибке, что и в посте. Спасибо - person Harry; 09.05.2020

Checkmarx определяет набор дезинфицирующих средств, которые вы можете проверить в системе.

На основе ваших фрагментов исходного кода; я предполагаю, что; i) вы добавляете «cosn» к «сообщению» ii) приложение по своей природе является веб-приложением (с учетом параметра request.getParameter) iii) сообщение отображается на консоли или регистрируется в файле.

Вы можете рассмотреть возможность использования Google Guava или Apache Commons Test для html-экранирования ввода.

import com.google.common.html.HtmlEscapers;

public void testGuavaHtmlEscapers(){
    String badInput = "<script> alert me! <script>";
    String escapedLocation = HtmlEscapers.htmlEscaper().escape(badInput);
    System.out.println("<h1> Location: " + escapedLocation + "<h1>");
}
import static org.apache.commons.text.StringEscapeUtils.escapeHtml4;

public void testHtmlEscapers(){
    String badInput = "<script> alert me! <script>";
    System.out.println(escapeHtml4(badInput));
}

Я бы также подумал, если есть конфиденциальная информация, которую я должен замаскировать, например, с помощью String.replace.

public void testReplace(){
    String email = "[email protected]";
    String masked = email.replaceAll("(?<=.).(?=[^@]*?.@)", "*");
    System.out.println(masked);
}

Выше 3 методов дезинфекции будут работать одинаково.

person mystery    schedule 14.05.2020

Вероятно, это ложное срабатывание (технически «не эксплуатируемое» в Checkmarx) в отношении XSS, в зависимости от того, как вы обрабатываете и отображаете журналы. Если журналы когда-либо отображаются в браузере в виде html, он может быть уязвим для слепого XSS с точки зрения этого приложения, но это будет уязвимость в любом компоненте, отображающем журналы в виде html, а не в приведенном выше коде.

В отличие от других ответов, вы не должны кодировать сообщение здесь. Какую бы технологию вы ни использовали для ведения журнала, конечно, ее необходимо правильно кодировать для собственного использования (например, если она хранится в формате JSON, данные будут должен быть закодирован в JSON), но это не имеет ничего общего с XSS или вообще с этой проблемой.

Это просто необработанные данные, и вы можете хранить необработанные данные как есть. Если вы закодируете его здесь, вам будет сложно отобразить его каким-либо другим способом. Например, если вы применяете кодировку html, вы можете отображать ее только в html (или вам придется декодировать, что сведет на нет любой эффект). Это не имеет смысла. XSS возникнет, если вы отобразите эти журналы в браузере - и в этом случае все, что он отображает, должно быть правильно закодировано, но здесь это не так.

Обратите внимание, что это все еще может быть уязвимость для внедрения журнала. Убедитесь, что каким бы способом вы ни хранили журналы, это хранилище журналов **применяет* необходимую кодировку. Если это текстовый файл, вы, вероятно, захотите удалить новые строки, чтобы в журнал нельзя было добавить поддельные строки. Если это json, вы захотите закодировать в json и так далее. Но это функция вашего лога, а не приведенный выше код.

person Gabor Lengyel    schedule 18.05.2020