一、软件背景
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
二、漏洞版本
=< 2.5.26
三、漏洞分析
3.1.简述:
2020年,Apache Struts 发布了由Alvaro Munoz 和 Masato Anzai发现的远程代码执行 (RCE) 漏洞的修复程序 ,漏洞通编号为S2-061或 CVE-2020-17530。主要原因为“强制OGNL”在标签属性中的原始用户输入上,可能导致远程代码执行,类似于S2-059或CVE-2019-0230。虽然对两者的修复有助于限制易受攻击的场景,同时使用 Struts2 库并加强其沙箱,远程代码在最新版本的 Struts 2.5.26 中仍然可以执行。
3.2详述:
对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中。
Struts2对.jsp元素的各种属性执行OGNL计算。就像在 S2-059 的示例中一样,开发人员使用语法“%{}”定义属性的值,以使该页面动态并引入 url 参数。例如:
<s:a id="%{idVal}"/>
在s2-061问题下,用户输入http://host/?idVal=3*3 ,那么实际页面上会显示9,即3*3被OGNL表达式执行了。对s2-061问题的解决方案是增加了一段递归检查逻辑,以此不进入OGNL计算。
本次漏洞绕过逻辑:
在evaluateParams函数中执行了另一个OGNL计算分支。对于某些UIBean标签,name属性很容易受到双重OGNL计算,如果它们不包含value参数, 则可能导致远程代码执行。
四、漏洞POC
目前作者已公开,请参阅作者原博客:
https://mc0wn.blogspot.com/2021/04/exploiting-struts-rce-on-2526.html
五、漏洞修复
1.缓解措施:UIBean标签内给一个默认的空value值,例如:<s:label name="%{skillName}" value="" />
2。等待官方修复升级。