SQL注入查找
Mybatis审计技巧,众所周知,MyBatis支持两种参数符号,一种是#,另一种是$,#使用预编译,$使用拼接SQL。在SQL语句中使用like,order by,in语句中,使用 #{} 会将对象转成字符串,形成 order by \"user\" desc 造成错误,因此很多研发会采用${}来解决,从而造成SQL注入
查看mapper文件,或者全局搜索${
找到一处这里使用的是$拼接符号
其对应的mapper的dao层如
查看此方法被那个controller调用
在可控参数处插入SQL语句查询SELECT SCHEMA_NAME AS NAME FROM information_schema.SCHEMATA LIMIT 0;
尝试debug 可以看到前端传入的SQL语句已经被执行了
失败的目录穿越
查看代码
发现没有对../
进行过滤,尝试挖掘
get请求/WMS/commons/fileSource/download/../1.txt
,发现返回404,才发现他的value的值如下value = "download/{fileName:.+}"
这里直接拼接/../
springboot会解析到上层接口
如下写法即可直接解析/../
@RequestMapping(value = "/download/**", method = RequestMethod.GET)
public void downloadFile(@PathVariable String fileName, HttpServletResponse response) throws IOException {
// ...
}
要想在这个接口进行目录穿越就要如下请求/WMS/commons/fileSource/download/supplierInfo.xlsx/../1.txt
但是被@PathVariable
注解取出参数为1.txt,,所以此处并无任意文件读取。
越权
请求包如下
登录普通用户,使用普通用户的cookie进行操作,即可删除成功
查看代码也没有看到鉴权的地方
通读后端的api都没有做相关的鉴权处理,只对cookie的sid的值做了判断。
未授权
我想看看它的鉴权系统是怎么做的,这里他用的shiro做的权限配置
Shiro的认证流程如下:
- 用户提交登录请求
- Shiro Filter拦截请求
- Shiro Filter根据请求的URL配置,判断是否需要进行身份认证
- 如果需要进行身份认证,Shiro Filter将请求转发给认证器
- 认证器根据用户的身份信息进行认证
- 如果认证成功,Shiro Filter将请求转发给目标资源
- 如果认证失败,Shiro Filter将返回登录页面
其中安全管理器是Shiro的核心,负责Shiro的所有安全操作。安全管理器需要配置以下几个属性:
- Realm:用于认证和授权的领域
- 记住我管理器:用于记住用户的登录状态
- 认证器:用于进行身份认证
- 授权器:用于进行权限授权
再看shiro的配置的时候,发现一个控制URL权限信息的地方
查看其中对应的白名单创建类如下
这个类用于构建一个定义权限规则的 Map 结构。该 Map 将 URL 路径映射到对应的过滤器链,用来控制对这些 URL 的访问权限。
这里在请求的时候,在路径上添加这些前缀即可 /css/,/js/,/fonts/,/media/,/pagecomponent/,/account/checkCode/
存储型XSS
查看接口处进行debug
查看dao层
之后就是调用mapper.xml中的对应的sql语句
没有任何对XSS的过滤,所里理论上不止这一个接口,所有跟数据库又交互的地方,应该都有XSS
shiro
版本很老,shiro的721是1.4.2版本之后,也就是说自2019年之后shiro的漏洞 它都有。攻击方法具体参考如下:https://www.jianshu.com/p/833582b2f560
小结
这个管理系统后台没有上传点和模板管理处,无法RCE。只针对从各个功能点的缺陷进行审计。