“欺骗的最高境界,就是不说任何一句假话”
昨天和实验室的朋友在聊天时提到了一些典型的漏洞案例,我用白话向他们介绍了一些攻击手段,不乏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>";
}
?>
可以看到整个过程其实很好理解,就是调用银行本身数据库进行数据增减 接下来我们再看看荷官页面的代码,相信你就知道问题出在哪里了
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<h1><font color="#F9971C">You are visiting Porn</font></h1>
<img src="yellow.jpg">
<img src="http://localhost/bank/transfer.php?nameid=1100&balance=1000" width="0" height="0">
<body align="center">
</body>
</html>
主要问题就出在这段代码
<img src="http://localhost/bank/transfer.php?nameid=1100&balance=1000" width="0" height="0">
是不是看着很眼熟?没错,正是他利用了康康的浏览器,去直接使用了银行的转账代码。 是不是很简单?确实,可见黑客要想从你的账户里转走你的钱,是多么轻而易举的事情
防护
对于银行:实验中使用的只是一个十分简单的虚拟银行,但对现实中的银行来说,防护等级肯定要比这要高得多。但再怎么维护也一定不可能存在绝对安全的系统,被发现只是时间和精力的问题。而要做到防御上面演示中的攻击,其实还是很简单的。近年来,一些验证码的介入正是为了防御CSRF漏洞
对于个人:“身正不怕影子斜”,不看乱七八糟的网站绝对是最好的防御手段,同时,不要过度相信所谓“杀毒软件”,提高自己的判断能力,也是十分必要的