这非常简单,与Struts 2.1.x完美配合.但我们最近升级到2.3.15.2并且它破了.基本上我们有一个表单(实际上,很多表单)有多个提交:
<s:form>
<s:submit action="save" />
<s:submit action="resetPassword" />
</s:form>
Run Code Online (Sandbox Code Playgroud)
如果我坚持标签中的动作一切都很好.但如果它在标签中,我会收到404错误.这是同样的行动!
我一直在调试并发现当你在标签中使用"action"属性时,生成的html是:
<input type="submit" name="action:save">
<input type="submit" name="action:resetPassword">
Run Code Online (Sandbox Code Playgroud)
据说Struts应该采用这个"动作"前缀并说"A-ha!这是一个动作!" 并执行它.它或多或少都是这样.或至少尝试.我发现的是,在非常低的级别,DefaultActionMapper.handleSpecialParameters()方法遍历所有参数并尝试为每个参数创建一个ParameterAction,如果它不为null,则执行它.大多数参数产生"null"ParameterAction,但不产生"action:".
在文档中我发现了这个关于ParameterAction的内容:
Defines a parameter action prefix. This is executed when the configured prefix key is
matched in a parameter name, allowing the implementation to manipulate the action mapping
accordingly. For example, if the "action:foo" parameter name was found, and a
ParameterAction implementation was registered to handle the "action" prefix, the execute
method would be called, allowing the implementation to set …Run Code Online (Sandbox Code Playgroud) 最近struts修补了一个允许攻击者执行远程代码的漏洞.显然没有修补这就像给黑帽子带来一个红地毯欢迎与潮流: - /
http://struts.apache.org/release/2.3.x/docs/s2-016.html
基本上它允许执行攻击命令,如下所示:
合法行动:http://host/struts2-showcase/employee/save.action?redirect:%25{3*4}
被剥削的行动:http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}
虽然我知道升级应该尽快完成,但是由于我们的代码库使用了旧的struts版本和插件,因此我们会尽快完成升级.
这将需要一些重构来升级struts 2库,然后那些需要进行测试等.
我的问题是,是否有人有任何想法阻止此漏洞被执行?这只有在我们能够升级之前.
我想知道在针对OGNL进行评估之前是否可以编写一个拦截器来清理URL,如果是这样的话,它是否会缓解这个问题?
我的其他想法是以某种方式使用Java安全管理器来停止任意进程调用,这可能吗?它会暂时修补这个洞吗?
正在使用的服务器是jBoss,如果有人认为这是相关的.
目前我在我的项目中使用 Struts 2.3.12,一切正常。现在我需要将 Struts 版本升级到 2.3.20 以解决一些安全问题。
我在我的项目中将 Struts 和所需的 Struts 插件版本更改为 2.3.20pom.xml并构建项目战争。现在,我正在尝试访问我的应用程序主页 URL,然后出现以下异常:
没有为与上下文路径关联的命名空间
[/web/public]和操作名称映射的操作。- [未知地点][reset-password!reset][/ims]
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:554)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.josso.tc55.agent.SSOAgentValve.invoke(SSOAgentValve.java:472)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
我对正在发生的事情一无所知。
我查看了 struts 2.3.20 的发行说明,但没有得到任何提示。
我正在使用strust2-convention-plugin.
我正在分享我的web.xml和struts.xml文件。它看起来如下所示:
web.xml:
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:554)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) …Run Code Online (Sandbox Code Playgroud)