服务端漏洞
1. 第三方漏洞
- 在log函数中设置恶意程序 在远端服务器执行对于本服务器的恶意程序
- 在解析json字符串的过程中涉及到了异常触发的流程 最终导致恶意程序被执行
选用第三方组件时要慎之又慎 防止第三方组件的恶意攻击
防护方式: 针对Java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞
2. SQL注入
SQL语句静态模板和动态数据没有严格区分 如果在数据项中加入了某些SQL关键字(如SELECT DROP等) 这些SQL语句就很可能在数据写入或读取数据时得到执行
例子: 在登录界面时输入用户名时加上SQL的注释引号标识 便可以越过密码输入直接任意登录 非常严重的问题 此类漏洞甚至可以直接拿下整个数据库
- 查询订单的函数如果使用SQL查询加上字符拼接 很容易通过union select查询出更多的订单
危险的使用方法:
- [Java] 错误使用语言框架 或者语言框架本身存在安全问题 使用Mybatis-plus的危险函数 比如inSQL 直接支持SQL拼接 存在SQL注入风险(可以用类似ORM的组件来分清楚对象和语句 防止乱拼接的情况发生)
- [Java] Mybatis使用$构建SQL模板 相比于使用# 使用$会导致query的内容直接显示在请求行上 十分不安全
- [Golang] 业务场景经常遇到根据用户自定义的字段进行排序的功能 如果直接将用户输入的字段作为维度带到Order则会产生SQL注入
防护方式: - 尽量不要基于DB的Raw方法拼接构造SQL语句 而应该使用预编译 ORM框架
- 使用ORM框架时 应该注意框架中的特性 可能存在不安全的写法导致的SQL注入问题
- 在复杂场景内一定要使用拼接SQL的时候 需要对外部输入进行转义
3. 命令执行
代码中遇到需要调用某个命令才能完成的功能的时候 会涉及到命令拼接 如果命令拼接没有做好安全过滤 那么将会导致命令注入风险 服务器权限将会被控制 防护方式:
- 对动态的值尽可能设置白名单进行验证
- 如果某些位置无法白名单 需要尝试对数据类型进行校验
- 特殊字符黑名单过滤或者转义
4. 越权漏洞
资源访问或操作的时候主题权限没有进行校验就会造成越权问题 细分为未授权 水平越权和垂直越权
- 水平越权:订单查询功能提供订单id即可查阅订单详情 这里攻击者可以遍历orderId获取其他用户的订单信息 防护方式:涉及资源ID尽量不要使用短ID(遍历难度较小) 同时最重要的一定要做好资源属主校验
- 垂直越权:攻击者可以通过开通另外的测试管理员账号抓包获取接口 或者通过逆向前端代码方式获取实际接口 然后绕过前端尝试直接访问后端数据库 获取数据详情 防护方式:如果是简单的场景 可以将接口在路由级别进行分组 对不同的API分组引入Middleware进行权限拦截 Middleware获取当前用户角色以确定是否可以访问此接口
5. SSRF
SSRF又称服务端请求伪造攻击 指攻击者利用后端服务器作为跳板 让后端服务向非预期网络地址(主要指内网地址)发出恶意请求 获取敏感信息或者执行恶意操作