<p:confirmdialog message =“”>中的XSS易失性

时间:2015-12-24 15:38:16

标签: jsf primefaces xss confirm-dialog

摘要:<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中的响应:

OWSAP response modification in red box 如果你在这里看到上面的代码我正在插入警告&lt; .script&gt; confirm(1);&lt; ./ script&gt;。标签。

我尝试的解决方案:

1)过滤器正在处理请求而非响应。

2)使用了escape属性

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

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

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

读了三遍之后,你这个相当复杂的问题归结为:

  

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

自PrimeFaces 3.5以来,这是known issue已经fixed。此外,<p:confirmDialog header>具有also XSS易失性,自PrimeFaces 5.2 RC1以来仅为fixed。 PrimeFaces 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

答案 1 :(得分:0)

  • Content-Security-Policy(CSP)非常有用,您应该继续使用它。但它应该在http标头中,而不是在html元中。并且,它只是对bug的保护(就像你拥有的那样)。
  • 您有一个内联脚本。你的CSP不允许使用内联脚本(并且它很好,因为内联脚本对安全性不利。不要使用它们。将javascript放在javascript文件中。(如果你阅读更多关于csp的内容,那么包含'u​​nsafe'一词的关键字包含了原因)
  • 代码生成:“您即将删除区域[confirm(1);]。继续?”
  

message =“您即将删除区域[#{regionalBean.forDelete.regionDescription}]。继续?”

应该编码regionsBean.forDelete.regionDescription。你能自己注射吗? (没有OWASP工具?)