CSRF跨站请求伪造

简介

定义

CSRF(Cross Site Request Forgery)跨站请求伪造,是一种网络的攻击方式,也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF

漏洞产生原因

当Web应用程序在用户进行敏感操作时,如:修改账号密码、添加账号、转账等时,没有校验表单token或者http请求头中的referer值,从而导致恶意攻击者利用普通用户的身份(cookie)完成攻击行为

漏洞原理

CSRF是一种针对Web应用的攻击方式。它可以在受害者毫不知情的情况下,以受害者的名义伪造请求,并发送给受攻击的站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大危害性。
与其他攻击方式(SQL注入、上传、XSS等)相比,CSRF的关注度较少,也更容易出现


利用方法

一次CSRF攻击的过程中,受害者需要依次完成两个步骤:

  1. 登录受信任网站A,并在本地生成Cookie
  2. 在A的Cookie存活期间内,访问危险网站B

eg:

  1. 网站A的管理员A成功登录网站A
    正常返回Cookie

  2. 网站A的账号密码修改功能存在CSRF漏洞

  3. 网站B为黑客控制的恶意网站
  4. 管理员A访问网站B
  • HTTP Request:
    1
    2
    3
    HTTP/1.1
    GET/
    Host: www.test.com
  1. 网站B的响应数据中,包含了请求修改用户A在网站A账号密码的请求
  • HTTP Response

    1
    2
    3
    4
    5
    6
    7
    8
    HTTP /1.1 OK
    Content-Type:text/html
    Context-Length: 1024
    <html>
    <body>
    <img src=http://finance.bdtest.com/bug.php?symbol=BIDU&shares=1000 />
    </body>
    </html>
  • CSRF Attack

    1
    2
    3
    HTTP/1.1
    GET /bug.php?symbol=BIDU&shares=1000
    Host: finance.bdtest.com

高危触发点

  • 论坛交流
  • 用户中心
  • 反馈留言
  • 交易管理
  • 后台管理

漏洞危害

CSRF漏洞会导致受害人在不知情的情况下向论坛发帖子、订阅邮件列表、网购或股票交易、变更用户名或口令。对受到防火墙保护的所有Web应用程序而言,CSRF攻击都能绕过防火墙攻击Web应用
CSRF还可与XSS等漏洞联用,从而进一步加大该漏洞的危害。

主要危害可主要归为以下几类

  • 伪造HTTP请求进行未授权操作
    • 篡改、盗取目标网站上的重要用户信息
    • 未经允许执行对用户名誉或资产有害的操作,如:散播不良信息、进行消费等
    • 若通过使用社工等方式攻击网站管理员,会危害网站本身的安全性
  • 作为其它攻击向量的辅助手法,比如配合XSS
  • 传播CSRF蠕虫

漏洞防御

Token验证码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Generate Token
// 生成随机数
if(!function_exists("random_bytes")) {
// random_bytes函数存在于PHP7
// 若random_bytes函数不存在,使用简单生成伪随机数
function random_bytes($length =32) {
// 0~9,a~Z
$seed = "01234569abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
return substr(str_shuffle(str_repeat($seed, $length)), 0, $length);
}
}

// Token生成
function csrf_token($length = 40) {
$str = "";
while (($len = strlen($str)) < $length) {
$size = $length - $len;
$bytes = random_bytes($size);
$str .=substr(str_replace(['/', '+', '='],'',base64_encode(($bytes)), 0, $size);
}
return $str;
}

$token = csrf_token();
$_SESSION['_csrf_token'] = $token;
// 渲染到页面
// ...
// 表单提交,校验Token
if($_POST['_csrf_token'] !== $_SESSION['_csrf_token']) {
return false;
}

Referer验证代码实现

1
2
3
4
5
$regex = "/yourdomain.com$/i";
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER']:'';
if(empty($referer) || preg_match($referer, $regex) != 1) {
return false;
}

防御总结

CSRF攻击核心时伪造请求,识别此类攻击的重点就是判断当前操作是否伪造;通过在当前页面生成随机Token,后端业务逻辑在处理操作时,应先校验Token的有效性,然后才能处理业务流程。尤其在核心业务中,采用Token+Referer的组合进行操作验证;采用验证码校验操作是因为攻击者无法预知验证码的值,进而无法构造有效的攻击;但毫无疑问,验证码会一定程度影响用户体验,所以需要在安全与用户体验之间找到一个微妙的平衡点


补充

CSRF与XSS区别

  • csrf:无需获取任何信息,只是诱导用户进行恶意访问,要利用已登录的状态,发起登录后才能发起的请求
  • xss:获取到Cookie等信息后,利用Cookie登录

bwapp安装

  1. 修改admin/setting数据用户密码
  2. 点击here
  3. 新建用户登录

同源策略

同源策略,由浏览器支持(域名、协议、端口相同)
思考以下是否同源:

1
2
file:///C:/phpStudy/PHPTutorial/WWW/127.0.0.1html
http://127.0.0.1/127.0.0.1.html

答:不属于同源

浏览器同源策略与跨域问题(跨域访问)

您的支持是我前进的动力!