jspxcms代码审计
2024-10-24🌱湖州: ☀️ 🌡️+20°C 🌬️↙11km/h
废话不多说,直接开始审计
参考:
https://www.cnblogs.com/yokan/p/16248509.html
https://0xf4n9x.github.io/jspxcms-code-audit-learn.html
源码地址
https://www.ujcms.com/uploads/jspxcms-9.5.0-release-src.zip
部署
java8+mysql5.7.26
- 这里直接使用phpstudy部署mysql环境,然后启动
- 然后执行sql命令
1
2
3create database jspxcms_test
use jspxcms_test
source mysql.sql
我这里使用DataGrip连接数据库,然后执行database目录下的sql文件
- 配置idea
在application.properties中设置数据库的名称、密码等等
然后配置运行文件jdk8,项目结构中语言等级选择8
然后直接运行即可

技术栈
SpringMVC 框架、Spring Data JPA 框架,Hibernate 作为数据库持久化框架,Shiro 作为安全框架,以及 Freemarker 模版引擎。
一般项目的框架需要有如下
- MVC模块框架
- 持久化模块:各种JPA、Hibernate、Mybatis
- 安全框架:Shiro、Spring Security、Keycloak等
审计步骤
- jspxcms是基于maven管理的项目,首先查看pom.xml文件
- jspxcms的后台地址时cmscp,用户名时admin,密码为空
- 若是Gradle管理的项目,则查看对应的Gradle文件
通过pom.xml文件可以发现SpringMVC 框架、Spring Data JPA 框架,Hibernate 作为数据库持久化框架,Shiro 作为安全框架,以及 Freemarker 模版引擎。
根据功能点审计
登录功能
信息管理功能
发表评论
查看评论
等等…..
sql注入漏洞审计
- 使用codeql扫描
1
2
3https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-089/SqlTainted.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-089/SqlUnescaped.ql
因为持久化框架使用的是hibernate,所以可以根据hibernat的关键词搜索需要sql查询的地方
- hibernate框架一般不太有sql注入漏洞
1 | 关键词 |
使用idea自带的搜索功能查找
经过分析,全都有占位符,发现没有sql注入漏洞
SSRF漏洞审计
在审计 SSRF 漏洞前,需要知道 Java 中的一些常见的对外发送请求的方法。
1 | Socket() |
- codeql扫描
1
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql

如上图,扫描出可能存在的漏洞有6个,但是步骤那么多的一般是没有的,看最后两个步骤少的即可
第一个漏洞
source:CollectController.java中调用的fetchHtml方法
sink:Collect.java中的fetchHtml方法的httpclient.execute()方法
可以根据codeql一步步的跟踪即可
使用idea来寻找这个漏洞
路由是fetch_url.do,url参数可控,调用Collect.fetchHtml方法
点进去查看Collect.fetchHtml方法,发现最后使用了httpclient.execute方法
而且没有任何过滤,最后也是直接通过writeHtml方法输出了html内容
然后查看Application.java文件,发现注册的后台地址为
所以ssrf漏洞地址是:/cmscp/ext/collect/fetch_url.do?url=http://127.0.0.1:80
需要先登录才能够利用,用户名是admin,密码是空
发现若是不存在的端口就是如下
因为是shiro框架鉴权,他这里的版本是1.3.2,存在CVE-2019-12422漏洞,可以进行权限绕过,
直接使用如下的payload即可绕过实现ssrf
1 | http://10.194.7.167:8080/;/cmscp/ext/collect/fetch_url.do?url=http://69dso2emymdj7jwliwga9vvshjnab0zp.oastify.com |
第二个漏洞
ueditorCatchImage方法中存在openConnection()的调用
ueditorCatchImage方法有在两个位置实现

一个在fore,一个在back,前者是前端,后者是后端,这里当然选择前端的实现
路由是/ueditor,获取参数action的值,若值为catchimage则调用ueditorCatchImage方法,然后调用父类的ueditorCatchImage方法
最后调用了request中的source[]参数的值,然后执行srcUrl.openConnection()从而触发ssrf漏洞
但是可以发现,下面的代码中会判断是否是80、443端口,并且会将错误不打印出来,修复了ssrf漏洞
所以9.5.0版本这里没有ssrf漏洞了
手动审计方法
若是不用工具扫描,全局搜索以下的关键词,然后一步步的找入口点
1 | HttpClient.execute() |
或者根据功能点来查找,一般是在请求文件的接口有可能会出现ssrf漏洞
xss漏洞审计
- 使用codeql扫描这个扫描出来不太靠谱
1
ql\java\ql\src\Security\CWE\CWE-079\XSS.ql
手动审计
- 主要关注评论区
- 输入点
- 输出点
使用burp抓包,找到输入点的路由为comment_submit,然后寻找源码中的位置
经过一系列的判断,是否登陆啊啥的,然后就是没有过滤输入,直接储存进数据库
但是没有执行xss
查看所有评论页面,发现输出被转义了,这时候可以审计pom.xml文件查看模板插件
查看输出,搜索fid,找到comment_list路由

发现它查看评论时将sys_comment_list.html传入getTemplate方法中
全局搜索sys_comment_list.html,发现这个文件
这个是对评论进行了转义,所以xss才没有触发
定位到sys_comment_list.html文件的目录,寻找是否没有进行转义的模板文件
发现sys_member_space_comment.html文件没有对comment进行了转义
因为我的是9.5.0版本,这个xss漏洞已经被修复了,所以我将转移语句删除成功复现
全局搜索sys_member_space.html,发现在sys_member_space.html中当type=comment
时又对sys_member_space_comment.html进行了包含
全局搜索sys_member_space.html,发现入口点
成功执行xss
rce漏洞审计
Zip Slip 任意文件覆盖漏洞
根据网上所说有一个Zip Slip 任意文件覆盖漏洞,但是需要使用tomcat部署才行,这里就简单的分析以下源码就行了,懒得搭建了
产生漏洞的原因在于调用了AntZipUtils.unzip,但是没有对压缩包中的内容进行过滤,导致上传的包含jsp文件的压缩包自解压
正常来说有一个过滤器使得jsp文件在访问前会被加上/jsp,但是我这个9.5.0版本居然修复了这个漏洞,它不仅仅是加上/jsp,它默认还不允许JSP文件被访问,如下图所示
所以我为了复现成功,将allowed改成了true
在后台上传一个jsp文件的内容后访问结果如图
上传zip文件也是一样的,会将里面的文件直接解压出来。但是jsp文件还是无法访问
若是使用tomcat部署的话,可以使用如下命令将jsp打包成war包
1 | jar -cf rce.war ./rce.jsp |
然后直接上传,tomcat会将war包当成一个项目,就能够成功访问了
依赖漏洞审计
- 使用codeql扫描
1
2
3https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-1104/MavenPomDependsOnBintray.ql
https://github.com/github/codeql/blob/main/java/ql/src/Security/CWE/CWE-829/InsecureDependencyResolution.ql
扫描结果还没有idea自带的功能强
点击idea左下角的感叹号,然后选择Vulnerablr dependies,所有依赖漏洞给就会出现在左侧
这里主要就对几个漏洞进行实验,不然也太多了
shiro
项目使用的shiro版本时1.3.2
这个版本存在很多的认证绕过漏洞,还有一个Cookie填充漏洞

- CVE-2021-41303
Apache Shiro before 1.8.0, when using Apache Shiro with Spring Boot, a specially crafted HTTP request may cause an authentication bypass. Users should update to Apache Shiro 1.8.0.
- CVE-2022-40664
Apache Shiro before 1.10.0, Authentication Bypass Vulnerability in Shiro when forwarding or including via RequestDispatcher.
- CVE-2022-32532
Apache Shiro before 1.9.1, a RegexRequestMatcher can be misconfigured to be bypassed on some servlet containers. Applications using RegExPatternMatcher with . in the regular expression are possibly vulnerable to an authorization bypass
- CVE-2019-12422
Apache Shiro before 1.4.2, when using the default “remember me” configuration, cookies could be susceptible to a padding attack.
也就是常用的shiro721漏洞
- CVE-2020-17523
Apache Shiro before 1.7.1, when using Apache Shiro with Spring, a specially crafted HTTP request may cause an authentication bypass
发现依赖存在漏洞后就可以搜索历史漏洞,然后利用公开的POC进行复现
CVE-2019-12422
在shiro<=1.2.4版本中AES加密的key是硬编码在源码中,而在这个版本使用的加密方式是AES-CBC,其中的ase加密的key基本由系统随机生成
通过padding attack可以破解密钥,然后使用破解的key来构造cookie
利用条件
- 需要知道登陆成功的cookie中的rememberMe的值
- 有利用链,例如cb链,或者是cc链之类的
参考:https://www.cnblogs.com/dhan/p/18423531
fastjson
虽然本项目使用的版本1.2.3存在漏洞,但是项目中貌似没使用,没有审计出漏洞
审计方法:全局搜索json.parseObject
没有在项目中找到引用,估计是没有漏洞
log4j2
本项目版本:1.2.17
搜索了一下发现没有调用的,审计不出来漏洞







