<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