浅谈CSRF攻击方式

总结-针对WEB应用攻击的几种常见方式与应对措施,12年高级工程师的“飞升之路” 1 | XSS跨站脚本攻击 | WEB程序未对用户输入的内容进行过滤,把恶意代码(包括HTML代码、Script脚本)注入到其他用户浏览器显示的页面上执行。| 1)对用户输入内容进行过滤控制或编码;| 2 | CSRF跨站请求伪造 | 1.冒充合法用户跨站发起WEB访问请求;| 1)增加验证码或令牌认证;2)对访问请求来源进行检查;开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**| | 常见攻击类型 | 攻击原理与要点 | 应对措施 | 阅读详情

一.CSRF是什么?

  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

二.CSRF可以做什么?

  你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

三.CSRF漏洞现状

  CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI......而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。

四.CSRF的原理

  下图简单阐述了CSRF攻击的思想:

  

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

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

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

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

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

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

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

 

  上面大概地讲了一下CSRF攻击的思想,下面我将用几个例子详细说说具体的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去获取请求的数据,而$_REQUEST既可以获取GET请求的数据,也可以获取POST请求的数据,这就造成了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中,可以使用$_GET和$_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的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

五.CSRF的防御

  我总结了一下看到的资料,CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

  1.服务端进行CSRF防御

  服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。

  (1).Cookie Hashing(所有表单都包含同一个伪随机值):

  这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了:>

  <? php
    // 构造加密的Cookie信息
    $value   =  “DefenseSCRF”;
    setcookie (”cookie” ,   $value ,   time () + 3600 );
  ?>

  在表单里增加Hash值,以认证这确实是用户发送的请求。

复制代码
  <? php
    $hash   =   md5 ( $_COOKIE [ ' cookie ' ]);
  ?>
  < form method = ”POST” action = ”transfer . php” >
    < input type = ”text” name = ”toBankId” >
    < input type = ”text” name = ”money” >
    < input type = ”hidden” name = ”hash” value = ” <?= $hash ; ?> ” >
    < input type = ”submit” name = ”submit” value = ”Submit” >
  </ form >
复制代码

  然后在服务器端进行Hash值验证

复制代码
       <? php
         if ( isset ( $_POST [ ' check ' ])) {
             
$hash   =   md5 ( $_COOKIE [ ' cookie ' ]);
              if ( $_POST [ ' check ' ]  ==   $hash ) {
                  doJob();
             } 
else  {
        //...

             }
        } 
else  {
      //...

        }
      
?>
复制代码

  这个方法个人觉得已经可以杜绝99%的CSRF攻击了,那还有1%呢....由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,这就另外的1%。一般的攻击者看到有需要算Hash值,基本都会放弃了,某些除外,所以如果需要100%的杜绝,这个不是最好的方法。
  (2).验证码

  这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,厄....这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。

  (3).One-Time Tokens(不同的表单包含一个不同的伪随机值)

  在实现One-Time Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。

  以下我的实现:

  1).先是令牌生成函数(gen_token()):

复制代码
      <? php
      function  gen_token() {
    //这里我是贪方便,实际上单使用Rand()得出的随机数作为令牌,也是不安全的。
    //这个可以参考我写的Findbugs笔记中的《Random object created and used only once》
           $token   =   md5 ( uniqid ( rand () ,   true ));
          
return   $token ;
     }
复制代码

  2).然后是Session令牌生成函数(gen_stoken()):

复制代码
      <? php
     
  function  gen_stoken() {
       $pToken = "" ;
      if( $_SESSION [STOKEN_NAME]  ==  $pToken ){
        //没有值,赋新值
      
  $_SESSION [STOKEN_NAME]  =   gen_token() ;
      }    
      else{
        //继续使用旧的值
      }

       }
     
?>
复制代码

  3).WEB表单生成隐藏输入域的函数:  

复制代码
     <?php
       function gen_input() {
            gen_stoken();
            echo “<input type=\”hidden\” name=\”" . FTOKEN_NAME . “\”
                 value=\”" . $_SESSION[STOKEN_NAME] . “\”> “;
       }
     ?>
复制代码

  4).WEB表单结构:

复制代码
      <? php
          
session_start ();
          
include (”functions . php”);
     
?>
     
< form method = ”POST” action = ”transfer . php” >
          
< input type = ”text” name = ”toBankId” >
          
< input type = ”text” name = ”money” >
          
<?  gen_input();  ?>
          
< input type = ”submit” name = ”submit” value = ”Submit” >
     
</ FORM >
复制代码

  5).服务端核对令牌:

  这个很简单,这里就不再啰嗦了。

  上面这个其实不完全符合“并行会话的兼容”的规则,大家可以在此基础上修改。

 

  其实还有很多想写,无奈精力有限,暂且打住,日后补充,如果错漏,请指出:>

  PS:今天下午写这篇文档的时候FF崩溃了一次,写了一半文章的全没了,郁闷好久T_T.......

  转载请说明出处,谢谢[hyddd(http://www.cnblogs.com/hyddd/)]

六.参考文献

[1].Preventing CSRF

[2].Security Corner: Cross-Site Request Forgeries

[3].《深入解析跨站请求伪造漏洞:原理剖析》

[4].《Web安全测试之跨站请求伪造(CSRF)》

[5].《深入解析跨站请求伪造漏洞:实例讲解》

[6].http://baike.baidu.com/view/1609487.htm

内网 —— 跨域攻击 目录 跨域攻击的方法 利用域信任关系的跨域攻击 域信任关系 获取域信息 利用域信任密钥获取目标域的权限 利用krbtgt 散列值获取目标域的权限 外部信任和林信任 利用无约束委派 和 MS-RPRN 获取信任林权限 防范跨域攻击 跨域攻击的方法 都有自己的内网,一般通过域林进行共享资源。根据不同职能区分 利用域信任关系的跨域攻击 域信任关系 获取域信息 利用域信任密钥获取目标域的权限 ... 阅读详情

相关推荐

深度学习二分类实战:用Python+Keras搞定基因表达数据预测(附完整代码)

本文详细介绍了如何使用Python和Keras构建深度学习模型进行基因表达数据的二分类预测。通过数据预处理、特征选择、神经网络构建及优化策略,特别针对小样本场景提供了调参技巧和模型解释方法。文章还包含完整的代码示例,帮助读者快速掌握深度学习在生物信息学中的应用。

weixin_30642561的博客 246

什么前端跨域?如何解决跨域问题?什么是跨域攻击?

跨域问题是前端开发中一个常见的问题。本文介绍了跨域问题的原因、常见的跨域解决方案、跨域攻击方式以及跨域安全措施。在实际开发中,需要根据具体的情况选择合适的跨域解决方案,并且需要注意跨域请求的安全性。

tyxjolin的专栏 2377

为什么传统CNN在视网膜分割中败给Mamba?从血管拓扑学揭秘Serp-Mamba的蛇形扫描黑科技

本文深入分析了传统CNN在视网膜血管分割任务中的局限性,特别是在处理高分辨率图像和复杂血管拓扑结构时。针对这些问题,文章重点介绍了Serp-Mamba模型的核心创新——蛇形交织自适应扫描(SIA)机制,该机制通过让扫描路径自适应地贴合血管曲率,并结合模糊驱动双重校准(ADDR)模块应对极端类别失衡,从而在视网膜血管分割任务上实现了性能的显著突破。

ss78901的博客 897

跨域攻击分析和防御(上)

点击星标,即时接收最新推文跨域攻击在大型公司或大型跨国企业中都拥有自己的内网,跨国公司都有各个子公司一般以建立域林进行共享资源。根据不同职能区分的部门,从逻辑上以主域和子域进行划分以方便统一管理。在物理层使用防火墙将各个子公司以及各个部门划分为不同区域。我们在渗透测试过程中如果拿到其中某个子公司或是某个部门的域控制器权限后,如果没有得到整个组织机构全部权限或我们需要寻找的资料不在此域中,往往需要其...

Ms08067安全实验室 1692

卡尔曼滤波原理详解及系统模型建立(simulink)

卡尔曼滤波原理详解及系统模型建立(simulink) 卡尔曼滤波器 卡尔曼滤波器是在上个世界五六十年代的时候提出的,到今天已经有六十年左右的时间,但卡尔曼滤波算法不管在控制、制导、导航或者通讯方面对数据的预测能力依然处在一个不可撼动的位置上,但是很多人对于其算法内部的工作原理究竟是怎么运作的依然不理解,所以在工程上很多人都只是把卡尔曼滤波当成是一种“黑箱”预测算法,并不清楚内部原理。但实际上没有任...

weixin_43942325的博客 7万+

38、四旋翼无人机的机械建模、控制与仿真及小型无人机高度的最优鲁棒无模型控制

本文探讨了四旋翼无人机的机械建模、控制与仿真方法,采用基于PID控制器的分层控制策略实现稳定飞行与路径跟踪,并开发了结合CAD模型与MATLAB环境的飞行模拟器。同时,针对小型无人机高度控制问题,提出了一种基于粒子群优化(PSO)的最优鲁棒无模型控制(PSO-MFC)方法,有效解决了参数整定难题,实现了零稳态误差跟踪和强抗干扰能力。两种方法在仿真中均表现出良好性能,为无人机控制系统的设计与优化提供了理论与实践基础。

l6m7n8的博客 101

什么是跨域脚本攻击?

跨域脚本攻击又叫XSS攻击,属于客户端攻击,攻击者在我们的网页中嵌入恶意脚本,当用户使用浏览器浏览被嵌入恶意脚本的网页时,脚本就会在我们的浏览器中执行.XSS攻击的核心是脚本 XSS可以分为以下三类: 1.反射型(非持久型) 当用户访问了一个网站A,攻击者在这个网站中嵌入了恶意的脚本用于盗取客户的cookie信息. 攻击者诱导用户触发XSS攻击(诱导用户点击非法链接) 这样攻击者就获取了用户的身份信息对其进行非法的操作 2.持久型 持久型的XSS的攻击是很危险的,一旦攻击成功造成大规模XSS攻击,如XSS蠕

qq_45974547的博客 6797

操作系统 | 知识梳理 | 复习(上)

操作系统复习

知识库搭建ing 3476

浅谈CSRF的攻击方式

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。 三.CSRF漏洞现状 CSRF这种攻击方式在

qq_45335911的博客 411

TC3XX - MCAL知识点(三十八):AURIX™ TC3xx 的EDSADC实现旋变解码功能(理论知识+手册阅读)

本文系统梳理了英飞凌AURIX系列芯片EDSADC模块的技术手册内容。首先概述了该模块的架构特点,包括模拟/数字输入通道和总线地址信息。重点解析了手册中的关键知识点:1)模拟量输入的差分/单端模式;2)数字量连接的触发、数据源和时钟源选择;3)功能配置中的寄存器操作注意事项;4)输入通道的三种数据来源模式;5)滤波器链的组成和工作原理;6)旋变应用中的载波信号生成和延迟补偿机制。最后对SRM、SAUL、SBLL等专业术语进行了详细解释。全文为理解EDSADC模块的硬件特性和配置方法提供了系统的技术参考。

梦想技术家 595

【ROS】ROS2导航Nav2:简介、安装、测试效果、错误处理

在ROS2中自动导航使用Nav2来实现。Nav2 使用几个独立的模块化服务,通过 ROS 2接口(例如动作服务器或服务)与行为树 (BT) 通信。Nav2 输入包括:TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源;Nav2 输出速度命令;Nav2 支持多种机器人,比如:四足机器人、履带机器人、轮式机器人等。

郭老二 5089
上一篇: Guava学习笔记:Google Guava 类库简介
下一篇: Mybatis之typeAlias配置的3种方法
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值