安全

5
open
sqshada
sqshada
Posted 4 months ago

安全 #18

CSRF

概念

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证(cookies 等),绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

< 攻击者获取受害者在网站中的登录凭证,然后发送请求攻击网站,冒充受害者,执行自定义操作。

攻击类型

  • get: 发送 get 请求
  • post: 一般都是自动提交的表单,模拟用户发送 post 请求
  • 链接:需要用户点击才能触发,并不常见

CSRF 特性

  • 攻击一般发起在第三方网站
  • 利用受害者在网站的登录凭证进行操作,而不是直接窃取数据
  • 整个过程只能冒用受害者的凭证,不能获取
  • 跨站请求可以用各种方式:图片 URL、超链接、CORS、Form 提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。

预防措施

  • 同源检测。 request headers 里 origin 和 referer 两个字段确定请求的来源域;如果攻击者设置 Referrer Policy 隐藏了 referer,则建议直接阻止。
  • Token。服务器通过校验请求是否携带正确的 Token,来把正常的请求和攻击的请求区分开,也可以防范 CSRF 的攻击
  • 验证码&密码。在关键请求时要求输入验证码密码,打断 csrf 进程
  • 双重 Cookie 验证。利用 CSRF 攻击不能获取到用户 Cookie 的特点,我们可以要求 Ajax 和表单请求携带一个 Cookie 中的值。后端接口验证 Cookie 中的字段与 URL 参数中的字段是否一致,不一致则拒绝。
  • Samesite 属性。限制第三方 Cookie,但目前兼容性不好。
sqshada
sqshada
Created 4 months ago

XSS

概念

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行,获取用户信息,危害数据安全。

XSS 分类

类型 存储区 插入点
存储型 XSS 后端数据库 HTML
反射型 XSS URL HTML
DOM 型 XSS 后端数据库/前端存储/URL 前端 JavaScript

存储型 XSS

  • 攻击者将恶意代码提交到目标网站数据库中
  • 用户打开时,服务端将代码拼接在 HTML 中返回给浏览器
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS

  • 攻击者构造特殊的 URL
  • 用户打开恶意代码的 URL,服务端拼接在 HTML 中返回给浏览器
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS

  • 攻击者构造特殊的 URL
  • 用户打开恶意代码的 URL,浏览器解析 URL 中的恶意代码并执行
  • 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

XSS 防御

针对攻击者提交恶意代码

  • 输入过滤
  • 输入内容长度控制,虽然无法完全防止,但是可以增加难度
  • 验证码,防止脚本冒充用户进行危险操作

针对浏览器执行恶意代码

  • 纯前端渲染
  • 转义 html
  • 预防 DOM 型 XSS 攻击
  • HttpOnly & Secure: cookie 中设置了 HttpOnly 属性、cookie 中设置了 Secure 属性,规定 cookie 只能在 https 协议下才能够发送到服务器。
sqshada
sqshada
Created 4 months ago

iframe 嵌套

点击劫持 (ClickJacking) 一般会利用透明 iframe 覆盖原网页诱导用户进行某些操作达成目的。

防止其他页面通过 iframe 引用

if (top.location != self.location) {
  top.location.href = 'http://www.baidu.com'; //若被其他网站引用则强制跳转
}

X-FRAME-OPTIONS

HTTP 相应头 X-FRAME-OPTIONS,只是浏览器是否应该加载 iframe 页面。

防止引用的其他 iframe 篡改自己的页面

添加 sandbox 属性, sandbox 属性的值可以是一个空字符串(应用所有的限制),防止操作脚本,执行表单、读写 Cookie

sqshada
sqshada
Created 4 months ago

CDN 劫持

CDN(Content Delivery Networks),如果攻击者劫持了 CDN,或者对 CDN 中的资源进行了污染,攻击者可以肆意篡改我们的前端页面,对用户实施攻击。

SRI

子资源完整性(SRI)是允许浏览器检查其获得的资源是否被篡改的一项安全特性。它通过验证获取文件的哈希值是否和你提供的哈希值一样来判断资源是否被篡改。(当浏览器在 script 或者 link 标签中遇到 integrity 属性之后,会在执行脚本或者应用样式表之前对比所加载文件的哈希值和期望的哈希值。)

<script type="text/javascript" src="/xxxx/aaa.js" integrity="sha256-xxx sha384-yyy" crossorigin="anonymous"></script>

联合 CSP

Content-Security-Policy: require-sri-for script;

这条指令规定了所有 JavaScript 都要有 integrity 属性,且通过验证才能被加载。

sqshada
sqshada
Created 4 months ago

中间人攻击

由于在建立起 HTTPS 连接之前存在一次明文的 HTTP 请求和重定向,使得攻击者可以以中间人的方式劫持这次请求,从而进行后续的攻击,例如窃听数据,篡改请求和响应,跳转到钓鱼网站等。

HSTS

HSTS 的全称是 HTTP Strict-Transport-Security(严格传输安全),它是一个 Web 安全策略机制,通过服务器设置 HTTP Response Header 告诉浏览器只能通过 HTTPS 访问当前资源,而不是 HTTP。

cookie secure

通过 cookie secure 保证你的 session cookie 对于攻击者是不可见的,避免中间人攻击。

sqshada
sqshada
Created 4 months ago

点击劫持

将一个危险网站设置透明,然后在其上方设置一个按钮,当你点击这个按钮的时候,就会触发底部恶意网站的某些事件。

设置 http 响应头 X-Frame-Options

给浏览器指示一个页面可否在, <iframe>或者 中展现的标记。

使用 CSP(Content Security Policy) 内容安全策略