• web漏洞之CSRF


    一、概述

      跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法

    1.1CSRF和XSS的区别

      跨站请求伪造(CSRF)和跨站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任,CSRF属于逻辑漏洞。

    二、攻击原理

      跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个用户自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

      举个例子:如果一个人正在访问过自己邮箱,那么此时他接到一个恶意URL,他点击URL就会触发恶意代码,恶意代码可能用它保存在浏览器中的认证信息以他的名义发送邮件。

    三、攻击方法

        方法一:

      如果一个恶意页面包含下面这个html语句,当用户点击这个页面的时候就会触发这个标签跳转到某某银行或者邮件、社交系统进行一些用户不知情的操作。

      <img src="http://bank.example/withdraw?amount=10000&for=hacker" >

        方法二:

      攻击者构造一个具有提交某个转账信息的表单或者修改密码的表单,攻击者将代码隐藏在构造好的页面中,引诱普通用户点击,当普通用户点击后触发页面中隐藏的表单从而进行转账或者改密码。比如下面代码:

    <form action="某个系统修改密码的界面" method=POST>

    <input type="password" name="new_password" value="777777" />

    <input type="submit" name="submit" value="提交" />

    </form>

    <script> document.forms[0].submit(); </script>

       综述:CSRF的攻击方法就是通过各种方法获取用户凭证去进行正常用户所做的操作,不一定非要诱惑用户去点击我们构造的页面可以和xss进行结合(利用xss获取用户凭证),效果更为明显

    四、绕过方式

    1.单点劫持:在同一个功能端点利用点击劫持会绕过所有CSRF防御。因为从技术上讲,请求确实来自合法站点,如果易受攻击的端点所在页面容易遭受点击劫持攻击,那么所有的CSRF保护将变得没有效果,攻击者可以任意执行CSRF攻击

    2.更改请求方法:如果一些网站使用的的get方式传递一些敏感信息(转账、改密)。可以通过修改传递方法说不定可以绕过,如果网站使用post,可以改成get

    3.利用XSS绕过,将csrf要执行的一些功能添加到xss的payload里面

    4.绕过Referer验证:删除Referer或者在Referer中添加要攻击站点的一二级域名,比如要去QQ邮箱发邮件,可以在攻击语句中添加qq的一二级域名。

    5.绕过token验证:是可以删除token进行尝试

    6.通过jsonp(可以自行百度jsonp劫持)绕过token达到csrf工具效果

    五、防御方式

    5.1服务端防御

    1.验证HTTP Referer字段,HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求必须来自于同一个网站,如果被害者从攻击者构造好的页面跳转过来,那么referer来源就不是受限页面的内部网址

    2.在用户端添加token并验证,因为token并不在session中,所以可以在HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

    3.在HTTP头中自定义属性并去验证,这里也是使用 token 并进行验证,但是和前面的token验证不同的是,这是是将token加入HTTP头部属性中,并不是加入到HTTP请求中。通过XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

    4.尽量少用request()类,获取指定参数可以使用equest.form()和request. querystring ()。

    5.2其他防御

    1.退出浏览器时及时清除浏览器的cooking等信息

    2.用户尽量在进行敏感操作时不要点击陌生或者敏感网站以外的页面链接

    六、危害

      一切正常用户可以进行的操作,攻击者通过此方式都可以去执行,包括但不仅限于:以你名义发送邮件,发消息,盗取账号,修改密码,购买商品,进行转账等财产交易等,同时也会泄露个人隐私

  • 相关阅读:
    《C#多线程编程实战》2.7 CountDownEvent
    《C#多线程编程实战》2.6 ManualResetEventSlim
    《C#多线程编程实战》2.5 AutoResetEvent
    《C#多线程编程实战》2.4 SemaphoreSlim
    ConcurrentDictionary与Dictionary 替换
    vs2017 代码格式化 文档排版 编辑 设置文档的格式
    面试笔记
    way.js
    SQL Server 2008 技巧快捷键
    CentOS下Docker与.netcore(四)之 三剑客之一Docker-machine+jenkins简单自动化部署
  • 原文地址:https://www.cnblogs.com/bin1121/p/12464266.html
Copyright © 2020-2023  润新知