jspxcms历史漏洞分析与复现-JAVA
字数 1493 2025-08-29 08:31:35
JSPXCMS历史漏洞分析与复现教学文档
一、环境准备
1. 系统要求
- 操作系统:Windows 10
- 中间件:Apache Tomcat 9.0.58
- 数据库:MySQL 5.7.26(可使用phpstudy集成环境)
2. 部署步骤
JSPXCMS安装包部署到Tomcat
- 下载并解压jspxcms安装包
- 将Tomcat的ROOT目录替换为jspxcms的ROOT目录
- 修改
application.properties中的数据库配置信息 - 启动Tomcat服务
JSPXCMS源码部署到IDEA
- 使用IDEA打开解压好的源码目录
- 由于使用了SpringBoot框架,直接运行主程序
Application即可
二、漏洞分析与复现
1. XSS漏洞
漏洞位置
- 评论功能中的文本输入未充分过滤
- 前端模板
sys_member_space_comment.html未使用escape标签进行HTML实体编码
复现步骤
- 访问首页任意新闻
- 注册用户并提交评论(使用XSS payload)
- 访问
/space/{id}路径触发XSS
代码分析路径
- 搜索
comment_submit定位到控制器方法 - 跟踪
text变量传递过程:- 控制器接收参数 → service层处理 → dao层存储
- 前端渲染分析:
/comment_list使用了HTML实体编码/space/{id}未使用编码
2. SSRF漏洞
第一处SSRF
敏感函数:
HttpClient.execute()
漏洞位置:
fetchHtml()方法直接使用用户可控URL发起请求
复现步骤:
- 构造请求调用
fetchUrl()方法 - 传入外部可控URL参数
第二处SSRF
敏感函数:
URL.openConnection()
漏洞位置:
ueditorCatchImage()方法中source[]参数可控
复现步骤:
- 访问
/ueditor路径 - 设置
action=catchimage - 传入恶意URL参数
3. RCE漏洞
第一处:反序列化RCE
依赖条件:
- 使用了CommonsBeanutils1依赖
- 使用了Apache Shiro且版本<1.4.2(可利用Shiro-721)
复现步骤:
- 生成恶意序列化payload:
// 使用TemplatesImpl和BeanComparator构造payload
byte[] code = Base64.getDecoder().decode("恶意字节码");
TemplatesImpl obj = new TemplatesImpl();
setFieldValue(obj, "_bytecodes", new byte[][]{code});
// ... 构造PriorityQueue...
- 使用Shiro-721利用工具爆破rememberMe Cookie
- 发送包含恶意payload的请求
第二处:文件上传RCE
漏洞位置:
- 文件管理中的压缩包上传功能
AntZipUtils.unzip()未对文件名进行安全处理
复现步骤:
- 准备包含war包的压缩文件(如冰蝎webshell)
- 通过文件上传功能上传压缩包
- 系统自动解压并将war包移动到tomcat的webapps目录
- 访问webshell路径
技术细节:
- 直接上传jsp文件会被
JspDispatcherFilter拦截 - war包解压后形成独立应用,不受原过滤器限制
三、防御建议
-
XSS防御:
- 所有用户输入输出点进行HTML实体编码
- 统一使用escape标签处理前端模板
-
SSRF防御:
- 校验URL参数的白名单
- 禁用非常规协议(如file://)
- 设置网络访问权限
-
反序列化防御:
- 升级Shiro至最新版本
- 使用安全的序列化库
- 校验反序列化数据
-
文件上传防御:
- 校验文件类型和内容
- 限制解压路径
- 对文件名进行规范化处理
四、参考资料
- 《JAVA代码审计(入门篇)》
- Shiro-721漏洞利用工具:https://github.com/inspiringz/Shiro-721
- Apache Commons Beanutils安全公告