Struts2 Freemarker XSS漏洞

时间:2011-10-07 23:05:39

标签: security java-ee struts2 xss freemarker

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

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

问题在于,不是将动作网址附加到应用程序的根网址,而是将其实际附加到当前网址。

假设我们点击www.example.com/community/examples/xss187ba"><ScRiPt>alert(1)</ScRiPt>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个标签的使用,并重构所有这些不是一个非常有趣/高效的工作:(

任何帮助,意见或建议都将受到高度赞赏。

-Andre

3 个答案:

答案 0 :(得分: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)等吗?

答案 1 :(得分:0)

您可以展开org.apache.struts2.views.jsp.URLTag并替换现有内容,或在struts-tags.tld中添加新代码。

答案 2 :(得分:0)

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