【问题标题】:XSS vulrenability in <p:confirmDialog message><p:confirmDialog message> 中的 XSS 漏洞
【发布时间】:2016-03-31 00:40:16
【问题描述】:

总结:&lt;p:confirmDialog message&gt; 属性不会转义 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 中的响应:

如果您在这里看到上面的代码,我将插入警报 <.script>confirm(1);<.>。标签。

我尝试过的解决方案:

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

2) 使用转义属性

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: jsf primefaces xss confirm-dialog


    【解决方案1】:

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

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

    这是一个 known issue,自 PrimeFaces 3.5 以来已经是 fixed。此外,&lt;p:confirmDialog header&gt; 具有also 一个 XSS 漏洞,自 PrimeFaces 5.2 RC1 以来只有fixed。 PrimeFaces 是 currently 已作为 5.3 提供。因此,只需升级到最新版本,这个问题就会消失。

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

    • 确保用户控制的输入永远不会以&lt;p:confirmDialog message&gt; 结尾。只有当最终用户完全控制其价值时,它才易受攻击。
    • 或者,重建旧版本的 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

    【讨论】:

    • 感谢您的回复。我正在使用 primefaces 3.4.2 是否有解决此问题的方法。正如我所看到的 src/main/java/org/primefaces/component/confirmdialog/ConfirmDialogRenderer.java 有变化作为 5.2 中的修复,所以我需要修改 3.4.2 的 jar 并需要测试
    • 为了转义,我尝试了这个替代方法 为 p:confirmDialog 的消息
    • 感谢更新@balusC 你一直希望我们的答案 :) 让我检查修复
    • 我相信of:escapeJS 会比fn:escapeXml 更好吗?
    • @ForguesR:如果您需要将值打印为实际 JavaScript 代码的一部分,请使用 of:escapeJS()。如果您需要将值打印为实际 X(HT)ML 值的一部分,请使用 fn:escapeXml()。
    【解决方案2】:
    • Content-Security-Policy (CSP) 很有用,您应该继续使用它。但它应该在 http 标头中,而不是在 html 元中。而且,它只是一种针对错误的保护(就像您拥有的那样)。
    • 您有一个内联脚本。您的 CSP 不允许内联脚本(这很好,因为内联脚本不利于安全性。不要使用它们。将 javascript 放入 javascript 文件中。(如果您阅读有关 csp 的更多信息,包含“不安全”一词的关键字包含 if 是好的)原因)
    • 代码生成:“您即将删除区域 [confirm(1);]。继续?”

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

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

    【讨论】:

    • 感谢您的回复。我正在使用 OWASP 工具进行测试,在我的 xhtml 上,当我单击删除按钮时,我正在使用 显示此确认对话框,但在显示 OWASP 响应之前,我正在注入内联 JS 警报。并且响应是 Javascript
    • @vinod 抱歉,但是“生成该 HTML 的代码是什么”我的意思是,您的应用程序中生成“您即将删除区域 [name_of_the_region]。继续?”的代码是什么? /跨度>
    • 谢谢。您可以编辑您的问题以显示在 中生成内容的代码吗?如何在“您即将删除区域 [name_of_the_region]。继续?”这句话中插入区域名称。 ?
    • 我已经添加了所有代码,希望这会更容易理解。谢谢
    • 我已经编辑了我的答案,但我无法进一步帮助您。现在你的问题得到了改善,我希望一些 JSP 人可以帮助你
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2012-03-10
    • 2012-06-21
    • 2011-12-03
    • 2021-05-01
    • 2013-09-16
    相关资源
    最近更新 更多