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(跨站请求伪造)的主要内容,如果未能解决你的问题,请参考以下文章