网站常见安全漏洞-服务端漏洞 | 青训营

111 阅读5分钟

这是我在青训营笔记创作活动的第三篇笔记。

什么是漏洞

一个网站有前端,后端组成

前端负责页面展示和接口调用

后端负责提供接口,完成实际的业务逻辑,对数据进行处理。

前后端中间可能会有中间组件,比如网关(以nginx为例),可能还会涉及到静态资源的CDN等等。

常见的安全事件

  • 数据泄露
  • 服务瘫痪
  • 成果失窃
  • 系统劫持

攻击者和意图

  • 政治目的:窃取或破坏关键系统正常运行
  • 经济目的:违法获取数据并售卖
  • 竞争目的:同行攻击
  • 炫技、泄愤

信息安全从业人员通常分为蓝军和红军

蓝军:反向验证内部安全现状,以攻促防 红军:系统建设时候帮助企业提前规避漏洞

网站攻击者

  • 针对客户端的漏洞攻击
  • 针对服务端(后端)漏洞的攻击

服务端漏洞

第三方组件漏洞

打印一条日志,服务器就“中病毒”了?

log4j 漏洞

解析下json,服务器就“中病毒”了?

fastjson 漏洞

防护方式

针对 Java 可以选择使用 dependency-check-maven 检查项目里面的组件是否存在安全漏洞 即使更新组件版本

SQL 注入

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

Java 错误使用 ORM 框架,或者 ORM 框架本身存在安全问题

使用 Mybatis-plus 的危险函数,比如 inSql,支持直接 SQL 拼接,存在 SQL 注入风险

Mybatis 使用 $ 构建 SQL 模板

Golang 常见错误写法

业务场景经常遇到根据用户自定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到 Order 则会产生 SQL 注入,假设 ORM 语句为:db.Order(param).Find(&products)

正常情况下用户输入维度字段即可自定义排序

param: code
SQL语句:SELECT *FROM `products` WHERE `products`.`deleted_at` IS NULL ORDER BY code

攻击者可以输入SQL语句,改变原始 SQL 语义

param: if(1, sleep(10),'code')
SQL语句:SELECT *FROM `products` WHERE `products`.`deleted_at` IS NULL ORDER BY if(1, sleep(10),'code')

防护方式

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

命令执行(RCE)

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

防护方式:

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

越权漏洞

  • 认证:你是谁
  • 授权:你能做什么?
  • 越权:资源访问或操作时候主体权限没有进行校验就会造成越权问题,细分为:未授权、水平越权和垂直越权

水平越权

  • 黑灰产场景:订单查询功能提供订单id即可查询订单详情,这里攻击者可以遍历orderId获取其他用户的订单信息
  • 防护方式:设计资源id时尽量不要使用短id(遍历难度较小),勇士最重要的一定要做好资源属主校验

垂直越权

普通用户访问:前端直接拦截,提示无权限 管理员用户访问:判定是管理员,可以直接访问

  • 黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过你想前端代码获取实际接口,然后绕过前端直接尝试访问后端,获取数据详情
  • 防护方式:如果是简单的场景,可以将接口在路由器级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。

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

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

例如,论坛设置头像(上传图片或图片链接)如果提供恶意的链接,就可能达到攻击效果

服务端流程:服务端请求stockApi,获取结果返回 攻击者:将stockApi参数改为内网地址,访问内网资源

很多后台管理不对外网开放,由内网发起的请求则不会被拒绝

防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址。 不便于进行白名单过滤可对库中解析地址的函数进行一些hook,判断是否是内网地址

文件上传漏洞

将上传的图片文件改为读取文件的 php 脚本,可以读取到敏感目录下的文件,或者执行恶意操作

白嫖CDN:有一些网站找到公开的上传点(如视频创造/文章创作/客服反馈等),上传恶意文件(恶意视频,图片)获取图片url,然后直接分享url至外部恶意网站或QQ/微信群

防护方案:

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