CSRF 漏洞
Posted ROODIE.Z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF 漏洞相关的知识,希望对你有一定的参考价值。
目录
一、简介与原理
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 漏洞的主要内容,如果未能解决你的问题,请参考以下文章