xss与csrf攻击


xss 与 csrf 攻击
xss
概念
XSS 全称是 Cross Site Scripting(即跨站脚本),为了和 CSS 区分,故叫它XSS。XSS 攻击是指浏览器中执行恶意脚

本(无论是跨域还是同域),从而拿到用户的信息并进行操作。
类型
XSS 攻击的方式一般有三种: 存储型、反射型和文档型。

存储型: 
   
   一般是将代码存储到数据库,服务器将这些数据取出返回给客户端,
   
   客户端执行这些恶意代码,
   
   从而达到攻击的效果。
   
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。


反射型:

    指一般恶意脚本作为网络请求的一部分。
    // 不注释这行代码,即便是md软件,即便选择了tex,都会执行,都会alert!!
    // 如: http://sanyuan.com?q=<script>alert("你完蛋了")</script>
    
    服务器拿到q参数,然后将内容返给浏览器端,
    
    浏览器将这些内容作为html的一部分解析,
    
    发现是一段脚本,直接执行,然后就被攻击了
    
之所以叫它反射型, 是因为恶意脚本是通过作为网络请求的参数,经过服务器,然后再反射到HTML文档中,执行解析。

和存储型不一样的是,服务器并不会存储这些恶意脚本。
文档型
文档型的 XSS 攻击并不会经过服务端,而是作为中间人的角色,在数据传输过程劫持到网络数据包,然后修改里面的 html 文档!

这样的劫持方式包括WIFI路由器劫持或者本地恶意软件等。
防范措施
我们可以发现,三种XSS攻击都是让恶意脚本在浏览器中执行。

措施:

    1.不相信用户的输入
       
       无论是前端还是后端,都对用户输入的内容进行转码和过滤
       
       如:

          <script>alert('你完蛋了')</script>

          转码后变为:

          &lt;script&gt;alert(&#39;你完蛋了&#39;)&lt;/script&gt;
        
        这样的代码在 html 解析的过程中是无法执行的。

        当然也可以利用关键词过滤的方式,将 script 标签给删除。那么现在输入的就没有内容了。
 
       2. 利用 CSP
        CSP,即浏览器中的内容安全策略,它的核心思想就是服务器决定浏览器加载哪些资源,
        
        具体来说可以完成以下功能:

            1)限制其他域下的资源加载。
            2)禁止向其它域提交数据。
            3)提供上报机制,能帮助我们及时发现 XSS 攻击。
            
        3. 利用 HttpOnly
        
            很多 XSS 攻击脚本都是用来窃取Cookie, 

            而设置 Cookie 的 HttpOnly 属性后,JavaScript 便无法读取 Cookie 的值。

            这样也能很好的防范 XSS 攻击。

csrf 攻击

CSRF(Cross-site request forgery), 即跨站请求伪造,指的是黑客诱导用户点击链接,打开黑客的网站,然后黑客利

用用户目前的登录状态发起跨站请求。


举个例子, 你在某个论坛点击了黑客精心挑选的小姐姐图片,你点击后,进入了一个新的页面。

那么恭喜你,被攻击了:1. 自动发起get请求

   加入黑客网站里有这样一段代码:
   
   <img src="https://xxx.com/info?user=hhh&count=100">
     
   进入页面后自动发送get请求, 这里请求会带上你 xxx.com 的cookie 信息,如果你登陆过的话。
   
   如果服务端没有相应的验证机制,就会认为这是一个正常用户的请求,
   
   因为携带了相应的cookie,就可能进行转账汇款或者其他恶意操作。
   
2. 黑客可能自己写了一个表单,一个自动提交的表单。

   同样会携带用户的cookie ,让服务器认为是一个正常用户的操作,让其他恶意操作成为可能。
   
3. 诱导点击触发get请求

   黑客的网站上可能会放一个诱导链接来让你点击,
   
   <a href="https://xxx/info?user=hhh&count=100" taget="_blank">点击进入修仙世界</a>

    点击后发送get请求,接下来和上面 ***自动发 GET 请求*** 同理。
防御措施
csrf 攻击中的重要一环就是发送目标站点下的cookie, 然后就是这一份cookie 模拟了用户身份,

因此在cookie上下文章是不二之选!


1. 利用Cookie的SameSite属性
  
   SameSite可以设置为三个值,Strict、Lax和None。
   
   a. Strict 模式下,浏览器完全禁止第三方请求携带cookie, 
     
     比如请求 karlfranz.cn 网站只能在 karlfranz.cn域名请求中携带cookie,
       
     其他网站请求都不能。
    
   b. Lax 模式下相对宽松一点,但只能 在get方法请求表单 或 a 发送get请求下可以 携带cookie,
     
     其他情况均不能。
   
   c. 在none模式下, 也就是默认模式,请求会自动携带cookie 。
  
2. 验证来源站点

   这就需要用到请求头中的两个字段 Origin 和 Referer,
     
   其中Origin 只包含域名信息, 而Referer 包含了具体的url路径。
   
   不过这两者都可以伪造,通过Ajax 的自定义请求就可以伪造,安全性略差。

3. CSRF Token

   Django 是一门后端框架,在它的表单 (template 中)开发表单时,
   
   经常会附上这一段代码:
   
    {% csrf_token %}

    这就是 csrf token的典型应用,
    
    它的原理是浏览器向服务器发送请求时,服务器生成一个字符串,将其植入返回的页面中,
    
    然后浏览器发送和请求时,就必须带上这个字符串,来让服务器验证是否合法,
    
    如果不合法,就不予以相应。
    
    这个字符串就是 csrf token ,
      
    通常第三方站点无法拿到这个token, 因此发出的请求也就被服务器拒绝。
     
参考资料
https://juejin.cn/post/6844904021308735502?utm_source=gold_browser_extension#heading-64 

文章作者: KarlFranz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 reprint policy. If reproduced, please indicate source KarlFranz !
评论
  目录