目录
什么是CSRF
Cross-Site Request Forgery:跨站请求伪造,也称为ONe Click Attack或者Session Reinding,通常缩写为CSRF或者XSRF。
XSS与CSRF区别:
- XSS利用站点内的信任用户,盗取Cookie
- CSRF通过伪装成受信任用户请求受信任的网站
第三方网站对目标网站发起一个请求的时候利用用户的cookie冒充了用户的身份。
实现流程:
①用户访问网站(例如网上银行),网站返回cokkie,保存在浏览器里面。
②点击攻击链接/访问攻击者网站,网站返回一个包含恶意请求(例如银行转账)的页面
③浏览器对该请求进行解析执行,利用刚刚用户登录银行网站的cookie。
CSRF漏洞原理
利用目标用户的合法身份,以目标用户的名义执行某些非法操作。
但是有两个前提,①用户登录当前系统(获得cookie) ②用户访问了恶意URL
无防护的CSRF漏洞利用
GET型CSRF漏洞
构造GET型URL,提交参数以进行转账,新建用户等操作。
进行CSRF攻击的几种方式
1. 利用链接
即Html的a标签。点击链接后会向服务器发送包含参数的请求。例如:
2. 利用iframe标签
iframe标签内容将在页面加载过程中自动加载,src指向的位置就是页面请求的位置。可以使用iframe的style->display:none,来隐藏iframe加载的内容。例如:
3. 利用img标签
img标签的内容会随着页面的加载而被请求,因此src指向的位置会在页面加载过程中被请求执行。例如:
4. 利用CSS-background
以利用CSS中的background样式中的url来加载远程机器上的内容,从而对url中的内容发送HTTP请求。例如:
POST型CSRF漏洞
通过网页源代码或http请求头查看提交的参数名,然后通过设置表单进行提交。
例如:
如上图所示,一旦用户点击了【我中奖了】按钮,就会自动提交表单信息。
CSRF防御
- 验证码防御
- 转账等操作时需要再次输入密码进行二次验证
- 利用token防御
- Referer Check防御
- HTTP自定义头(不知道怎么用。。。)
利用tocken防止CSRF漏洞
服务器在用户登录之后给用户一个唯一的合法令牌,之后的每一次请求,服务器都会验证令牌是否正确,如果正确才会执行操作。
一般情况下,给与的令牌会写入到表单的隐藏域的value值中,随着表单内容进行提交,或者保存在Cookie里面。
tocken泄露
- GET型Tocken泄露
- POST型Tocken泄露(利用XSS漏洞读取Cookie,获取存储在其中的Tocken值)
关于tocken的说明参考:深入理解token - 后知、后觉 - 博客园
利用Referer防止CSRF漏洞
Http Referer时header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
缺陷:服务器并非任何时候都可以取到Referer。例如从HTTPS跳转到HTTP,此时不会携带Referer。(在Https -> Http的过程中Referer是不被传递的,而在 Https -> Https 或 Http -> Https 则没有这样的问题。参考:从Https跳转到Http时不传递HTTP_REFERER的解决方案 - 简书)
如何绕过Referer验证?
如果服务器端只判断当前Refer中是否具有域名,那么可以通过(在站点目录下)新建文件夹(将文件夹名设置为域名)进行绕过。如下图所示:
注)可以使用BurpSuite来CSRF POC,如下图所示(图为社区版,仅专业版提供此功能)