CSRF 漏洞

Posted ROODIE.Z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF 漏洞相关的知识,希望对你有一定的参考价值。

目录

一、简介与原理

二、简单攻击方式 

通过 GET 方式实现CSRF攻击

通过 POST 请求实现CSRF攻击

三、与 XSS 以及 SSRF 的区别

四、相关检测方法

五、相关预防与修复方案

用户侧

开发侧


一、简介与原理

        CSRF(Cross-Site Request Forgery)跨站请求伪造,也被称为“One Click Attack”、“Session Riding”。攻击者在用户浏览网页时,利用页面元素,在用户不知情的情况下,利用受害者的浏览器向 Web 应用服务器强迫发送伪造的 HTTP 请求达到获取或更改用户信息的行为。CSRF 攻击可以从站外和站内发起;

        其攻击普遍结合社会工程学,且攻击场景需要满足以下条件:

1) 用户完成身份认证;

2) 新请求不需要重新身份认证或确认机制(攻击建立在浏览器与WEB服务器的会话中);

3) 攻击者可以正确的构造请求参数内容;

4) 诱使用户触发攻击指令(欺骗用户访问 URL);


         CSRF 常见攻击流程如下图:


二、简单攻击方式 

通过 GET 方式实现CSRF攻击

        首先 Victim 登录 csrf_victim.com,然后 Victim 访问 CSRF_attacker.com 时,就对 csrf_victim.com 这个网站发起了一次 HTTP 请求,并更改了 Victim 的密码为 CSRF_Confirm

# CSRF_attacker.com 中存在如下代码

<img src="http://www.csrf_victim.com?userId=victim&password=CSRF_Confirm&Change=Change">

通过 POST 请求实现CSRF攻击

        Victim 访问 CSRF_attacker.com 触发 CSRF

<form name="csrf" action="http://www.csrf_victim.com" method="POST">
    <input type="hidden" name="userId" value="victim" />
    <input type="hidden" name="password" value="CSRF_Confirm" />
    <input type="hidden" name="change" value="change" />
</form>

<script>document.csrf.submit();</script>

三、与 XSS 以及 SSRF 的区别

        XSS(Cross Site Scripting)跨站脚本攻击 利用用户对站点的信任,用户提交的数据中可以构造代码来执行,从而实现窃取用户信息等行为的攻击手段;

        CSRF(Cross-Site Request Forgery)跨站请求伪造,XSS 是实现 CSRF 攻击的一种方式,CSRF 利用站点对经过身份认证的用户的信任,客户端没有在用户进行关键操作时进行授权确认;

        SSRF(Server-Side Request Forgery)服务端请求伪造 诱使服务端应用程序向攻击者选择的域发出 HTTP 请求;


四、相关检测与识别方法

手动测试步骤如下:

1)抓包记录正常的 HTTP 请求;

2)分析 HTTP 请求参数是否可预测,分析对应的参数功能;

3)去掉或更改 Referer 为第三方站点,然后重放请求;

4)判断是否达到与正常请求的同等效果,若正常,则可能存在 CSRF 漏洞;反之则不存在;


半手动测试BurpSuite 抓包,使用 Generate CSRF-PoC 生成测试


 自动测试软件下载https://github.com/aur-archive/csrftester


五、相关预防与修复方案

用户侧

1)重要网站访问后要安全退出;

2)不随意点击各类链接和弹窗;

3)定期清理浏览器中缓存的 Cookie 信息;


开发侧

1)增加 Token 验证,并保证随机性。在 Session 中绑定 Token,如果不能保存到服务端,则替代保存到 Cookie 中;

        生成随机 Token 的代码如下:

# 生成 Token
session_start();
function set_token()
    $_SESSION['token'] = md5(time()+rand(1,9999));

        验证 Token 的代码如下:

# 使用 Token 做验证
function check_token()
    if(isset($_POST['token'])&&$_POST['token'] === $_SESSION['token'])
        return ture;
    else
        return false;
    

        或是在 form 表单中自动填入 Token 字段;

<input type="hidden" name="anti_csrf_token" value="$token" />

        亦或是在 HTTP 请求中自动添加 Token ,在服务器中对比 POST 提交的 Token 参数与 Session 中绑定的 Token 是否一致;

2)设置安全的会话管理,不在客户端保存敏感信息。并且设置会话过期机制,如:当前页面10分钟无操作则自动登录超时,在关闭和退出页面时会话自动失效;

3)同源策略,通过在 HTTP 头字段中的 Referer 来限制页面来源,要求页面请求必须来源于同一个网页站点 (但是此方式无法站内发起的 CSRF 攻击以及 Referer 字段伪造);

4)在重要的功能点上增加动态验证码(在一定程度上影响用户体验);

以上是关于CSRF 漏洞的主要内容,如果未能解决你的问题,请参考以下文章

表单 AJAX 提交执行 CSRF 安全过滤

详解CSRF漏洞攻击

浅谈CSRF漏洞

了解CSRF漏洞

CSRF漏洞笔记

csrf漏洞原理