08 常见的服务端安全漏洞介绍及防护方案 | 青训营

177 阅读3分钟

1 第三方组件漏洞

可能出现以下中毒情况:

  • 打印一条系统日志
  • 解析某条json

防护方式: 针对Java可以选择使用dependency-check-maven来检查项目内的组件是否存在相关漏洞

2 SQL 注入

SQL 语句的静态模板和动态数据部分没有严格进行区分。如果在数据中加入了一些 SQL 语句关键字(例如 SELECT、DROP),这些语句就很有可能在数据库写入或读取数据时得到执行。

在使用union select时,可能会从服务器中查询到更多的信息。

引发 SQL 注入问题的写法:

  1. Java 错误使用语言框架,或者语言框架本身就存在着安全问题:使用 Mybatis-plus 的危险函数(例如inSql,其支持直接 SQL 拼接,存在着 SQL 注入风险。
  2. Java Mybatis 中使用 [$] 构建 SQL 模板,可能会明文暴露出 id 值
  3. Go 在常见的业务场景中经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度来带到 Order 中,则可能会产生 SQL 注入。攻击者可以通过输入 SQL 语句,来改变原始的 SQL 语义。

防护方式:

  1. 尽量不要使用基于 DB 的 Raw 方法拼接构造 SQL 语句,而应当使用预编译、ORM 框架
  2. 在使用 ORM 框架时,应当注意框架的特性,可能会存在不安全的写法导致的 SQL 注入
  3. 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义

3 命令执行漏洞

在代码中,遇到需要调用某个命令才能完成的功能时候,会涉及到命令拼接的问题。如果命令拼接没有做好安全过滤,那么将会出现命令注入的风险,可能会导致服务器被控制。

防护方式:

  1. 对动态值进行白名单验证
  2. 如果不能设置白名单,则需要尝试校验数据类型
  3. 特殊字符可进行黑名单过滤或者转义

4 越权漏洞

越权是指资源访问或操作的时候主体权限没有进行资源校验,导致主体获得了权限范围外的数据。

分类:

  • 未授权
  • 水平越权
  • 垂直越权

防护方式:

  • 水平越权:涉及资源id时尽量不要使用短id,因为其遍历难度较小,同时做好资源属主校验
  • 垂直越权:简单场景下可以将接口在路由级别进行分组,对不同API分组引入 Middleware 进行权限拦截,Middleware 获取当前的用户角色从而确定是否可以访问该接口

5 服务端请求伪造攻击(SSRF)

SSRF 是指攻击者利用后端服务器作为跳板,让后端服务指向非预期的网络地址(主要是内网地址)发出恶意请求,从而获取敏感信息,或者执行恶意操作。

防护方式: 对 URL 的 host 进行白名单过滤,获取对 host 解析的 IP 进行判断,判断其是否是内网地址。

6 文件上传漏洞

上传文件的过程中,如果没有对上传包加以限制,可能会出现恶意文件攻击;或者有公开的上传点,上传恶意文件后获取图片 URL ,然后直接分享 URL 至外部恶意网站或 QQ / 微信群。

防护方案:

  1. 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式
  2. 站库分离:应用部署的位置和上传的文件进行分离,一般可以使用 TOS、OSS 等进行文件存储
  3. 防止图床:对图片访问链接进行限制,包括时间限制、访问身份限制等