1

总结:该<p:confirmDialog message>属性不会转义 HTML,从而打开一个潜在的 XSS 攻击漏洞。我该如何解决?

下面的原始问题(原标题是:XSS Attacks : How to prevent Script injection in Response of application):


我正在使用 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 中的响应:

红框中的OWSAP响应修改 如果您在这里看到上面的代码,我将插入警报 <.script>confirm(1);<./script>。标签。

我尝试的解决方案:

1)过滤器适用于请求而不是响应。

2) 使用转义属性

3)标签内的内容安全策略(我使用的是mozila firefox)

 <meta http-equiv="Content-Security-Policy" content="script-src  'self' https://apis.google.com;" />

感谢您提前提供帮助。

4

2 回答 2

3

阅读三遍后,您相当复杂的问题归结为:

<p:confirmDialog message>属性不会转义 HTML,从而打开一个潜在的 XSS 攻击漏洞。我该如何解决?

这是自 PrimeFaces 3.5 以来已修复的已知问题。此外,它还有一个 XSS 漏洞,该漏洞仅在 PrimeFaces 5.2 RC1 之后才得到修复。PrimeFaces目前已作为 5.3 提供。因此,只需升级到最新版本,这个问题就会消失。<p:confirmDialog header>

如果您真的无法升级,以下是您的选择:

  • 确保用户控制的输入永远不会以<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 人员报告。另请参阅JSF 中的 CSRF、XSS 和 SQL 注入攻击预防

于 2015-12-26T09:57:55.700 回答
0
  • Content-Security-Policy (CSP) 很有用,您应该继续使用它。但它应该在 http 标头中,而不是在 html 元中。而且,它只是一种针对错误的保护(就像您拥有的那样)。
  • 你有一个内联脚本。您的 CSP 不允许内联脚本(这很好,因为内联脚本不利于安全性。不要使用它们。将 javascript 放入 javascript 文件中。(如果您阅读有关 csp 的更多信息,包含“不安全”一词的关键字包含 if 是好的)原因)
  • 代码生成:“您即将删除区域 [confirm(1);]。继续吗?”

message="您即将删除区域 [#{regionsBean.forDelete.regionDescription}]。继续吗?"

应该对 regionBean.forDelete.regionDescription 进行编码。你能自己生产注射剂吗?(没有 OWASP 工具?)

于 2015-12-25T17:26:11.750 回答