读完就带你入门CSRF


前言:不想读完的,可以理解这一句话,“如果你能理解XSS攻击的话,那么你一定认同XSS攻击是利用盗取的高权限cookie来进行的,相较而言CSRF并不干偷盗之事,而是借刀杀人”,这是我自己的感想,不认同的也不强求


CSRF(cross-site request forgery),跨站请求伪造,算了算了,概念性的我就不多说了,都能百度到,下面我直接说重点吧。

CSRF的攻击原理是什么,简单说就是利用了高权限帐号(如管理员)的登录状态或者授权状态去做一些后台操作,但实际这些状态并没有被我们直接获取到(获取那是XSS干的事)。

GET方式演示CSRF攻击

我们这里假设有个网站test.com,包含一个登录页面(login.php)和一个付款页面(pay.php)

login.php:

<?php
    setcookie('uid', 1, time()+86400);
    echo "your uid is {$_COOKIE['uid']}";

pay.php:

<?php
   //身份验证
    if (!isset($_COOKIE['uid']) || $_COOKIE['uid']< 0) {  
        die('login error!');
    }
   //金额获取   
    if (!isset($_GET['money'])) {
        die('no money');
    }   
   //收款人获取
    if (!isset($_GET['to_who'])) {
        die('nobody');
    }   
    $uid = $_COOKIE['uid']; 
    $money = $_GET['money'];
    $to_who = $_GET['to_who'];
   //。。。。。。
   //此处应该还有相关DB操作,略去
    echo "transfer {$money} yuan to {$to_who}!";

打开login.php,模拟登录,可以看到登录成功:

your uid is 1

登录完成后我们打开pay.php进行转账,转1000元给father,GET请求构造:http://test.com/pay.php?money=1000&to_who=father

访问得到转账成功的响应:

transfer 1000 yuan to father!

以上是用户正常操作,这时黑客发现了该网站的CSRF漏洞,于是立刻伪造了一个页面,页面上预置了一个UC震惊部的超链接,超链接指向http://test.com/pay.php?money=1000&to_who=hacker

<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <a href="http://test.com/pay.php?money=1000&to_who=hacker" taget="_blank">震惊!男人看了会沉默,女人看了会流泪!不转不是中国人!<a/>
    </body> 
</html>

如上,收款人被篡改成了黑客,如果我们是中国人,就一定会毫不犹豫的点击链接,因为不转不是中国人!!然后,然后。。。我们就把自己账户的1000元开心的转给了黑客。

为什么会出现这种情况,我们在别的网站点击链接居然能扣自己账户的钱?

点击链接前,我们已经登录了信任网站test.com,而这个这个链接是我们自己发送的,test.com会识别当前已经登录,然后转账,网站无法判断到底是谁让我们点击的。

从上面这个实例可知,完成CSRF攻击流程:

1、用户登录了信任的网站A,并且保存登录状态

2、黑客找出网站A没有防御的链接,通过社会工程学伪装,诱导点击。

3、只要登录状态保持,用户主动访问目标链接,则攻击成功。

有人说那每次访问其他网站,把之前的网站都注销。是的,这个办法可以,但这么做这现实吗?我们需要注销许多常用的网站,下次登录又要输入用户名和密码,极其反人类。这肯定不是最佳办法,防御措施应该让程序员考虑,用户别乱点链接是最重要的。


以上演示了GET方式攻击,有人说那我把method改为POST吧,其实稍微动动脑也知道不行,POST请求我们同样可以伪造,隐藏表单的方式我们见多不怪了,所以仅仅依靠简单的POST传输依旧无济于事。

如此一来,不管哪种访问方式都可能受到攻击。所以,这并不是GET和POST谁更安全的问题,POST只是提高了攻击门槛和成本。

划重点,那么CSRF能够攻击的根本原因是:服务器无法识别你的来源是否可靠


最后,我们聊一聊前辈是如何防御CSRF攻击的:

防御的方法有很多:

1、比如加上验证码。但这么做很繁琐,并且影响用户体验。

2、比如转账需要二次密码验证,现在很多银行就这么搞的。

3、确认来源是否可靠(推荐)

1和2都是同一个思路,那就是验证请求合法性,从这一思路出发,前辈想出了下面几种方法:

验证HTTP Referer 字段

HTTP协议里面定义了一个访问来源的字段,这个字段叫Referer。黑客伪造的链接或表单是在其他网站上,所以我们可以判断Referer是否为自身网站,如果是,则允许访问,如果不是,则拒绝访问。

但是这种方法是有缺陷的,上面实验尝试过,如果对方在QQ上发送给你一个链接呢?点击的时候属于主动点击,此时一样没有Referer。程序会把它归属为安全请求,那么就被绕过了。并且如果某些低版本的浏览器存在漏洞(比如IE6),Referer很有可能被篡改,所以这个方法并非十全十美。

服务端验证请求的token一致性

CSRF攻击的核心原理就是利用用户验证信息储存cookie中,发送请求,使得服务器无法判断真伪,而token之所以能够拦截,就是因为它是CSRF攻击过程中几乎不可能伪造的东西。

实现原理:在服务端生成一个随机的token,加入到HTTP请求参数中,服务器拦截请求,查看发送的token和服务端的是否一致,若一致,则允许请求;若不一致,则拒绝请求。

注意:一定要生成唯一的或者随机性较大的token。如果token可以被爆破,一样可以伪造请求,进行攻击。

参考文章:https://blog.csdn.net/li741350149/article/details/62887524

Ajax防御CSRF

实际上Ajax防御的思想也可以利用上面的token验证方式。

IBM上一篇文章说Ajax防御时,在 HTTP 头中自定义属性并验证token。

它是这么说的:

把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

总结

CSRF防御原则:

  • GET方式不能用于更新资源的操作
  • POST方式请求加上随机token验证
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,791评论 6 545
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,795评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,943评论 0 384
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 64,057评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,773评论 6 414
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,106评论 1 330
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,082评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,282评论 0 291
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,793评论 1 338
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,507评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,741评论 1 375
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,220评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,929评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,325评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,661评论 1 296
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,482评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,702评论 2 380

推荐阅读更多精彩内容