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

150 阅读6分钟

什么是漏洞

网站的基本构成

Image.png

前端、网关、后端、前后交互,任何一个地方都有可能出现漏洞。

安全事件

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

攻击意图:政治目的、经济目的、竞争目的、炫技泄愤

漏洞分类

服务端漏洞:SQL、RCE/命令注入、SSRF、文件上传

客户端漏洞:XSS、CSRF、点击劫持

服务端漏洞

第三方组件的漏洞

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

SQL注入

SQL语句静态模板和动态数据部分没有严格区分,如果在数据项中加入了某些SQL语句关键字,SQL语句可以在数据库写入或读取数据时得到执行。攻击者在拼接阶段进行攻击,

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

使用mybatis-plus的危险函数(inSql,直接支持SQL拼接,存在SQL注入风险)

Java Mybatis使用占位符构建SQL模板

使用$将后面参数转换为值

GO 直接将用户输入字段作为维度带到Order,产生SQL注入

防护方式

  • 不要基于DB的Raw方法拼接构造SQL语句,应该使用预编译、ORM框架

  • 使用ORM框架时,应该注意框架中的特性,可能存在不安全的写法导致SQL注入问题

  • 在复杂场景一定要使用拼接SQL,需要对外部输入进行转义

命令执行

调用某个命令才能完成功能,会涉及命令拼接。若命令拼接没有做好安全过滤,会导致命令注入风险,服务器权限将被控制。

防护方式:

  • 对动态的值尽可能设置白名单进行验证

  • 如果某些位置无法白名单,需要尝试对数据类型进行校验

  • 特殊字符黑名单过滤,或者转义

越权漏洞

资源访问或者操作时主体权限没有进行校验就会造成越权问题,包括未授权、水平越权和垂直越权

未授权

Image.png

水平越权

Image.png

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

防护方式:涉及资源id尽量不要使用短id,同时一定要做好资源属主校验

垂直越权

Image.png

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

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

SSRF

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

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

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

防护方式:对url的host进行白名单过滤,获取对host解析的ip进行判定,是否是内网地址

文件上传漏洞

知道公开的上传点,上传恶意文件(恶意视频、图片),获取图片url,直接分享url至外部恶意网站

防护方案:

  • 限制文件类型:如果系统只需要图片类型,可以从服务端解析文件格式,限制只能传入特定的文件格式

  • 站库分离:应用部署的位置和上传的文件分离,一般可以使用TOS、OSS等进行文件存储

  • 防护图床:对图片访问链接进行限制,包括时间、身份限制等

客户端漏洞

开放重定向:

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

危害:钓鱼攻击

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

XSS

本质是一种script代码注入,攻击者向目标web页面插入恶意script代码,当用户访问页面时,嵌入其中web里面的script代码会被执行,从而达到恶意攻击用户的目的。

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

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

防护方法:

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

  • 输出过滤:当字符输出到Dom时,对危险字符进行html encode;使用vue/react等框架时,避免使用危险指令,使用安全指令

  • 富文本场景:例如文章发布,需要严格控制tag和attribute,可以在代码层面做白名单或黑名单

  • CSP:当前站点允许加载什么源的资源、发送什么请求进行限制

CSRF

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

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

防护的方式:

  • CSRF token:首次访问时给客户端传递一个token,客户端每次访问都必须带上此token才能访问

  • Samesite cookies:strick -> Lax( Default)-> None 核心是禁止某些场景发送第三方cookie

  • Referer-based validation:校验 referer 来源是否是合法站点

点击劫持

是一种在网页中将恶意代码等隐藏在看似无害或者诱导的内容之下,并诱使用户点击,用户点击后往往会执行一些非预期的操作。

防护方式:核心是不让非预期的网站 iframe 站点

CORS跨域配置错误

CORS解决网页应用跨域访问的需求。

由于开发者在配置CORS过程中,错误配置跨域访问Allow List,导致非预期的站点可以进行跨域访问,最终可能导致信息泄露。

webSocket

本质是http服务的漏洞,问题:

  • WSS和WS:提供加密信道,杜绝一些中间人攻击
  • 数据校验:SQL/XSS/RCE等漏洞仍可能存在
  • CSWSH:使用cookie作为认证方式时,如果webSocket服务端没有校验好请求来源,将导致webSocket会话劫持

防护手段:

  • cookie鉴权:限制请求的来源

  • ticket/token鉴权:http服务提供接口,用于获取临时的身份凭证,并传递到webSocket初始化流程中