<p:confirmDialog message> 中的 XSS 漏洞
XSS vulrenability in <p:confirmDialog message>
总结:<p:confirmDialog message>
属性没有逃逸HTML,由此开启一个潜在的XSS攻击漏洞。我该如何解决?
下面的原始问题(原始标题是:XSS 攻击:如何防止应用程序响应中的脚本注入):
我正在使用 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>confirm(1);<./script>。标签。
我试过的解决方案:
1) 为请求而非响应工作的过滤器。
2) 使用转义属性
3) 标签内的内容安全策略(我使用的是 mozila firefox)
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://apis.google.com;" />
感谢您的提前帮助。
- Content-Security-Policy (CSP) 很有用,您应该继续使用它。但它应该在 http header 中,而不是在 html 元中。而且,它只是一种针对错误的保护(就像你拥有的那样)。
- 您有一个内联脚本。你的 CSP 不允许内联脚本(这很好,因为内联脚本不利于安全。不要使用它们。将 javascript 放在 javascript 文件中。(如果你阅读更多关于 csp 的内容,关键字包含这个词'unsafe' 包含(如果有充分理由)
- 代码生成:"You are about to delete the Region [confirm(1);]. Proceed?"
message="You are about to delete the Region [#{regionsBean.forDelete.regionDescription}]. Proceed?"
应该编码 regionsBean.forDelete.regionDescription 。你能自己生产注射剂吗? (没有 OWASP 工具?)
看完三遍,你比较绕的问题归结为:
The <p:confirmDialog message>
attribute does not escape HTML, hereby opening a potential XSS attack hole. How can I solve it?
这是一个 known issue which was already fixed since PrimeFaces 3.5. Further the <p:confirmDialog header>
has also a XSS vulrenability which is only fixed since PrimeFaces 5.2 RC1. PrimeFaces is currently 已经作为 5.3 提供的。所以,只需升级到最新版本,这个问题就会消失。
如果您确实无法升级,以下是您的选择:
- 确保用户控制的输入永远不会在
<p:confirmDialog message>
中结束。只有当最终用户完全控制其值时,它才容易受到攻击。
- 或者,重建旧版本的 JAR 以包含修复。
或者,事先使用 JSTL #{fn:escapeXml()}
函数自行转义。
<p:confirmDialog message="#{fn:escapeXml(bean.message)}" />
至少升级到PrimeFaces 5.2后不要忘记删除,否则会被双转义
需要说明的是,JSF 设计为在所有位置都内置了 XSS 预防功能。当您在已经使用最新版本的 JSF 实现或 JSF 库的情况下发现 XSS 漏洞时,这只是一个错误,您应该通过任何方式向 JSF impl/library 人员报告。另见 CSRF, XSS and SQL Injection attack prevention in JSF。
总结:<p:confirmDialog message>
属性没有逃逸HTML,由此开启一个潜在的XSS攻击漏洞。我该如何解决?
下面的原始问题(原始标题是:XSS 攻击:如何防止应用程序响应中的脚本注入):
我正在使用 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 中的响应:
我试过的解决方案:
1) 为请求而非响应工作的过滤器。
2) 使用转义属性
3) 标签内的内容安全策略(我使用的是 mozila firefox)
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://apis.google.com;" />
感谢您的提前帮助。
- Content-Security-Policy (CSP) 很有用,您应该继续使用它。但它应该在 http header 中,而不是在 html 元中。而且,它只是一种针对错误的保护(就像你拥有的那样)。
- 您有一个内联脚本。你的 CSP 不允许内联脚本(这很好,因为内联脚本不利于安全。不要使用它们。将 javascript 放在 javascript 文件中。(如果你阅读更多关于 csp 的内容,关键字包含这个词'unsafe' 包含(如果有充分理由)
- 代码生成:"You are about to delete the Region [confirm(1);]. Proceed?"
message="You are about to delete the Region [#{regionsBean.forDelete.regionDescription}]. Proceed?"
应该编码 regionsBean.forDelete.regionDescription 。你能自己生产注射剂吗? (没有 OWASP 工具?)
看完三遍,你比较绕的问题归结为:
The
<p:confirmDialog message>
attribute does not escape HTML, hereby opening a potential XSS attack hole. How can I solve it?
这是一个 known issue which was already fixed since PrimeFaces 3.5. Further the <p:confirmDialog header>
has also a XSS vulrenability which is only fixed since PrimeFaces 5.2 RC1. PrimeFaces is currently 已经作为 5.3 提供的。所以,只需升级到最新版本,这个问题就会消失。
如果您确实无法升级,以下是您的选择:
- 确保用户控制的输入永远不会在
<p:confirmDialog message>
中结束。只有当最终用户完全控制其值时,它才容易受到攻击。 - 或者,重建旧版本的 JAR 以包含修复。
或者,事先使用 JSTL
#{fn:escapeXml()}
函数自行转义。<p:confirmDialog message="#{fn:escapeXml(bean.message)}" />
至少升级到PrimeFaces 5.2后不要忘记删除,否则会被双转义
需要说明的是,JSF 设计为在所有位置都内置了 XSS 预防功能。当您在已经使用最新版本的 JSF 实现或 JSF 库的情况下发现 XSS 漏洞时,这只是一个错误,您应该通过任何方式向 JSF impl/library 人员报告。另见 CSRF, XSS and SQL Injection attack prevention in JSF。