1 第三方组件漏洞
可能出现以下中毒情况:
- 打印一条系统日志
- 解析某条json
防护方式: 针对Java可以选择使用dependency-check-maven来检查项目内的组件是否存在相关漏洞
2 SQL 注入
SQL 语句的静态模板和动态数据部分没有严格进行区分。如果在数据中加入了一些 SQL 语句关键字(例如 SELECT、DROP),这些语句就很有可能在数据库写入或读取数据时得到执行。
在使用union select时,可能会从服务器中查询到更多的信息。
引发 SQL 注入问题的写法:
- Java 错误使用语言框架,或者语言框架本身就存在着安全问题:使用 Mybatis-plus 的危险函数(例如
inSql,其支持直接 SQL 拼接,存在着 SQL 注入风险。 - Java Mybatis 中使用
[$]构建 SQL 模板,可能会明文暴露出 id 值 - Go 在常见的业务场景中经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度来带到 Order 中,则可能会产生 SQL 注入。攻击者可以通过输入 SQL 语句,来改变原始的 SQL 语义。
防护方式:
- 尽量不要使用基于 DB 的 Raw 方法拼接构造 SQL 语句,而应当使用预编译、ORM 框架
- 在使用 ORM 框架时,应当注意框架的特性,可能会存在不安全的写法导致的 SQL 注入
- 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义
3 命令执行漏洞
在代码中,遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接的问题。如果命令拼接没有做好安全过滤,那么将会出现命令注入的风险,可能会导致服务器被控制。
防护方式:
- 对动态值进行白名单验证
- 如果不能设置白名单,则需要尝试校验数据类型
- 特殊字符可进行黑名单过滤或者转义
4 越权漏洞
越权是指资源访问或操作的时候主体权限没有进行资源校验,导致主体获得了权限范围外的数据。
分类:
- 未授权
- 水平越权
- 垂直越权
防护方式:
- 水平越权:涉及资源id时尽量不要使用短id,因为其遍历难度较小,同时做好资源属主校验
- 垂直越权:简单场景下可以将接口在路由级别进行分组,对不同API分组引入 Middleware 进行权限拦截,Middleware 获取当前的用户角色从而确定是否可以访问该接口
5 服务端请求伪造攻击(SSRF)
SSRF 是指攻击者利用后端服务器作为跳板,让后端服务指向非预期的网络地址(主要是内网地址)发出恶意请求,从而获取敏感信息,或者执行恶意操作。
防护方式: 对 URL 的 host 进行白名单过滤,获取对 host 解析的 IP 进行判断,判断其是否是内网地址。
6 文件上传漏洞
上传文件的过程中,如果没有对上传包加以限制,可能会出现恶意文件攻击;或者有公开的上传点,上传恶意文件后获取图片 URL ,然后直接分享 URL 至外部恶意网站或 QQ / 微信群。
防护方案:
- 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式
- 站库分离:应用部署的位置和上传的文件进行分离,一般可以使用 TOS、OSS 等进行文件存储
- 防止图床:对图片访问链接进行限制,包括时间限制、访问身份限制等