CSRF的理解

声明:转自 http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

一、什么是CSRF?

CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造。那么什么是跨站请求伪造呢?让我一个词一个词的解释:

1、跨站:顾名思义,就是从一个网站到另一个网站。

2、请求:即HTTP请求。

3、伪造:在这里可以理解为仿造、伪装。

综合起来的意思就是:从一个网站A中发起一个到网站B的请求,而这个请求是经过了伪装的,伪装操作达到的目的就是让请求看起来像是从网站B中发起的,也就是说,让B网站所在的服务器端误以为该请求是从自己网站发起的,而不是从A网站发起的。当然,请求一般都是恶意的。

看到这里,你可能会问:为什么要伪装成从B网站发起的呢?从网站A直接向B网站服务器发起请求不可以吗?

要回答这个问题,就需要我们对Cookie机制有一定的认识。关于Cookie机制我会单独写一篇文章,这里不做详细介绍。这里你只需要知道:之所以要伪装成从B网站发起的,是因为Cookie是不能跨域发送的。结合上面这个例子来说就是:如果从A网站直接发送请求到B网站服务器的话,是无法将B网站中产生的Cookie一起发给B服务器的。

可能你还会问,为什么非要发送Cookie呢?这是因为服务器在用户登录后会将用户的一些信息放到Cookie中返回给客户端,然后客户端在请求一些需要认证的资源的时候会把Cookie一起发给服务器,服务器通过读取Cookie中的信息来进行用户认证,认证通过后才会做出正确的响应。

A网站访问B网站服务器的一些需要认证的资源的时候,如果没有Cookie信息,服务器是拒绝访问的,那么A网站就无法进行恶意操作。而伪造成B网站的请求,就可以将B网站的Cookie一起发到B服务器,这个时候就服务器就认为该请求是合法的,就会给出正确的响应,这个时候,A网站就达到目的了。

简单一句话就是:攻击者盗用了你的身份,以你的名义发送恶意请求。

那么,A网站通过CSRF能够做那些操作呢?

二、CSRF能够做什么呢?

CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。等等等等。

三、通俗点的例子

下面我们举个例子来说明CSRF攻击是如何实现的。

假设有一个微博网站B,B有一个“加关注”的功能,即一个用户可以关注另一个用户,而这个功能是这样的实现的:用户每次点击“加关注”按钮的时候,就会向服务器发送一个GET请求,URL如下:

http://www.bdomain.com/addfriends?uid=123

URL中的参数uid表示的是你要关注的用户的ID。

在正常情况下,即你登录B网站后,点击“加关注”按钮,浏览器会将上面的URL连同B网站产生的Cookie一起发送到B网站的服务器,B服务器首先通过Cookie进行用户认证,如果Cookie中的信息正确,就会进行向数据库中写入记录,这样,你就成功关注了ID为123的用户。

假如我是一个恶意用户,我想让更多的人关注我,而我又不想通过正常的渠道去实现,因为毕竟正常渠道比较浪费时间,于是我便开始想歪主意,碰巧,B网站的“加关注”的实现原理被我发现了。这个时候,我便进行了如下操作:

首先我在我自己的网站A里发了篇文章,文章中全是妖娆的美女图片,大家都喜欢美女嘛,所以就会有很多人来看我的这些美女,我们知道,图片在网页中大都是通过<img scr=”http://….”/>这样的形式实现的,图片加载的时候就会请求src中指定的URL,而我就把众多美女图片的src写成了B博客里“加关注”的URL,不同的是将参数uid的值都写成了我在B网站中的ID(假设是456),即:

http://www.bdomain.com/addfriends?uid=456

在网站A中的代码中就是:<img src=”http://www.bdomain.com/addfriends?uid=456″ />,当用户点击我发的文章的时候,浏览器就会请求这个src中的URL,这样就达到了在A网站中请求B服务器资源的目的,但是这样还差了一步,因为请求还是从A网站发出的,所以就没有B网站产生的Cookie,所以还是达不到目的,那该怎样做呢?

这就需要利用用户的上网习惯了,我们平时都会同时浏览很多网页,比如,你打开浏览器登录了B网站,与此同时,你可能也打开了我的网站A,而碰巧被我网站里全是美女的帖子吸引住了,就忍不住打开了这个帖子,这个时候,我的网站A就发起了上面的那个到B服务器的请求,而此时,你已经登录了B网站,Cookie已经产生了,浏览器一看请求的域名是bdomain.com,便将存放在客户端的B网站的Cookie给顺带一起发了过去,这样,服务器就会误认为是你主动要关注我的,于是,便向数据库写入了一条记录,而你就在不知不觉中,默默无闻的关注我了~~~

这样,我的目的就达到了~~~~

而如果很多用户都像你一样,在登录B微博的同时查看了我的帖子,那么他们也一样,默默无闻的关注了我~于是,我的粉丝量就大增!~~~

这里要说明一下:上面例子中说的同时打开多个网页只是可以被利用的方法中的一种,但并不是唯一的一种,你要知道,黑客们可不是吃素的啊,他们手段多着呢~在此顺道向黑客们的技术深深的致一敬~!

四、CSRF原理:

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成Cookie。

2.在不登出A的情况下,访问危险网站B。

看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……)

3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

示例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请求实现转账的话,危险网站B的HTML代码如下:

<form method=‘POST‘ action=‘http://www.cmbchina.com/‘>
    <input type=‘text‘ value=‘6227000330022376705‘ name=‘to‘ style=‘display:none‘>
    <input type=‘text‘ value=‘1000‘ name=‘to‘ style=‘display:none‘>
    <a onlick=‘onsubmit()‘><img 美女></a>
</form>

  一点美女还是会少1000块....

五、CSRF防御

  POST+隐藏的随机字符串,随机字符串是银行网站发给你的
  原理:我以GET方式去访问转账URL会看到转账单,在这个页面里面会有隐藏的一段随机字符串,会加到我的Cookie里,
  我擦,那么问题来了:如果我点击招商银行的转账页面,招商银行会把随机字符串放到我的Cookie里,这个时候我突然转到危险网站点了美女图片,然后他通过Ajax以POST方式发送求请求到银行,后台也能拿到我的随机字符串,那不也少钱了

时间: 2025-01-11 21:21:36

CSRF的理解的相关文章

跨站请求伪造(CSRF攻击)理解

一  概念 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全. 二  过程 1  受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到

初探csrf学习笔记

以下是今天学习了一天对CSRF的理解,大家切勿作为标准,如有出错请告之! 严禁转载.不想拿自己刚学到的知识去[误人子弟]之所以写出来是让自己巩固和增加理解,他日对此文有不当之处自会修改. [+]csrf是什么? [-]CSRF全称叫做cross-site request forgety 中文名叫做跨站请求伪造.[+]怎么理解CSRF? [-]CSRF其实与XSS十分相似 xss: 攻击者发现XSS漏洞——构造代码——发送给受害人——受害人打开——攻击者获取受害人的cookie——完成攻击CSRF

2018-2019 2 20165203 《网络对抗技术》Exp9 Web安全基础

2018-2019 2 20165203 <网络对抗技术>Exp9 Web安全基础 实验要求 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分.包括(SQL,XSS,CSRF).Webgoat实践下相关实验. 基础知识问答 (1)SQL注入攻击原理,如何防御 SQL注入的原理:就是通过构建特殊的参数传入web应用程序,而这些输入大多都是SQL语句语法里的组合,通过这些组合构造出某些特殊的含义,从而达到攻击者的攻击目的,例如在用户名和密码框中输入某些像''.--,#等特殊

每日思考(2020/01/19)

题目概览 HTML与XHTML二者有不同 写出主流浏览器内核私有属性的css前缀 手写一个幻灯片的效果 对XSS和CSRF的理解 题目解答 HTML与XHTML二者有不同 XHTML 元素必须被正确地嵌套 在 HTML 中,某些元素可以像这样彼此不正确地嵌套 <b><i>This text is bold and italic</b></i> 在 XHTML 中,所有的元素必须像这样彼此正确地嵌套 <b><i>This text is

python后端面试第四部分:django框架--长期维护

##################    Python语法基础        ####################### django框架部分 1,流程 2,admin 3,视图 3,路由 4,csrf 3.csrf是什么?django是如何防范的? django请求的生命周期, 浏览器-wsgi-中间件-路由-视图-然后处理数据等,返回数据 3,什么是wsgi?是一个协议,还有一些需要理解, 4,中间件是什么?在视图之前定制一些操作, 5,使用中间件做什么?做过什么认证,权限,跨域,等,

理解CSRF(跨站请求伪造)

理解CSRF(跨站请求伪造) 原文出处Understanding CSRF 对于Express团队的csrf模块和csurf模块的加密函数的用法我们经常有一些在意. 这些在意是莫须有的,因为他们不了解CSRF token是如何工作的. 下面快速过一遍! 读过后还有疑问?希望告诉我们错误?请开一个issue! 一个CSRF攻击是如何工作的? 在他们的钓鱼站点,攻击者可以通过创建一个AJAX按钮或者表单来针对你的网站创建一个请求: <form action="https://my.site.c

渗透日常之 花式实战助你理解CSRF

本文作者:i春秋签约作家--onls辜釉 最近比较忙,很久没发文章了,Onls本就只是一个安全爱好者,工作也不是安全相关.以往的文章也更像是利用简单漏洞的"即兴把玩",更多的是偏向趣味性,给大家增加点学习的乐趣,看完文章即使仅有一个人觉得"哦?原来还能这样玩!"那我认为也是有价值的.话不多说,咱们开始. 写本文是看到@MAX丶 表哥的这篇[原创] 各大SRC中的CSRF技巧 ,我觉得对于CSRF,表哥这篇文章讲得很明白了,包括原理和防御,还有一个自己验证苏宁易购订单

CSRF理解与防御

一.说明 记得以前去面试技术也不太会但你总得讲点东西,让面试时间长一些让面试官觉得你基础还可以,当时选的就是名头比较大的OWASP TOP 10.TOP 10嘛你总得拿出至少三个点来讲的细一些以证明你是真的知道而不是背概念. 纵观TOP 10 注入和XSS是比较有把握的,其他什么"失效的认证和会话管理"."不安全的对象直接引用",由于当时没有实际的生产环境攻击和防护经验理解不了其所说的概念和影响,感觉好几个概念感觉意思差不多面试官如果问区别那不肯定讲不清了.权衡之下

对CSRF(跨站请求伪造)的理解

一.什么是CSRF? CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造.那么什么是跨站请求伪造呢?让我一个词一个词的解释: 1.跨站:顾名思义,就是从一个网站到另一个网站. 2.请求:即HTTP请求. 3.伪造:在这里可以理解为仿造.伪装. 综合起来的意思就是:从一个网站A中发起一个到网站B的请求,而这个请求是经过了伪装的,伪装操作达到的目的就是让请求看起来像是从网站B中发起的,也就是说,让B网站所在的服务器端误以为该请求是从自己网站发起的,而不是从