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的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的
    
  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/linkenpark/p/13697100.html
Copyright © 2011-2022 走看看