Java代码审计篇——Ofcms

admin 2022年8月15日19:26:12代码审计评论10 views2420字阅读8分4秒阅读模式

0x01 后台任意文件上传

漏洞点:

模板文件->模板文件->模板目录->修改index.html

对应的代码在ofcms-admin/src/main/java/com/ofsoft/cms/admin/controller/cms/TemplateController控制器中的save方法

/**
 * 保存模板
*/
public void save() {
    String resPath = getPara("res_path");
    File pathFile = null;
    if("res".equals(resPath)){
        pathFile = new File(SystemUtile.getSiteTemplateResourcePath());
    }else {
        pathFile = new File(SystemUtile.getSiteTemplatePath());
    }
    String dirName = getPara("dirs");
    if (dirName != null) {
        pathFile = new File(pathFile, dirName);
    }
    String fileName = getPara("file_name");
    // 没有用getPara原因是,getPara因为安全问题会过滤某些html元素。
    String fileContent = getRequest().getParameter("file_content");
    fileContent = fileContent.replace("&lt;", "<").replace("&gt;", ">");
    File file = new File(pathFile, fileName);
    FileUtils.writeString(file, fileContent);
    rendSuccessJson();
}

这里是直接通过上传文件,来替换掉原文件来达到修改文件的功能。但是没有对传入的file_name和file_content进行过滤,导致可以直接任意上传文件

如果resPath=res,那么新建文件的位置就在resource/defaultfile_name=../../static/le1a.jsp

Java代码审计篇——Ofcms

如果respath=空,那么新建文件的位置就在WEB-INF/page/default,file_name=../../../static/le1a.jsp

Java代码审计篇——Ofcms

默认res是空的,这里直接抓包修改file_name=../../../static/le1a.jsp,然后发包

file_path=F%3A%5CCTF2%5Capache-tomcat-9.0.58%5Cwebapps%5Cofcms_admin_war%5CWEB-INF%5Cpage%5Cdefault%5Cindex.html&dirs=%2F&res_path=&file_name=../../../static/le1a.jsp&file_content=哥斯拉jsp马的url编码image-20220806122436172

Java代码审计篇——Ofcms

Java代码审计篇——Ofcms

Java代码审计篇——Ofcms


0x02 存储型XSS

评论接口ofcms-api/src/main/java/com/ofsoft/cms/api/v1/CommentApi.java

/**
 * 评论接口
 *
 * @author OF
 * @date 2019年2月24日
 */
@Action(path = "/comment")
public class CommentApi extends ApiBase {
    /**
     * 获取内容信息
     */
    @ApiMapping(method = RequestMethod.GET)
    @ParamsCheck(
            {@ParamsCheckType(name = "comment_content"), @ParamsCheckType(name = "content_id"),
                    @ParamsCheckType(name = "site_id")})
    public void save() {
        try {
            Map params = getParamsMap();
            params.put("comment_ip", IpKit.getRealIp(getRequest()));
            Db.update(Db.getSqlPara("cms.comment.save", params));
            rendSuccessJson();
     
   } catch (Exception e) {
            e.printStackTrace();
            rendFailedJson();
        }
    }
}

在save方法中调用了getParamsMap方法,获取用户提交的所有参数。然后通过getRealIp()方法把获取到的IP写入params参数的comment_ip键,然后调用Db.update()方法把数据更新到数据库中。在这当中没有对用户传入的comment_content进行过滤。可以直接传入<script>alert("23333")</script>导致XSS,我本地环境好像有问题,直接网络连接失败,换了个环境测试,OK。

Java代码审计篇——Ofcms

From:https://www.le1a.com/posts/87e2e724/

往期推荐 

// 1

德尚商城(TP5.0.24)反序列化漏洞详细分析利用

// 2

对某外企的一次内网渗透复盘(三)

// 3

简单实现程序DLL劫持

// 4

一次实战挖掘软件逻辑漏洞

原文始发于微信公众号(巡安似海):Java代码审计篇——Ofcms

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月15日19:26:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Java代码审计篇——Ofcms http://cn-sec.com/archives/1237014.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: