struts2-045漏洞poc调试

来源:互联网 发布:淘宝刷销量多少钱 编辑:程序博客网 时间:2024/05/17 09:09

漏洞概述:struts2默认的上传插件Jakarta Multipart parser的文件上传模块在处理文件上传含(multipart/form-data)的请求时候对异常信息做了捕获,并对异常信息做了OGNL表达式处理。但在在判断Content-Type不正确的时候会抛出异常并且带上Content-Type属性值,可通过构造附带OGNL表达式的URL导致远程代码执行。

漏洞场景:

配置了struts2拦截:

<filter>

<filter-name>struts2</filter-name>

<filter-class>

org.apache.struts.dispatcher.ng.filter.strutsPrepareAndExecuteFilter

</filter-class>

</filter>

拦截目录配置的示例:

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

调试分析:


查看struts2在Github上的补丁:

 

可以看到,补丁版本struts2.3.32去掉了LocalizedTextUtil.findTextUtil方法。直观感觉是错误处理的时候出的问题。

编写poc的思路应该是先进入Jakarta上传插件处理的类。这个好办,构造一个上传即可。还得想办法通过Content-Type控制传入findTextUtil的参数,看起来错误信息“e”非常可疑。

使用poc调试:

在struts2入口类StrutsPrepareAndExecuteFilter处打断点,开启debug,构造请求。

首先对request进行封装:request =prepare.wrapRequest(request);

跟进去,发现了此处只是简单的用contains()来检查content-type的类型。

if(content_type!=null&& content_type.contains("multipart/form-data")){

    MultiPartRequest mpr =getMultiPartRequest();//默认使用Jakarta

    LocaleProvider provider = getContainer().getInstance(LocaleProvider.class);

    request =newMultiPartRequestWrapper(mpr, request, getSaveDir(), provider, disableRequestAttributeValueStackLookup);//进入此函数

        }else{

    request =new StrutsRequestWrapper(request, disableRequestAttributeValueStackLookup);

        }

跟进到

MultiPartRequestWrapper()里的multi.parse()方法,此处开始解析上传参数。明显参数不能解析,顺利的捕获到异常,执行

buildErrorMessage(e,new Object[]{})。此函数最终调用了

LocalizedTextUtil.findText()方法来对错误进行国际化处理。注意到此时参数e.getMessage中包含了OGNL表达式


findText方法是这么写的  
Anything within <code>${...}</code>
  will be treated as an OGNL expression and evaluated as such.(任何形如${code}的都会被当成OGNL表达式来执行),
故触发漏洞。

 


危害: Poc执行成功即可拿到web服务器的权限:如果用root启动的tomcat,那么服务器直接沦陷;如果是低权限账户启动的tomcat,后面结合本地提权,或者盗取配置文件,获取数据,或者上传后门,方便后续继续渗透。

 


Apache官网声明:

https://struts.apache.org/docs/s2-045.html


参考文章:

http://paper.seebug.org/241/?from=timeline&isappinstalled=0

https://my.oschina.net/u/157224/blog/854364


github修改:

https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a

 

https://github.com/apache/struts/commit/b06dd50af2a3319dd896bf5c2f4972d2b772cf2b


原创粉丝点击