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

156 阅读6分钟

网站的常见安全漏洞

网站的基本组成

2023-08-24-20-51-19-image.png

  • 前端:JavaScript / vue / react
  • 网关:nglnx
  • 后端:Go / Java / Node
  • 前后端交互:HTTP / WebSocket

对网站的工具就分为了针对客户端的漏洞攻击针对服务器端(后端)漏洞的攻击


漏洞分类

  • 服务端漏洞

    • SQL
    • RCE / 命令注入
    • SSRF 服务器端请求伪造
    • 文件上传
    • ······
  • 客户端漏洞

    • XSS 跨站脚本攻击
    • CSRF 跨站请求伪造
    • 点击劫持
    • ······

服务端漏洞

第三方组件漏洞

一些第三方组件可能有“病毒”潜伏,服务器一旦执行就可能造成安全问题

防护方式:

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

SQL 注入

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

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

  • Golang 的常见错误写法db.Order(parent).Find(&products)

    当攻击者输入SQL 语句时,则会改变原意,例如

    if(1, sleep(10), 'code'

防护方式:

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

命令注入

有时代码中需要调用某个命令才能完成功能,涉及到命令拼接,类似于SQL 注入,具有很大的风险

防护方式:

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

越权漏洞

身份认证是很重要的一个话题,越权漏洞则是在资源访问或操作时候没有进行主体校验,使得某些主体获得了超出预设的访问范围和权力。

例如未登录就访问数据(未越权),账号 A 可以访问账号 B (同等级)的内容(水平越权),或者普通账号获得了管理员的权限(垂直越权

SSRF

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

防护方式:

对url的host进行白名单过滤,对host解析的ip进行判定是否为内网地址

文件上传漏洞

在公开的上传节点上传图片时,修改图片文件内容,使得服务器在接收到图片后,执行其中的恶意指令,造成数据泄露等后果

防护方案:

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

客户端漏洞

开放重定向

网站中需要重定向到其他站点时,如果没有处理好重定向的范围,可能导致攻击者构造恶意链接,诱导用户前往其他恶意站点

防护方案:

对重定向进行严格的白名单控制,并进行正确校验

XSS

即跨站脚本攻击,本质是一种 Script 代码注入,攻击者在目标网页插入恶意代码后,当用户访问页面时,其中的 Script 代码开始执行,从而开展恶意攻击。

通常会造成包括窃取用户的敏感信息,以用户身份执行敏感操作。

防护方法:

  1. 输入过滤

    过滤前端的特殊字符

  2. 输出过滤

    1. 输出字符到 Dom 时,对危险字符进行HTML encode,从而避免XSS
    2. 使用vue/react 等框架的时候,避免使用危险指令
  3. 富文本场景

    需要富文本功能的场景,例如文章发布,需要严格限制 tag 和 attribute,可以在代码层面制作白名单

    <tag attribute1='value1' attribute2='value2'/>

  4. CSP 内容安全策略:

    限制当前站点允许加载哪些源的资源

CSRF

跨站请求伪造,即攻击者引导用户访问恶意链接,执行用户非预期操作

危害: 用户执行敏感操作,如关注其他用户,修改安全邮箱等

漏洞利用步骤:

  1. 将更改 Email 的请求生成CSRF表单,并构造钓鱼链接
  2. 发送链接给用户
  3. 用户点击链接后成功执行 Email 更改操作

防护方式:

核心时判断请求的来源

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

点击劫持

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

漏洞利用步骤:

  1. 构造一个钓鱼网站,表面是一个透明的目标站点,其实下面隐藏着钓鱼链接

2023-08-26-19-50-16-image.png

  1. 发送链接

  2. 用户访问链接,点击「 Win 300 $」时候,实际是点击「 Delete Account 」

防护方式:

核心是不让非预期的网站 iframe 我的站点

  1. X-Frame-Options : DENY / SAMEORIGIN
  2. CSP: frame-ancestors 指令,用于设置允许 frame 的 source 列表。

CORS

跨域资源共享,用于解决网页应用跨域访问的请求。跨域配置错误即开发者在配置CORS时,错误配置跨域访问AllowList,使得非预期站点跨域进行跨域访问,最终造成信息泄露

防护方式:

核心是正确设置跨域白名单

  1. 代码层:中间件统一处理
  2. 网关层:Nginx 反代统一拦截

WebSocket

本质上 http 服务端的漏洞,在 WebSocket 上也可能存在

  1. WSS 和 WS : WSS (WebSockets over SSL/TLS) ,提供加密信道。杜绝掉一些中间人攻击。
  2. 数据校验: SQL/XSS/RCE 等漏洞仍然可能存在
  3. CSWSH : Cross-Site WebSocket Hijacking, 即在使用 cookie 作为认证方式时候,如果 WebSocket 服务端没有校验好请求来源 ,将导致 WebSocket 会话劫持

CSWSH 防护手段:

  1. cookie 鉴权:限制请求的 Origin
  2. ticket/token 鉴权: http 服务提供接口,用于获取临时的身份凭证,并传递到 WebSocket 的初始化流程中

总结

网站运营者应采取技术措施和其他必要措施,确保其收集的个人信息安全,防止信息泄露、毁损、丢失