XSS 和 CSRF

XSS

跨站脚本攻击,是一种代码注入攻击,通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户信息比如 cookie 等

攻击者可以通过这种攻击方式可以进行一些操作,比如

  • 获取页面的数据:如 DOM、cookie、localStorage
  • DOS 攻击,发送合理请求,占用服务器资源,从而使用户无法访问服务器
  • 破坏页面结构
  • 流量劫持(将链接指向某网站)

    存储型

    存储型指的是恶意脚本会存储在目标服务器上,当浏览器请求数据时,脚本从服务器传回并执行。
  1. 首先攻击者利用网站的漏洞将一段恶意的代码提交到网站的数据库中
  2. ⽤户打开⽬标⽹站时,⽹站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
  3. ⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏
  4. 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。

这种攻击常⻅于带有⽤户保存数据的⽹站功能,如论坛发帖、商品评论、⽤户私信等。

反射型

反射型指的是攻击者诱导用户访问一个带有恶意代码的 URL 后,服务器端接收数据后处理,然后把带有恶意代码的数据发送到浏览器端,浏览器端解析这段带有 XSS 代码的数据后当做脚本执行,最终完成 XSS 攻击

  1. 攻击者构造出特殊的 URL,其中包含恶意代码
  2. ⽤户打开带有恶意代码的 URL 时,⽹站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  3. ⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏。
  4. 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库⾥,反射型 XSS 的恶意代码存在 URL ⾥。
反射型 XSS 漏洞常⻅于通过 URL 传递参数的功能,如⽹站搜索、跳转等。 由于需要⽤户主动打开恶意的 URL 才能⽣效,攻击者往往会结合多种⼿段诱导⽤户点击。

DOM 型

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. ⽤户打开带有恶意代码的 URL。
  3. ⽤户浏览器接收到响应后解析执⾏,前端 JavaScript 取出 URL 中的恶意代码并执⾏。
  4. 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执⾏恶意代码由浏览器端完成,属于前端 JavaScript ⾃身的安全漏洞,⽽其他两种 XSS 都属于服务端的安全漏洞。

预防

  1. 服务器对输入脚本进行 过滤转码
  2. 充分利用 CSP (内容安全策略),CSP 的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行,从而防止恶意代码的注入攻击。开启 CSP 的方式:配置 HTTP 头部:Content-Security-Policy,或者设置 meta 标签:<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
  3. 使用 httponly 属性,禁止脚本获取 cookie

    CSRF

    跨站请求伪造攻击 CSRF 就是利用用户的登录态发起恶意请求

CSRF 攻击的本质是利用 cookie 会在同源请求中携带发送给服务器的特点,以此来实现用户的冒充

GET 类型

比如在网站中的一个 img 标签里构建一个请求,当用户打开这个网站的时候就会自动发起提交

Post 类型

比如构建一个表单,然后隐藏它,当用户进入页面时,自动提交这个表单。

链接类型

比如在 a 标签的 href 属性里构建一个请求,然后诱导用户去点击
和 XSS 不同的是,不需要将恶意代码注入用户的页面,仅仅利用服务器的漏洞和用户的登录状态来实施

预防

  1. 进行同源检测: 验证请求的来源站点 Refer/Origin 判断请求是否为第三方网站发起
  2. 使用 CSRF Token 进行验证: 服务器向用户返回一个随机数 Token ,当网站再次发起请求时,在请求参数中加入服务器端返回的 token ,然后服务器对这个 token 进行验证
  3. 利用 Cookie 的 SameSite 属性

中间人攻击

Man-in-the-middle attack
指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容
过程:

  1. 客户端向服务端索取公钥
  2. 如果服务端将公钥发送给客户端,并且此时攻击者可以拦截到这个公钥,就可以实施中间人攻击
  3. 攻击者发送一个伪造的消息给客户端,声称自己是服务端,并且附上了自己的公钥
  4. 客户端收到公钥后,以为是服务端的,于是用这个公钥加密消息并发送给服务端
  5. 攻击者再次拦截到消息,并且用自己的私钥进行解密,他甚至可以对消息进行修改,然后攻击者使用服务端的公钥对消息再次加密
  6. 当服务端收到消息后,他会相信这是客户端发送过来的消息

    网络劫持

    DNS 劫持

    又被称为域名劫持,DNS 重定向,即 DNS 查询没有得到正确的解析,导致引导 user 访问到恶意的网站,从而窃取用户隐私,或者进行某些恶意的操作
    DNS 劫持现象:你输入一个 google.com 网址,出来的是百度的页面
    方法:

  7. 本机 DNS 劫持:攻击者通过某些手段使用户的计算机感染上木马病毒,或者恶意软件之后,恶意修改本地 DNS 配置,比如修改本地 hosts 文件,缓存等

  8. 路由 DNS 劫持:攻击者可以侵入到路由管理员账号中,修改路由器的默认配置
  9. 攻击 DNS 服务器:直接攻击 DNS 服务器,例如对 DNS 服务器进行 DDOS 攻击,可以是 DNS 服务器宕机,出现异常请求,还可以利用某些手段感染 dns 服务器的缓存,使给用户返回来的是恶意的 ip 地址

    HTTP 劫持

    HTTP 劫持现象:访问着 github 的页面,右下角出现了一个格格不入的广告弹窗
    由于 http 明⽂传输,所以可以修改你的 http 响应内容,添加小广告
    解决:使用 HTTPS