免责声明
由于传播、利用本公众号菜狗安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号菜狗安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,会立即删除并致歉。
一、项目介绍二、项目搭建三、漏洞挖掘3.1 多处sql注入3.2 多处XSS3.2.1 第一处3.2.2 第二处3.3 鉴权绕过3.3.1 第一种3.3.2 第二种3.4 垂直越权(用户删除)3.5 fastjson反序列化四、总结
一、项目介绍
华夏ERP基于SpringBoot框架和SaaS模式,立志为中小企业提供开源好用的ERP软件,目前专注进销存+财务功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有库存状况、出入库统计等报表。同时对角色和权限进行了细致全面控制,精确到每个按钮和菜单。
技术框架
核心框架:SpringBoot 2.0.0持久层框架:Mybatis 1.3.2日志管理:Log4j 2.10.0JS框架:Jquery 1.8.0UI框架: EasyUI 1.9.4模板框架: AdminLTE 2.4.0项目管理框架: Maven 3.2.3
二、项目搭建
源码地址:https://gitee.com/jishenghua/JSH_ERP/archive/refs/tags/v2.3.zip
源码下载到本地,IDEA打开,等待MAVEN加载
根据配置文件修改数据库配置
jshERP-2.3\src\main\resources\application.properties
创建对应数据库,并导入数据库文件
sql文件:jshERP-2.3\docs\jsh_erp.sql
导入完成后,spring boot启动项目
账号:jsh/123456
三、漏洞挖掘
3.1 多处sql注入
老规矩,先判断使用技术
使用mybatis,搜索关键词${
有不少,这里点第一个进去看一下
参数是name,对应dao层方法名为selectByCinditionRole,转到dao层
往上跟这个方法
接着跟,跟到功能层
这里可以看到name的获取,是来源于search里面,获取到的是map类型也就是键值对,接着往上跟看下这个search是那里来的
跟到了功能层,这里其实是通用的功能层代码,也就是,多处sql注入都是调用这段代码,什么意思呢?
如果你自己尝试跟了几处${
,会发现最后都会跟到这一处功能层代码来,因为它是通用的,那么不同的是什么呢,是路由的访问路径,它会根据/{apiName}/
的不同触发对应的功能点,但是主要是访问/list就会触发这里
那么如何确认那个路由的search参数里的键是name呢?
我还没总结出来,有一个相对笨的方法,参数是name,那么就使用burp测试功能点,寻找访问路由为/xxx/list,search中存在name的数据包,那个就是对应的功能点。
这里可以用数据库监控看下是否有语句执行。
可以看到有,但是这里没有报错注入,可以使用时间盲注
3.2 多处XSS
这套系统有很多提交表单的地方,并且会在前端回显,一不注意就会产生XSS
3.2.1 第一处
在创建商品处
哇,这么多框,这谁顶得住
这个要测试哪处有,最简单的就是全插
保存回显XSS3,只有这一个单位这个字段有XSS
只要到选择商品就会触发
3.2.2 第二处
这里三个表单都有
3.3 鉴权绕过
先判断使用技术,看是否存在jwt和shiro
查看pom.xml文件,没发现,去看是否存在filter层
存在,并且只有一个文件,点进去看下,看这个名字就是登入相关的
3.3.1 第一种
熟悉的代🐎
这里先判断用户是否登入,userInfo是否为null,没登入的话肯定是不满足的,我们往下看
requestUrl != null && (requestUrl.contains("/doc.html") requestUrl.contains("/register.html") || requestUrl.contains("/login.html"))
判断requestUrl不为null,并且访问路径包含doc.html || register.html || login.html 就放行
由于使用的是contains方法,只要包含就行,我们可以构造这样的url
127.0.0.1:8080/login.html/../xxx/xxxx
这里就满足条件还可以访问后台功能点
我这里随便找一个功能点
现在是登入状态,可以看到有数据回显,退出登入再发包
可以看到返回302跳转,我们构造访问路由
有返回数据,存在绕过
3.3.2 第二种
看下代码解释
该Java注释定义了一个名为LogCostFilter的Web过滤器,用于拦截几乎所有网站路径(/*
)。
它具有两个初始化参数:
ignoredUrl
:值为.css#.js#.jpg#.png#.gif#.ico,表示过滤器将忽略这些文件类型的请求。
filterPath
:值为/user/login#/user/registerUser#/v2/api-docs,指定特定路径,但该参数值格式似乎有误,应为实际路径列表。
可以理解为访问路由中存在上面的值,就不会进行鉴权
这种利用和第一处一样,还有一种
这个也比较好理解,访问路由中存在.ico,就会绕过鉴权,而在Servlet容器中,;后面的内容通常不会影响实际的请求处理路径,;后面的内容会进行截断也就是说实际访问的路径还是/user/getAllList
这里两处鉴权都可以用于访问/user/getAllList这个接口,这个接口会回显网站所有用户的账号密码,密码要md5碰撞解密
3.4 垂直越权(用户删除)
在后台有用户删除的功能(管理员才有),抓包看下
对应路由是deleteUser,控制参数是ids
定位代码段
这里没有看鉴权,跟进batDeleteUser方法
这里也没有看到鉴权方法,而是接收ids的值进行批量删除,那么这里就存在问题
没有对用户进行鉴权,那么普通用户也可以进行删除,接口也没有限制访问
登入个普通用户,替换cookie
成功删除
除此之外还有部分用户操作没有鉴权,比如用户信息修改等等,感兴趣的可以自行下去测试
3.5 fastjson反序列化
项目中引入了fastjson
版本为1.2.55
全局搜索JSON.paeseObject(
可以看到有不少,我这里随便点一处看参数是否可控
这里参数可控,我们尝试构造访问路由访问
测试个简单的dns链
{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}
收到回显,接下来尝试后续利用,找个版本符合的绕过链
仓库:https://github.com/safe6Sec/Fastjson
这个实话实话,我试了几个,不行
应该是有的,但是我没找到,
2022年的蓝帽杯有一题赌怪用的就是华夏erp
参考链接:https://cloud.tencent.com/developer/article/2118748
感兴趣的可以自己下去尝试,就是跑链
总结
这套系统的漏洞应该还有,不局限于我文章中写到的基础,代码中有文件上传代码,是安装插件的,但是网站我没找到安装插件的功能,fastjson链的利用,我在网上找了很多篇文章,这套系统关于这个点只到dns,所以我目前也不知道哪条链可以用,通过爆破应该可以试出来。
原创 C@ig0 菜狗安全