网站常见安全漏洞 | 青训营

98 阅读6分钟

前言

本篇笔记为学习了青训营课程《网站常见安全漏洞》相关内容后所整理,主要介绍了服务端漏洞和客户端漏洞两方面

如有错误之处,欢迎批评指正

什么是漏洞

一个网站的基本构成

前端:JavaScript / Vue / react

网关:nginx

后端:Go / Java / Node

前后端交互:HTTP / WebSocket

漏洞的分类

服务端漏洞:

  • SQL
  • RCE / 命令注入
  • SSRF
  • 文件上传
  • ……

客户端漏洞:

  • XSS
  • CSRF
  • 点击劫持
  • ……

服务端漏洞

第三方组件漏洞:

防护方式:针对java可以选择使用dependency-check-maven检查项目依赖的组件是否存在安全漏洞

SQL注入

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

  1. [java]错误使用语言框架,或者语言框架本身存在安全问题

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

  2. [java]Mybatis使用 $构建SQL模板

  3. [Golang]常见错误写法

    业务场景经常遇到根据用户定义的字段进行排序的功能,如果直接将用户输入字段作为维度带到order则产生SQL注入

防护方式:

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

命令执行

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

防护方式:

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

越权漏洞

  • 水平越权

    黑灰产场景:订单查询功能提供订单id即可查询订单详情,攻击者可以遍历ordered获取其他用户的订单信息

    防护方式:涉及资源id尽量不要使用短id(遍历难度较小),同时最重要的一定要最好资源属主校验

  • 垂直越权

    普通用户访问:前端直接拦截,提示无权限

    管理员用户访问:判定是管理员,可以直接访问

    黑灰产场景:攻击者可以通过开通另外的测试管理员账户抓包获取接口,或者通过逆向前端代码方式获取实际接口,然后绕过前端直接尝试访问后端接口,获取数据详情。

    防护方式:如果是简单的场景,可以将接口在路由级别进行分组,对不同的API分组引入Middleware进行权限拦截,Middleware获取当前用户角色以确定是否可以访问此接口。

SSRF

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

服务端流程:服务端请求stockAPI,获取结果返回。

攻击者:将stockAPI参数改为内网地址,访问内网资源

将URL改为:http://localhost/admin , 直接访问内网页面

文件上传漏洞

找到公开的上传点(如视频创作/文章创作/客服反馈等),上传恶意文件(恶意视频、图片),获取图片URL,然后直接分享URL至外部恶意网站或QQ群、微信群。

防护方式:

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

客户端漏洞

开放重定向

某些需要重定向到其他站点的功能,往往在参数中携带需要重定向的URL,但实际程序逻辑没有控制好重定向的范围,导致攻击者可以构造恶意链接,诱导用户重定向到恶意站点。

危害:钓鱼攻击

修复方案:对重定向严格进行白名单控制并正确校验匹配白名单

XSS

跨站脚本(XSS)攻击:本质是一种Script代码注入,攻击者往目标Web中插入恶意Script代码,当用户访问页面(有客户端需要交互)时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的

场景:反射型,存储型,Dom型

危害:通常的危害包括窃取用户敏感信息,以用户身份执行敏感操作。

防护方法:

  1. 输入过滤:

    对输入的特殊字符进行拦截,禁止前端提交特殊字符

  1. 输出过滤: a. 当字符输出到Dom时候,对危险字符进行html encode,避免XSS。 b. 使用Vue/react等框架时候,避免使用危险指令,而应该使用安全指令。
  1. 富文本场景:比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制tag和3.attribute,可以在代码层面做白名单或者黑名单。 <tag attribute1='value1' attribute2='value2' />
  1. CSP: 用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。

CSRF

跨站请求伪造(CSRF):允许攻击者诱导用户访问恶意链接,执行用户非预期执行的操作。

危害:用户执行敏感操作,如关注其他用户,或者更改账号的安全邮箱等

防护方式: 防护的核心是判断请求的来源

  1. CSRF tokens: 首次访问时候给客户端传递一个token,客户端每次访问时候都必须带上此token才能访问
  1. SameSite cookies: Strick -> Lax(Default) -> None, 核心是禁止某些场景发送第三方cookie。
  2. 3.Referer-based validation: 校验 Referer 来源是否是合法站点。

注意事项

  1. 网站运营者: 网络运营者应当采取技术措施和其他必要措施,确保其收集的个人信息安全,防止信息泄露、毁损、丢失。在发生或者可能发生个人信息泄露、毁损、丢失的情况时,应当立即采取补救措施,按照规定及时告知用户并向有关主管部门报告
  1. 组织/个人: 任何个人和组织不得窃取或者以其他非法方式获取个人信息,不得非法出售或者非法向他人提供个人信息。