2024年2月19日发(作者:)

StrutsS2-045漏洞调试及分析Auth:Cryin’Date:2016.3.9漏洞公告首先看官方给出的漏洞公告信息:“PossibleRemoteCodeExecutionwhenperformingfileuploadbasedonJakartaMultipartparser.”问题原因:“ontent-Typevalueisn'tvalidanexceptionisthrownwhichisthenusedtodisplayanerrormessagetoauser.”从公告信息可以得到几个漏洞的重点信息:存在漏洞的模块是Jakarta漏洞产生的点是恶意的Content-Type头恶意的Content-Type头会造成程序抛出异常,在显示错误消息给用户时造成RCE补丁对比查看Struts2版本2.3.32在github上的commit(Usesdefaulterrorkeyifspecifiedkeydoesn'texist)并对比修改内容:/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a可以看到对xt方法进行了重写,并添加了判断。Struts2RCE漏洞的根本原因是程序将用户可控数据带入OGNL表达式解析并执行,而OGNL(ObjectGraphNavigationLanguage)对象图形导航语言是一个功能强大的表达式语言,可以用来获取和设置Java对象的属性,但同时也可以对服务端对象进行修改,绕过沙盒甚至可以执行系统命令。所以,从补丁分析来看xt函数很可能是OGNL表达式的传入点,在调试分析时可在此处下断点跟踪分析。关于jakartaJakarta是struts2默认处理multipart报文的解析器,该组件定义在中:默认使用aMultiPartRequest类对上传数据进行解析并调用第三方组件完成上传操作。

开发人员可以通过配置属性,修改指定不通的解析类。如图:所以,只要不修改默认的属性,且有包。在受影响struts2版本范围内则都受此漏洞影响。不用实现上传功能,只要具备上述条件的struts2程序,即可进行漏洞调试、跟踪漏洞触发过程进行深入分析。漏洞触发过程由于不需要具体实现代码,这里建一个空工程即可,下载struts2源代码并关联,这里使用struts-2.2.30版本,并在上面提到的xt函数、JakartaMultiPartRequest类的parse函数以及解析前的content_type校验处下断点,启动调试并运行POC测试脚本,在文件中的wrapRequest函数对content_type校验处截断开始单步跟踪调试。此处对content_type头进行检查,判断是否包含multipart/form-data字段,判断成功后进行JakartaMultiPartRequest的parse函数进行解析,这就是为什么该漏洞POC都包含multipart/form-data字段的原因。继续单步跟进,进入parse函数的断点。继续单步运行,在processUpload函数位置抛出异常,并跳转到异常流程中,抛出的异常信息为:InvalidContentTypeException:therequestdoesn'tcontainamultipart/form-dataormultipart/mixedstream.因为ContentType未包含multipart/form-data或multipart/mixed流内容,造成程序异常。其中可以看到异常消息中同时也包含了测试POC中ContentType头中的payload。

接着继续单步跟踪,程序流程进入buildErrorMessage函数并传入了异常消息。该函数就应该是漏洞公告中提到的显示错误信息给用户的这部分功能代码。继续跟进进入了下好断点的xt函数。查看xt函数的介绍/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/:“Ifamessageisfound,ngwithin${...}willbetreatedasanOGNLexpressionandevaluatedassuch.”继续跟进,最后可以看到异常消息被传入ValueEvaluator对象的evaluate方法中。

这里提到Ognl值栈,可以看到包含构造Ognl语句的异常消息进入该函数,从而导致命令执行。防护建议升级struts2版本到2.3.32或2.5.10.1使用pell、cos等其它multipart解析器弃坑,使用SpringMVC参考[1][2][3][4][5][6]/hacker/program/tp:///241//u011721501/article/details/60768657/three_feng/article/details/60869254/apache/struts//apache-struts2-remote-code-execution-vulnerability-analysis-program/[7]/confluence/display/WW/S2-045[8]/dist/struts/