Ошибка кросс-сценариев на полученных данных базы данных - PullRequest
0 голосов
/ 24 февраля 2020

Я вижу ошибку внедрения Cross Scripting в операторе, который следует за обновлением execute. Как санировать вывод, чтобы избавить его от ошибок кросс-скриптинга? У меня есть простой фрагмент кода, который использует PreparedStatement для запуска выбора и возвращает значения, которые извлекаются на экране GUI внешнего интерфейса.

Сообщение об ошибке XSS: "Испорченные данные возникли из более раннего вызова java. sql .ResultSetMetaData.getColumnName."

Java код:

        Connection conn = null;
        Statement stmt = null;
        PreparedStatement pstmt = null;
        try {
            List alist= new ArrayList();
            pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            int count = rs.getMetaData().getColumnCount();
            for (int i = 1; i <= count; i++) {
                 alist.add(rs.getMetaData().getColumnName(i))   //Flaw seems to point to this.
            }

        }catch(Exception e){
        //close connections
        }
        return alist;

Полная ошибка Veracode: Вектор атаки: javax.servlet. jsp .JspWriter.print

Количество Модули Затронутые: 1

Описание: Этот вызов javax.servlet. jsp .JspWriter.print () содержит ошибку межсайтового скриптинга (XSS). Приложение заполняет HTTP-ответ ненадежным вводом, позволяя злоумышленнику встроить вредоносный контент, такой как код Javascript, который будет выполняться в контексте браузера жертвы. Уязвимости XSS обычно используются для кражи или манипулирования файлами cookie, изменения представления контента и компрометации конфиденциальной информации, при этом новые векторы атак обнаруживаются на регулярной основе. Первый аргумент print () содержит испорченные данные из переменной get Html (). Загрязненные данные возникли из более раннего вызова java. sql .ResultSetMetaData.getColumnName. Испорченные данные направляются в выходной поток, возвращаемый javax.servlet. jsp .JspWriter.

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Итак, я наконец-то смог разобраться в проблеме.

Мой запрос был:

SELECT COLUMN_A, COLUMN_A||'-'||COLUMN_B FROM SOME_TABLE WHERE COLUMN_C IS NULL;

Я сделал несколько вещей ...

1) Добавьте псевдоним в мой столбец и вместо него использовал rs.getMetaData().getcolumnlabel(i) rs.getMetaData().getColumnName(i). Это позволяет исключить конвейер или дефисы из имени выходного набора результатов.

2) Использовать OW ASP ESAPI.encoder().encodeForHTML(unsafeString) вместо использования Encode.forHtml(escapeHtml) и StringEscapeUtils.escapeHtml(escapeHtml) в переменной, передаваемой подготовленному оператору. .

Выходное поведение || и - при прохождении их через различные функции выхода. Вход: String unsafeString ="<'HELLO'-||>";

Выходы:

Encode.forHtml(unsafeString) is &lt;&#39;HELLO&#39;-||&gt; StringEscapeUtils.escapeHtml(unsafeString) is &lt;'HELLO'-||&gt; ESAPI.encoder().encodeForHTML(unsafeString) is &lt;&#x27;HELLO&#x27;-&#x7c;&#x7c;&gt; ESAPI.encoder().decodeForHTML(safeString from above line) is <'HELLO'-||>

Если выходные данные отправляются на jsp для обработки на html, тогда вам не нужно выполнять decodeStep ..

0 голосов
/ 24 февраля 2020

Я не знаю, почему объект ResultSetMetaData вызывает метод сервлета, но если я правильно понимаю, он используется для печати чего-либо в сервлете. Но поскольку все данные в ResultSetMetaData поступают из метаданных вашей базы данных (которые не могут включать javascript код или другие риски XSS), в этом случае следует сохранить.

ResultSetMetaData является широко используемым классом (и используется sinze долгое время), поэтому я действительно не думаю, что это проблема в текущих java версиях.

Так что я не уверен, как это исправить, но Я уверен, что это не проблема, потому что невозможно добавить какой-либо вредоносный код (javascript или sql код внедрения) в метаданные вашей базы данных.

...