[TOC]
0x01环境搭建
Release 华夏ERP_v2.3 · jishenghua/jshERP · GitHub
连数据库,改端口,直接run
0x02代码审计
Filter过滤器
- ignoredUrl:表示被忽略的 URL 的模式,它使用 # 分隔了一些后缀名,如 .css、.js、.jpg、.png、.gif、.ico,这些后缀名的 URL 将不会被 LogCostFilter 过滤。
- filterPath:表示需要过滤的 URL 的模式,它使用 # 分隔了一些需要过滤的 URL,如 /user/login、/user/registerUser、/v2/api-docs 等。
接着是初始化
1 | public void init(FilterConfig filterConfig) throws ServletException { |
获取两个参数·*FILTER_PATH*
和*IGNORED_PATH*
,检索其是否有#,并分离然后存入数组
再来看下doFilter
函数,这也是来看Filter`过滤器实际的作用
1 | public void doFilter(ServletRequest request, ServletResponse response, |
这里理解起来也比较简单
首先是初始化的两个变量,一个请求一个相应,requestUrl
获取请求的Url
第一个if
1 | 然后读取`Session`获取用户信息 |
第二个if
1 | 如果Url不为空就判断是否包含"/doc.html","/register.html"和"/login.html" |
第三个if
1 | 调用`verify`函数,实际上就是来检测`Url`是否是可忽视`Url` |
第四个if
1 | 如果允许Url数组不为空,则检索Url是否在允许列表 |
否则跳转到登录界面
可直接访问忽略的urlpath
那么这里考虑两个问题,实际是一个问题
也就是Filter放行的两个数组名单,一个忽略的一个白名单
第一
其中对*ignoredList*
的判断是通过一个verify
函数,
相当于只匹配regex
而不顾及前后缀
这里应该使用endsWith()
来判断资源的后缀为js、css等
第二
白名单的判断通过startsWith()
的话
是可以通过目录穿越来饶过认证
另外如果Url
中存在/doc.html,/register.html,/login.html同样也会放行,也就是可以进行绕过
鉴权绕过
前面我们说了Filter
拦截器的处理规则
当Url
中存在/doc.html,/register.html,/login.html的时候就会直接放行
这里没有session,就会重定向到login.html界面
SQL注入
全局搜索${
来到UserMaooerEx.xml
全局搜索selectByConditionUser
到UserMapperEx
的接口
接着全局搜索或者查找引用
到UsserService
的java文件
来到UserComponent
接着找哪里调用了UserService.select
方法
这里通过search
字段获取userName
和loginName
并且可控
在CommonQueryManager
下调用
接着来到ResourceController
这里到了contoller层就可以看前端获取数据了
到用户管理界面进行验证