01
项目介绍
– 项目名称:lcg0124/bootdo
– 项目地址:
https://github.com/lcg0124/bootdo
– 项目描述:一个资产挺多且有超多大型企业单位使用的java框架。
02
资产情况
03
代审分析
01
越权+信息泄露
代码侧接口未全部使用鉴权注解,导致部分高危功能任意账户即可越权操做,信息泄露在于user的密码/session的获取。
当我使用管理员账户进行登录时:
随便访问一个接口,比如数字字典会触发shiro权限认证:
得到所有应该有的权限。
这两张表是用于得到该角色有什么样的权限的角色权限绑定的表。
然后我们看下低权限用户(ldh)的功能:
只有一个后台进入界面的权限。
然后我们分析数据库:
先用用户ID绑定角色ID然后用角色ID绑定菜单权限。
逻辑是这样,但是我们登录的ldh没有绑定任何角色。
访问菜单是没有权限的,我们确定他是用注解的方式加入权限控制的,所以我们要找没有鉴权的。
比如获取所有用户的:
http://192.168.0.105/sys/user/list?limit=10&offset=1&name=&deptId=
越权得到所有用户及其密码密文。
比如越权获取所有用户的在线session或者强制退出某个session的用户:
既sessionlist:
又比如用户处理节点的全部:
比如查看所有的请假审批流程:
http://192.168.0.105/activiti/task/gotoList?limit=1000000&offset=0
都是没鉴权的:
包括定时任务的添加删除:
其余的增删不做过多截图,威胁点都已经提供。
通用型:CNVD-C-2024-22302
02
SQL注入
以Log查询的日志模块为例:
Sort
Order
有druid的sql waf,稍微小测试一下。
通过报错注入对其进行注入。注入点在排序的sort和order。
但是线上环境中存在对报错统一处理的情况,这里我用sqlmap跑出注入payload,无论是盲注还是延时都可以。
从源码中看待此处注入:
全局搜索未做预编译处理的代码:
以Log日志模块为例子:
如果不想下载源码进行调试,可以直接访问github的源码地址:
https://github.com/lcg0124/bootdo/blob/master/bootdo/src/main/resources/mybatis/common/LogMapper.xml
只要让offset即sort的传入值不为空即可进入该条件,然后对sort直接报错注入即可,对order需要加入,使其另成语句。
结果就是sort处payload:updatexml(1,concat(0x7e,current_user,0x7e),1)
order处payload:,updatexml(1,concat(0x7e,current_user,0x7e),1)
03
存储XSS
代码侧拦截器对XSS的过滤条件太粗糙,导致普通构造一下语句即可绕过,此为全站问题,甚至随意在URL上输入payload,也会在日志模块弹出。
先到com.bootdo.system.filter.XssHttpServletRequestWrapper,我们可以直接看到:
Xss的处理是Jsonp.clean()方法:
处理过滤:
白名单属性和方法都写明。
所以我们构建一个简单的payload:<script>top[“al”+”ert”](`xss`);</script>
方法还有很多,随便找个写入的地方:
比如数据字典中点添加的随便一个文本框:
提交后:
04
随便聊聊
最近没啥能发的,没啥好看的,三天两头像这样发个报告得了。
原文始发于微信公众号(阿呆攻防):代审分析|Bootdo框架通用型漏洞SQL注入+越权+信息泄露+存储XSS(一文全审)