Уязвимость XSS в сообщении <p: verifyDialog>
Резюме: <p:confirmDialog message>
Атрибут не экранирует HTML, тем самым открывая потенциальную дыру XSS-атаки. Как я могу решить это?
Оригинальный вопрос ниже (оригинальное название было: XSS Attacks: Как предотвратить инъекцию скрипта в ответ приложения):
Я работаю с приложением JSF. В настоящее время я сталкиваюсь с проблемой xss-атак. Я провел несколько исследований по этому вопросу. но не в состоянии найти решение. Я использую инструмент OWASP для тестирования. Я могу предотвратить атаки XSS в запросе, но не для ответа. Для запроса я использовал фильтр, который фильтрует запрос и дает правильный вывод, но ответ не обрабатывается тем же решением. как только ответ приходит из управления приложением, переходит в OWSAP, я добавляю в него скрипт, и его отображают в браузере:(
Код Xhtml:
<p:panel header="Regions">
<p:dataTable id="regionsTable"
var="region"
value="#{regionsBean.regions}"
rowKey="#{region.id}"
selectionMode="single"
selection="#{regionsBean.selectedRegion}">
<p:column styleClass="colID">
<f:facet name="header">ID</f:facet>
<h:outputText value="#{region.id}" />
</p:column>
<p:column>
<f:facet name="header">Region</f:facet>
<h:outputText value="#{region.regionDescription}" />
</p:column>
<p:column styleClass="colActionRegions">
<f:facet name="header">Action</f:facet>
<p:commandLink id="deleteRegionLnk"
oncomplete="deleteRegionConfirm.show()" update=":regionForm:dltDlg">
<p:graphicImage value="/resources/images/delete1616.png"/>
<f:setPropertyActionListener value="#{region}" target="#{regionsBean.forDelete}" />
</p:commandLink>
<p:tooltip id="toolTipDelete" for="deleteRegionLnk" value="Delete" showEffect="fade" hideEffect="fade" />
</p:column>
</p:dataTable>
</p:panel>
<p:confirmDialog id="dltDlg" message="You are about to delete the Region [#{regionsBean.forDelete.regionDescription}]. Proceed?" header="Delete Region" severity="alert" widgetVar="deleteRegionConfirm">
<p:commandButton id="confirm" value="Yes" styleClass="iot-button" update="regionsTable,growl" oncomplete="deleteRegionConfirm.hide()" actionListener="#{regionsBean.delete}" style="color: #FFF"/>
<p:commandButton id="decline" value="Cancel" styleClass="iot-button" onclick="deleteRegionConfirm.hide()" type="button" style="color: #FFF"/>
</p:confirmDialog>
ответ в OWSAP:
Если Вы видите вышеупомянутый код здесь, я вставляю предупреждение <.script>Подтверждение (1);<./ script>. тег.
Решение, которое я попробовал:
1) Фильтр, который работает для запроса, а не для ответа.
2) используемый атрибут escape
3) Политика безопасности содержимого внутри тега (я использую mozila firefox)
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://apis.google.com;" />
Заранее благодарны за Вашу помощь.
2 ответа
Прочитав три раза, ваш довольно запутанный вопрос сводится к следующему:
<p:confirmDialog message>
Атрибут не экранирует HTML, тем самым открывая потенциальную дыру XSS-атаки. Как я могу решить это?
Это известная проблема, которая уже была устранена со времен PrimeFaces 3.5. Дальше <p:confirmDialog header>
также имеет уязвимость XSS, которая исправлена только с PrimeFaces 5.2 RC1. PrimeFaces в настоящее время уже доступен как 5.3. Итак, просто обновитесь до последней версии, и эта проблема должна исчезнуть.
Если вы действительно не можете обновить, ниже приведены ваши варианты:
- Убедитесь, что пользовательский ввод никогда не заканчивается
<p:confirmDialog message>
, Это только уязвимо, когда конечный пользователь имеет полный контроль над его стоимостью. - Или пересоберите более старую версию JAR, чтобы включить исправление.
Или, прежде всего, избегайте его самостоятельно, используя JSTL
#{fn:escapeXml()}
функция.<p:confirmDialog message="#{fn:escapeXml(bean.message)}" />
Не забудьте удалить после обновления, по крайней мере, до PrimeFaces 5.2, иначе это будет двойной экранирование.
Чтобы быть ясным, JSF разработан, чтобы иметь встроенную защиту от XSS повсюду. Когда вы обнаруживаете дыру в XSS, когда уже используете самую последнюю версию реализации JSF или библиотеку JSF, это просто ошибка, о которой вы обязательно должны сообщить ребятам из библиотеки JSF impl/. См. Также Предотвращение атак CSRF, XSS и SQL-инъекций в JSF.
- Content-Security-Policy (CSP) полезна, и вы должны продолжать ее использовать. Но это должно быть в заголовке http, а не в html мета. И это только защита от ошибок (как у вас).
- У вас есть встроенный скрипт. Ваш CSP НЕ допускает встроенный скрипт (и это ХОРОШО, потому что встроенный скрипт вреден для безопасности. Не используйте их. Поместите javascript в файл javascript. (Если вы читаете больше о csp, ключевые слова, содержащие слово "unsafe", содержат if for good). причина)
- Генерирование кода:"Вы собираетесь удалить Регион [подтвердить (1);]. Продолжить?"
message = "Вы собираетесь удалить Регион [#{regionBean.forDelete.regionDescription}]. Продолжить?"
СЛЕДУЕТ кодировать regionBean.forDelete.regionDescription . Вы можете сделать себе инъекцию? (без инструментов OWASP?)