CSRF跨站请求伪造

CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

http://baike.baidu.com/view/1609487.htm

CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

client.php

 1 <?php
 2 function authcode($string, $operation = ‘DECODE‘, $key = ‘‘, $expiry = 0) {
 3
 4 $ckey_length = 4;
 5 $key = md5($key ? $key : time());
 6 $keya = md5(substr($key, 0, 16));
 7 $keyb = md5(substr($key, 16, 16));
 8 $keyc = $ckey_length ? ($operation == ‘DECODE‘ ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ‘‘;
 9
10 $cryptkey = $keya.md5($keya.$keyc);
11 $key_length = strlen($cryptkey);
12
13 $string = $operation == ‘DECODE‘ ? base64_decode(substr($string, $ckey_length)) : sprintf(‘%010d‘, $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
14 $string_length = strlen($string);
15
16 $result = ‘‘;
17 $box = range(0, 255);
18
19 $rndkey = array();
20 for($i = 0; $i <= 255; $i++) {
21 $rndkey[$i] = ord($cryptkey[$i % $key_length]);
22 }
23
24 for($j = $i = 0; $i < 256; $i++) {
25 $j = ($j + $box[$i] + $rndkey[$i]) % 256;
26 $tmp = $box[$i];
27 $box[$i] = $box[$j];
28 $box[$j] = $tmp;
29 }
30
31 for($a = $j = $i = 0; $i < $string_length; $i++) {
32 $a = ($a + 1) % 256;
33 $j = ($j + $box[$a]) % 256;
34 $tmp = $box[$a];
35 $box[$a] = $box[$j];
36 $box[$j] = $tmp;
37 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
38 }
39
40 if($operation == ‘DECODE‘) {
41 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
42 return substr($result, 26);
43 } else {
44 return ‘‘;
45 }
46 } else {
47 return $keyc.str_replace(‘=‘, ‘‘, base64_encode($result));
48 }
49
50 }
51
52 function formhash($specialadd = ‘‘) {
53 $username = $_COOKIE[‘username‘];
54 $uid = $_COOKIE[‘uid‘];$auth_code = authcode($string, $operation = ‘DECODE‘, $key = ‘‘, $expiry = 0);
55 return substr(md5(substr(time(), 0, -7).$username.$uid.$auth_code.$specialadd), 8, 8);
56 }
57
58   $hash = formhash();
59   ?>
60   <form method=”POST” action=”transfer.php”>
61     <input type=”text” name=”toBankId”>
62     <input type=”text” name=”money”>
63     <input type=”hidden” name=”hash” value=”<?=$hash;?>”>
64     <input type=”submit” name=”submit” value=”Submit”>
65   </form>

在服务器端进行hash认证
server.php

 1 <?php
 2         if(isset($_POST[‘submit‘])) {
 3              $hash = md5($_COOKIE[‘token‘]);
 4              if($_POST[‘hash‘] == $hash) {
 5                    doJob();
 6              } else {
 7         //...
 8                 //非法请求
 9              }
10         } else {
11       //...
12         }
13 ?>

延伸阅读:
http://www.baidu.com/s?wd=csrf
http://www.sogou.com/web?query=csrf
http://www.so.com/s?q=csrf
http://www.baidu.com/s?wd=csrf%20php
http://www.sogou.com/web?query=csrf%20php
http://www.so.com/s?q=csrf%20php
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

时间: 03-13

CSRF跨站请求伪造的相关文章

自动化运维Python系列之Django CSRF跨站请求伪造、中间件

CSRF CSRF,跨站请求伪造是一种挟持用户在当前已登陆的web站点应用程序上执行非本意的操作攻击方法,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品). Django的CSRF中间件验证就可以有效地杜绝此类恶意攻击,原理就是Django在内部会对通过验证请求的客户端再做一次加密验证,该加密方式只有Django自己知道,客户端即使携带session反解密CSRF不成功也会拒绝访问:这是Django生

Django之cfrs跨站请求伪造和xfs攻击

跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全局和局部. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件. @csrf_exempt,取消当前函数防跨站请

跨站请求伪造CSRF(Cross-site request forgery)

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用 一般被攻击步骤: 1.登录受信任网站A,并在本地生成Cookie. 2.在不登出A的情况下,访问危险网站B. 所以没事的时候不要乱点链接不是随便说着玩的. 常见场景分析: 假设你有一个这样的Action,因为已经加了[Authorize(Roles = "Admins")]标记

CSRF简单介绍及利用方法-跨站请求伪造

0x00 简要介绍 CSRF(Cross-site request forgery)跨站请求伪造,由于目标站无token/referer限制,导致攻击者可以用户的身份完成操作达到各种目的.根据HTTP请求方式,CSRF利用方式可分为两种. 0x01 GET类型的CSRF 这种类型的CSRF一般是由于程序员安全意识不强造成的.GET类型的CSRF利用非常简单,只需要一个HTTP请求,所以,一般会这样利用: <img src=http://wooyun.org/csrf.php?xx=11 />

Web安全测试之跨站请求伪造(CSRF)篇

跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体方法和示例,最后提提了一些防范该攻击的建议,希望本文对读者的安全测试能够有所启发. 一.CSRF概述 我们首先来了解一下什么是跨站请求伪造(CSRF)?跨站请求伪造是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法.攻击者只要借助少许的社会工程诡计,例如通过电子邮件或者是聊天

Web安全相关(二):跨站请求伪造(CSRF/XSRF)

简介 CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用.尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左.XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更

跨站请求伪造(防护)

跨站请求伪造(防护) 任何Web应用所面临的一个主要安全漏洞是跨站请求伪造,通常被简写为CSRF或XSRF,发音为"sea surf".这个漏洞利用了浏览器的一个允许恶意攻击者在受害者网站注入脚本使未授权请求代表一个已登录用户的安全漏洞. 为了防范伪造POST请求,我们会要求每个请求包括一个参数值作为令牌来匹配存储在cookie中的对应值.我们的应用将通过一个cookie头和一个隐藏的HTML表单元素向页面提供令牌.当一个合法页面的表单被提交时,它将包括表单值和已存储的cookie.如

深入解析跨站请求伪造漏洞:实例讲解

本文的上篇中,我们着重介绍了跨站请求伪造的原理,并指出现有的安全模型并不能真正防御这种攻击.在下篇中,我们将向读者介绍在一些大型站点上发现的几个严重的CSRF漏洞,攻击者利用这些漏洞不仅能够采集用户的电子邮件地址,侵犯用户隐私并操控用户帐户.如果金融站点出现了跨站请求伪造漏洞的话,这些漏洞甚至允许攻击者从用户的银行帐户中划走资金.为了全面的防御CSRF攻击,建议对服务器端进行改造.此外,本文还会介绍服务器端解决方案应具备的特征,如果缺乏这些特性,就会导致CSRF保护措施不必要地妨碍典型的web浏

crsf 跨站请求伪造

[crsf 跨站请求伪造] CSRF(Cross-site request forgery),中文名称:跨站请求伪造.核心为利用浏览器帮助提交cookie.采用随机数方可防御.估计大部小站均无CSRF的防御. 参考: 1.http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html 2.<深入浅出Node>,8.2.4.2,csrf.