CSRF(跨站请求伪造)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF(跨站请求伪造)相关的知识,希望对你有一定的参考价值。

参考技术A 2021-11-24

跨站点请求伪造(Cross—Site Request Forgery),伪装来自受信任用户的请求来利用受信任的网站。简单来说CSRF就是获取凭证伪造身份去做事。

详细点说:假如A网站中存在CSRF漏洞,攻击者构造一个利用的POC,发送给受害者(在浏览器中处于登陆状态),让受害者点击POC,导致受害者在A网站上的的资料被修改或者钱财被转移。

所有用户进行操作的位置都可能存在CSRF,修改信息、密码、头像。

1.利用浏览器中缓存的cookie
2.没有一次型的token验证

1.修改受害者的一些资料、转账或者改密码
2.如果获取到应用程序中的管理员cookie,攻击者完全可以控制应用的所有数据和功能

1.资源包含
资源包含是在大多数介绍CSRF概念的演示或基础课程中可能看到的类型。这种类型归结为控制html标签(例如<image>、<audio>、<video>、<object>、<script>等)所包含的资源的攻击者。如果攻击者能够影响URL被加载的话,包含远程资源的任何标签都可以完成攻击。
2.基于表单
通常在正确使用安全的请求方式时看到。攻击者创建一个想要受害者提交的表单; 其包含一个javascript片段,强制受害者的浏览器提交。
3.XMLHttpRequest
基于XHR的CSRF通常由于SOP而以XSS有效载荷的形式出现。没有跨域资源共享策略 (Cross-Origin Resource Sharing, CORS),XHR仅限于攻击者托管自己的有效载荷的原始请求。

通过CSRF-token或者验证码来检测用户提交
验证 Referer/Content-Type
对于用户修改删除等操作最好都使用POST操作
避免全站通用的Cookie,严格设置Cookie的域

https://shahmeeramir.com/methods-to-bypass-csrf-protection-on-a-web-application-3198093f6599

1.跨账户使用令牌
2.替换相同的长度
3.从请求中删除csrf token
4.解码CSRF token
5.通过HTML提取CSRF token
6.只使用token的静态部分

参考链接: https://websec.readthedocs.io/zh/latest/vuln/csrf.html

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

以上是关于CSRF(跨站请求伪造)的主要内容,如果未能解决你的问题,请参考以下文章

CSRF跨站请求伪造

Django--CSRF 跨站请求伪造

Web安全- 跨站请求伪造CSRF

跨站请求伪造CSRF原理

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

CSRF(跨站请求伪造)攻击