zoukankan      html  css  js  c++  java
  • CSRF攻击示例

    示例1

    银行网站A,它以GET请求来完成银行转账的操作,如:

    http://www.mybank.com/Transfer.php?toBankId=11&money=1000
    

    危险网站B,它里面有一段HTML的代码如下:

    <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
    

    首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块......

    为什么会这样呢?原因是银行网站A违反了HTTP规范,使用GET请求更新资源。
    在访问危险网站B的之前,你已经登录了银行网站A,而B中 的<img>以GET的方式请求第三方资源(这里的第三方就是指银行网站了,
    原本这是一个合法的请求,但这里被不法分子利用了),所以你的浏 览器会带上你的银行网站A的Cookie发出Get请求,
    去获取资源“http://www.mybank.com /Transfer.php?toBankId=11&money=1000”,
    结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账 操作),所以就立刻进行转账操作......
    

    示例2

    为了杜绝上面的问题,银行决定改用POST请求完成转账操作。

    银行网站A的WEB表单如下:

    <form action="Transfer.php" method="POST">  
          <p>ToBankId: <input type="text" name="toBankId" /></p>
          <p>Money: <input type="text" name="money" /></p> 
          <p><input type="submit" value="Transfer" /></p>    
    </form>  
    

    后台处理页面Transfer.php如下:

    <?php
        session_start();
        if (isset($_REQUEST['toBankId'] && isset($_REQUEST['money']))
        {
            buy_stocks($_REQUEST['toBankId'], $_REQUEST['money']);
        }
    ?>
    

    危险网站B,仍然只是包含那句HTML代码:

    <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
    
    和示例1中的操作一样,你首先登录了银行网站A,然后访问危险网站B,结果.....和示例1一样,你再次没了1000块~T_T,
    这次事故的 原因是:银行后台使用了_REQUEST既可以获取GET请求的数据,也可以获取POST请求的数据,
    这就造成 了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。
    在PHP中,可以使用_POST分别获取GET请求和POST 请求的数据。在JAVA中,用于获取请求数据request一样存在不能区分GET请求数据和POST数据的问题。
    

    示例3

    经过前面2个惨痛的教训,银行决定把获取请求数据的方法也改了,改用$_POST,只获取POST请求的数据,后台处理页面Transfer.php代码如下:

    <?php
        session_start();
        if (isset($_POST['toBankId'] && isset($_POST['money']))
        {
            buy_stocks($_POST['toBankId'], $_POST['money']);
        }
    ?>  
    

    然而,危险网站B与时俱进,它改了一下代码:

    <html>    
      <head>      
        <script type="text/javascript">        
        function steal()
          {
                   iframe = document.frames["steal"];
                   iframe.document.Submit("transfer");
          }     
        </script>    
      </head> 
      <body onload="steal()">      
        <iframe name="steal" display="none">        
          <form method="POST" name="transfer" action="http://www.myBank.com/Transfer.php"> 
            <input type="hidden" name="toBankId" value="11"> 
            <input type="hidden" name="money" value="1000"> 
          </form>      
        </iframe>    
      </body>  
    </html>  
    

    如果用户仍是继续上面的操作,很不幸,结果将会是再次不见1000块......因为这里危险网站B暗地里发送了POST请求到银行!

    总结一下上面3个例子,CSRF主要的攻击模式基本上是以上的3种,其中以第1,2种最为严重,因为触发条件很简单,一 个<img>就可以了,
    而第3种比较麻烦,需要使用JavaScript,所以使用的机会会比前面的少很多,但无论是哪种情况,只要触发了 CSRF攻击,后果都有可能很严重。
    
    理解上面的3种攻击模式,其实可以看出,CSRF攻击是源于WEB的隐式身份验证机制!
    WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的
    
  • 相关阅读:
    最近发现一个网站
    2017-0206 委托封装的方法的参数类型
    迈向Angular 2
    趣学CCNA 路由与交换
    HCNA 2017年01月26日
    在linux中使用phpize安装php扩展模块
    接口和抽象类
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V110Microsoft.CppCommon.targets(611,5): error MSB
    抽象类和抽象方法
    java数组与内存控制
  • 原文地址:https://www.cnblogs.com/linkenpark/p/13697100.html
Copyright © 2011-2022 走看看