【问题标题】:Struts2 Freemarker XSS VulnerabilityStruts2 Freemarker XSS 漏洞
【发布时间】:2011-12-03 08:46:53
【问题描述】:

在我的应用程序中,我们在 freemarker 模板中使用 struts URL 标签,如下所示:

<s.url action="struts-action-name"/>

问题在于,它实际上不是将操作 url 附加到应用程序的根 url,而是将其附加到当前 URL。

假设我们点击了www.example.com/community/examples/xss187ba"&gt;&lt;ScRiPt&gt;alert(1)&lt;/ScRiPt&gt;506d1768713/career_development,在该页面的 ftl 中,我们有一个这样的表单:

<form action="<s.url action="struts-action-name"/>"> 

渲染的 ftl 看起来像这样:

<form action="/community/examples/xss187ba"><ScRiPt>alert(1)</ScRiPt>506d1768713/career_development">

导致弹出警报的原因...有人处理过这个问题吗?这是 Struts 中的错误还是我们在这里做错了什么?

明显的解决方法是像这样使用 URL 标记:

<form action="<s.url value="/struts-action-name.jspa"/>">

另一方面,快速搜索显示该标签在项目中的 2500 次使用,重构所有这些并不是一件非常有趣/高效的工作:(

任何帮助、cmets 或建议将不胜感激。

-安德烈

【问题讨论】:

    标签: security jakarta-ee struts2 xss freemarker


    【解决方案1】:

    url 标签不会“附加”到任何东西——它创建一个相对于应用程序的 URL,在这种情况下基于配置的操作名称。假设一个名为“f1”的操作和一个根部署,该标签唯一会产生的是一个绝对 URL /f1.action(或没有扩展名的 `/f1')。

    给定:

    <struts>
      <constant name="struts.devMode" value="true"/>
      <constant name="struts.action.extension" value=",,action"/>
    
      <package name="default" namespace="/" extends="struts-default">
        <action name="f1" class="radios.RadioAction" method="input">
          <result name="input" type="freemarker">/WEB-INF/radios/input.ftl</result>
        </action>
    ...
    

    FreeMarker 片段:

    <@s.url action="f1"/>
    

    将输出:

    /f1
    

    您可能需要提供更多信息:您是否使用特定插件(如 Convention)等?

    【讨论】:

      【解决方案2】:

      我确实觉得它不会自动对 URL 的这些部分进行 url 编码很奇怪,因为这是我期望它做的。 所以我认为这是一个错误。也许联系 Struts 开发人员了解这一点。他们的大多数其他标签都是自动编码的,所以这个没有。

      【讨论】:

        【解决方案3】:

        您可以扩展org.apache.struts2.views.jsp.URLTag 并替换现有标签或在struts-tags.tld 中添加新标签。

        【讨论】: