漏洞描述:
Struts是Apache基金会Jakarta项目组的一个开源项目,Struts通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。目前,Struts框架广泛应用于政府、公安、交通、金融行业和运营商的网站建设,作为网站开发的底层模板使用,是应用最广泛的Web应用框架之一。
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大,其在Action的实现方面线程模型方面、Servlet依赖方面、封装请求参数、表达式语言方面、绑定值到视图技术、类型转换、Action执行控制的对比、拦截器的应用等方面较Struts1进行了较大改进。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与 ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
S2-005漏洞(受影响版本: Struts 2.0.0 - Struts 2.1.8.1)的起源源于S2-003(受影响版本: 低于Struts 2.0.12),Struts 2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。
OGNL表达式通过#来访问struts的对象,Struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开,S2-003的修补方案把自己上了一个锁,但是把锁钥匙给插在了锁头上。
复现过程:
- 访问http://ip:port,出现如下页面,开始实验
2.使用strtus漏洞检测工具进行漏洞检测
3.命令执行,查看当前用户
借此漏洞,攻击者可以执行任意的代码,例如协议脚本文件;向网站写入webshell;控制整个网站或者服务器。
修复建议:
1.打补丁。