Echo战队培训番外——CSRF伪造银行转账请求漏洞复现
“欺骗的最高境界,就是不说任何一句假话” 昨天和实验室的朋友在聊天时提到了一些典型的漏洞案例,我用白话向他们介绍了一些攻击手段,不乏ARP欺骗、metaploit病毒制作、常规抓包等,其中“访问一些不该访问的页面就能把你银行卡里的钱转走”好像让他们比较提起兴趣,正好之前给Echo培训的时候也演示过,反映还不错。下面我尽量用所有0基础者都能听懂的话,再复现一遍整个过程 下面来介绍一下实验环境 环境 受害者:windows 7,chrome浏览器 攻击者:windows 11(黄色网站运营者) 银行:windows 7,Mysql 5.7数据库 背景 有三个银行账户,账户ID、密码、原始金额如下 实验开始 (实验确保严格按照下面步骤进行,无多余操作) 某天康康想给杰瑞转1000块钱,于是就正常地打开了银行的网站并登录,看到了自己账户的余额和转账的界面 出于平时“网上冲浪”的经验,对于1000块的巨款,康康谨慎地打开了所有杀毒软件,在确保了“全盘扫描”全部正常并绿灯通行后,才输入了杰瑞银行账号并进行了转账 杰瑞此时也收到了这1000块钱,这一切似乎都很安全并且正常,至少目前为止是这样的 转完帐后闲来无事的康康,打算看点网站来保障青少年的身心健康,于是他“安全退出”了银行账户后,便进入了下面这个网站 激动的康康决定马上接受美女荷官的邀请,于是他便点进了链接 在经过一番荷官的心理辅导后,康康看了一眼自己的手机,发现手机短信似乎多了一条来自银行的短信。嗯?1000块转账?怎么转给杰瑞的钱到现在才提醒 不信邪的康康决定打开账户一探究竟,但让他不解的是,为什么银行卡里的钱又少了1000? 不行,一定是我眼花了,嗯,一定是辅导还不到位,再看一遍就好了 机智的康康再次刷新了荷官的页面 又过了一段时间,康康再次返回银行账户界面,7000??wtf?? 康康急忙打电话给杰瑞,发现杰瑞的账户里只收到了最开始的1000块 这期间究竟发生了什么呢?让我们切换一下视角,从银行的数据库这个“上帝视角”来一探究竟 你一定已经发现了康康的2000去了哪,但是这期间究竟发生了什么呢? 原理分析 我们先来看一下CSRF漏洞的wiki定义 其实简单来说就是以利用受害者本身被银行信任的设备请发起正常的转账请求,但显然CSRF漏洞的应用远不止这一种 我们先来看一下正常银行转账页面发起转账请求的代码 <?php include("config.php"); if(isset($_COOKIE["userid1"]) && isset($_COOKIE["pass1"])) { $TOID=$_GET['nameid']; $TOMONEY= $_GET['balance']; include("conn/conn.php"); $sql=$db->query("select * from account where userid='".$TOID."'"); $sqlres = $sql->fetch(); if($sqlres['userid'] != $TOID) { echo "<script language=\"javascript\">"; echo "alert('用户名或密码错误!')"; echo "return(true)"; echo "location.href=\"default.php\""; echo "</script>"; } $balance_new = $TOMONEY + $sqlres['balance']; $sql=$db->exec("update account set balance='".$balance_new."' where userid='".$TOID."'"); $sql=$db->query("select * from account where userid='".$_COOKIE['userid1']."'"); $sqlres = $sql->fetch(); $balance_new = $sqlres['balance']- $TOMONEY; $sql=$db->exec("update account set balance='".$balance_new."' where userid='".$_COOKIE['userid1']."'"); echo "<script language=\"javascript\">"; echo "location.href=\"default.php\""; echo "</script>"; } ?> 可以看到整个过程其实很好理解,就是调用银行本身数据库进行数据增减 接下来我们再看看荷官页面的代码,相信你就知道问题出在哪里了 ...