XSS和CSRF两种攻击方式

什么是xss攻击

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

xss攻击的本质是将数据注入到静态代码中(如html和js等),当浏览器渲染html时就会触发注入的脚本引发xss攻击。

xss攻击产生的原因是对用户的输入过滤不严格,在能够同用户实现交互的地方更容易发现xss漏洞。

如何注入xss攻击

  • 在HTML内嵌的文本中,恶意内容以script标签形成注入
  • 在内联的JavaScript中,拼接的数据突破了原本的限制(字符串,变量,方法名)等
  • 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签
  • 在标签的 href、src 等属性中,包含 javascript: (伪协议)等可执行代码
  • 在 onload、onerror、onclick 等事件中,注入不受控制代码
    总之,任何可以输入的地方都可能引起xss攻击

xss攻击的分类

根据攻击来源xss攻击可以分为三类

反射性xss

什么是反射性xss

反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。这里插入的恶意代码并没有保存在目标网站,需要引诱用户点击一个链接到目标网站的恶意链接来实施攻击。

反射性xss攻击的步骤
  • 攻击者构造特殊的URL(包含了恶意代码)
  • 用户打开带有恶意代码的URL之后,服务端将恶意代码取出来,拼接在html中返回给浏览器
  • 用户浏览器收到响应后解析执行,恶意代码也被执行
  • 恶意代码窃取用户的信息发到攻击者网站或者冒充用户做攻击者的目标行为

存储性xss

什么是存储性xss攻击

存储型xss是一种持久性攻击,存储型xss就是攻击者的恶意代码会保存到服务器中,比如留言板评论区这种公共区域,当其他用户访问存储有恶意代码的页面时就会触发恶意代码。存储型和反射性xss的区别在于,反射性xss需要用户点击恶意链接才能执行代码,而存储型xss是不需要访问合法网站以外的任何链接的。

存储性xss攻击的步骤
  • 攻击者将恶意代码提交到目标网站的数据库
  • 用户打开目标网站,服务端将恶意代码从数据库中取出拼接在html中返回给浏览器
  • 用户浏览器收到响应后解析执行,恶意代码也被执行
  • 恶意代码窃取用户的信息发到攻击者网站或者冒充用户做攻击者的目标行为

DOM型xss

什么是DOM型攻击

务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型

DOM型攻击的步骤
  • 攻击者构造出特殊的 URL,其中包含恶意代码。
  • 用户打开含有恶意代码的目标网站
  • 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行
  • 恶意代码窃取用户的信息发到攻击者网站或者冒充用户做攻击者的目标行为

DOM型xss攻击和反射性xss攻击、存储性攻击的区别是:DOM型xss攻击属于前端自身的安全漏洞,其他两种属于是服务端安全漏洞。

三种xss攻击的简单对比

类型 存储区 插入点 安全漏洞类型
反射型 URL HTML 后端漏洞
存储性 后端数据库 HTML 后端漏洞
DOM型 后端数据库;前端存储;URL JavaScript 前端漏洞

如何防御xss攻击

  • httpOnly:在cookie中设置HttpOnly属性后,js脚本将无法读取到cookie信息
  • 使用 XSS Filter:针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容
  • 转义HTML:如果拼接 HTML 是必要的,就需要对于引号,尖括号,斜杠进行转义,并且对 HTML 模板各处插入点进行充分的转义,就需要采用合适的转义库

什么是CSRF攻击

Cross-site request forgery(跨站请求伪造),是一种挟持用户在当前已登陆的Web应用程序上执行非本意的操作的攻击方法。如:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

CSRF攻击的原理

  • 用户打开浏览器,访问安全网站A,输入用户名和密码请求登录网站A
  • 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录A成功,可以正常发送请求到网站A。
  • 用户没有退出A之前,在同一个浏览器中,打开一个Tab页面来访问网站B
  • 网站B接收到用户的请求后,返回一些攻击代码,并且发出一个请求要求访问第三方站点A
  • 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发出的,所以会根据用户C的cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

具体流程看下图:
在这里插入图片描述

CSRF的特点

  • 由第三方网站发起攻击
  • 利用被攻击这的登录凭证,冒充被攻击者,不会直接盗取数据
  • 攻击者仅仅是冒用被攻击者的登录凭证
  • 跨站请求可以通过form表单,cors,URL等,也可以直接嵌入第三方论坛,很难追踪

如何防御CSRF攻击

  • 验证 HTTP Referer 字段:根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站。这种方法简单易实行,但是也有漏洞,因为referer会记录用户的访问来源,很多用户认为会泄露隐私,很多企业也怕内网信息泄露到外网。
  • 在请求地址中添加 token 并验证:CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
  • 在 HTTP 头中自定义属性并验证:这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

xss和CSRF的区别

  • CSRF由xss实现的
  • CSRF是http问题,xss是代码注入问题

猜你喜欢

转载自blog.csdn.net/weixin_43183219/article/details/124719807