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

152 阅读4分钟

1 什么是漏洞

image.png

2 服务端漏洞

2.1 第三方组件漏洞

防护方式:

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

2.2 SQL 注入

防护方式:

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

2.3 命令执行

防护方式:

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

2.4 越权漏洞——垂直越权

黑灰产场景:

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

防护方式:

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

2.5 SSRF

防护方式:

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

2.6 文件上传漏洞

防护方案:

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

3 客户端漏洞

3.1 开放重定向

开放重定向:

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

危害:

钓鱼攻击。

修复方案:

对重定向严格进行白名单控制并正确校验匹配白名单。

3.2 XSS

防护方法:

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

  2. 输出过滤:

    • 当字符输出到 Dom 时候,对危险字符进行 html encode,避免 XSS
    • 使用 vue/react 等框架时候,避免使用危险指令,而应该使用安全指令。v-html/v-text
  3. 富文本场景: 比如文章发布场景,本身是需要提供富文本功能,这时候需要严格限制 tag 和 attribute,可以在代码层面做白名单或者黑名单。 tag attribute1='value1' attribute2='value2'

  4. CSP: 用于缓解XSS,理念是对当前站点允许加载什么源的资源、发送什么请求能进行限制。 Content-Security-Policy: default-src 'self; img-src *; media-src example.org example.net; script-src userscripts.example.com

3.3 CSRF

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

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

3.4 点击劫持 (clickjacking)

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

  1. X-Frame-Options: DENY / SAMEORIGIN
  2. CSP: frame-ancestors指令,用于设置允许frame的source列表。 Content-Security-Policy: frame-ancestors <space separated list of sources>; Content-Security-Policy: frame-ancestors 'self' https://example.org https://example.comhttps://store.example.com;

3.5 CORS跨域配置错误

防护方式: 核心是正确设置跨域白名单

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

3.6 WebSocket

CSWSH 防护手段

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