`

CSRF攻击原理解析

阅读更多
CSRF攻击原理解析(2008-09-23 18:38:44)标签:杂谈   分类:系统安全
|=——————————————————————=|
|=————–=[ CSRF攻击原理解析 ]=——————=|
|=——————————————————————=|
|=——————-=[ By rayh4c ]=————————=|
|=————-=[ rayh4c@80sec.com ]=——————-=|
|=——————————————————————=|

Author: rayh4c [80sec]
EMail: rayh4c#80sec.com
Site: http://www.80sec.com
Date: 2008-9-21

0×00.前言

在Web程序中普通用户一般只在Web界面里完成他想要的操作,Web程序接受的正常客户端请求一般来自用户的点击链接和表单提交等行为,可是恶意攻击者却可以依靠脚本和浏览器的安全缺陷来劫持客户端会话、伪造客户端请求。

0×01.CSRF攻击分类

CSRF是伪造客户端请求的一种攻击,CSRF的英文全称是Cross Site Request Forgery,字面上的意思是跨站点伪造请求。这种攻击方式是国外的安全人员于2000年提出,国内直到06年初才被关注,早期我们团队的剑心使用过CSRF攻击实现了DVBBS后台的SQL注射,同时网上也出现过动易后台管理员添加的CSRF漏洞等,08年CSRF攻击方式开始在BLOG、SNS等大型社区类网站的脚本蠕虫中使用。

CSRF的定义是强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为。CSRF漏洞的攻击一般分为站内和站外两种类型:

CSRF站内类型的漏洞在一定程度上是由于程序员滥用$_REQUEST类变量造成的,一些敏感的操作本来是要求用户从表单提交发起POST请求传参给程序,但是由于使用了$_REQUEST等变量,程序也接收GET请求传参,这样就给攻击者使用CSRF攻击创造了条件,一般攻击者只要把预测好的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起请求。

CSRF站外类型的漏洞其实就是传统意义上的外部提交数据问题,一般程序员会考虑给一些留言评论等的表单加上水印以防止SPAM问题,但是为了用户的体验性,一些操作可能没有做任何限制,所以攻击者可以先预测好请求的参数,在站外的Web页面里编写javascript脚本伪造文件请求或和自动提交的表单来实现GET、POST请求,用户在会话状态下点击链接访问站外的Web页面,客户端就被强迫发起请求。

0×02.浏览器的安全缺陷

现在的Web应用程序几乎都是使用Cookie来识别用户身份以及保存会话状态,但是所有的浏览器在最初加入Cookie功能时并没有考虑安全因素,从WEB页面产生的文件请求都会带上COOKIE,如下图所示,Web页面中的一个正常的图片所产生的请求也会带上COOKIE:

<img src=”http://website/logo.jpg”>



GET http://website.com/log.jpg
Cookie: session_id
客户端 ——————————————————-服务器

浏览器的这种安全缺陷给CSRF漏洞的攻击创造了最基本的条件,因为Web页面中的任意文件请求都会带上COOKIE,所以我们将文件地址替换为一个链接的话,用户访问Web页面就相当于会话状态下自动点击了链接,而且带有SRC属性具有文件请求的HTML标签,如图片、FLASH、音乐等相关的应用都会产生伪造GET请求的CSRF安全问题。一个web应用程序可能会因为最基本的渲染页面的HTML标签应用,而导致程序里所有的GET类型传参都不可靠。

0×03.浏览器的会话安全特性

参照Set-Cookie的标准格式,现今浏览器支持的cookie实际上分为两种形式:

Set-Cookie: <name>=<value>[; <name>=<value>] [; expires=<date>][; domain=<domain_name>] [; path=<some_path>][; secure][; HttpOnly]

一种是内存COOKIE,在没有设定COOKIE值的expires参数,也就是没有设置COOKIE的失效时间情况下,这个COOKIE在关闭浏览器后将失效,并且不会保存在本地。另外一种是本地保存COOKIE,也就是设置了expires参数,COOKIE的值指定了失效时间,那么这个COOKIE会保存在本地,关闭浏览器后再访问网站,在COOKIE有效时间内所有的请求都会带上这个本地保存COOKIE。

Internet Explorer有一个隐私报告功能,其实这是一个安全功能,它会阻挡所有的第三方COOKIE,比如A域Web页面嵌入了B域的文件,客户端浏览器访问了A域的Web页面后对B域所发起的文件请求所带上的COOKIE会被IE拦截。除开文件请求情况,A域的Web页面如果使用IFRAME帧包含B域的Web页面,访问A域的Web页面后,B域的Web页面里的所有请求包括文件请求带上的COOKIE同样会被IE拦截。不过Internet Explorer的这个安全功能有两个特性,一是不会拦截内存COOKIE,二是在网站设置了P3P头的情况下,会允许跨域访问COOKIE,隐私报告功能就不会起作用了。

所以在Internet Explorer的这个安全特性的前提下,攻击者要进行站外的CSRF攻击使用文件请求来伪造GET请求的话,受害者必须在使用内存COOKIE也就是没有保存登陆的会话状态下才可能成功。而Firefox浏览器并没有考虑使用这样的功能,站外的CSRF攻击完全没有限制。

0×04.关于Javascript劫持技术

近年来的web程序频繁使用Ajax技术,JSON也开始取代XML做为AJAX的数据传输格式,JSON实际上就是一段javascript,大部分都是定义的数组格式。fortify公司的三位安全人员在2007年提出了Javascript劫持技术,这是一种针对JSON动态数据的攻击方式,实际上这也是一种变相的CSRF攻击。攻击者从站外调用一个script标签包含站内的一个JSON动态数据接口,因为<script src=”>这种脚本标签的文件请求会带上COOKIE,用户访问后相当于被迫从站外发起了一个带有身份认证COOKIE的GET请求,web程序马上返回了用户相关的JSON数据,攻击者就可以取得这些关键的JSON数据加以利用,整个过程相当于一个站外类型的CSRF攻击。

WEB应用中的JSON数据大部分使用在个人资料、好友列表等隐私功能里,这类数据一般是web蠕虫最重要的传播功能所需要的数据,而CSRF攻击结合Javascript劫持技术完全可以分析这类数据制作自动传播的web蠕虫,在一定情况下这种web蠕虫比网站出现跨站脚本漏洞制作的web蠕虫更具威胁性,几乎不受网站架构的限制,因为攻击者利用的不是传统的Web漏洞而是网站自身正常的功能,如果出现这类CSRF蠕虫,对网站的打击将是灾难性的。

0×05.安全提醒

各个大型社区类网站必须警惕CSRF攻击和相关web蠕虫的爆发,并且针对这类web攻击制定有效的应急措施。同建议程序员不要滥用$_REQUEST类变量,在必要的情况下给某些敏感的操作加上水印,考虑使用类似DISCUZ论坛的formhash技术提高黑客预测请求参数的难度,注意JSON数据接口的安全问题等。最后希望大家全面的考虑客户端和服务端整体的安全,注意Internet Explorer等客户端浏览器一些安全缺陷和安全特性,防止客户端程序的安全问题影响整个Web应用程序。

参考:

http://blog.csdn.net/lake2/archive/2008/04/02/2245754.aspx
http://www.cgisecurity.com/articles/csrf-faq.shtml
http://www.playhack.net/view.php?id=31
http://www.fortify.com/servlet/downloads/user/JavaScript_Hijacking.pdf
http://www.w3.org/P3P/

CSRF攻击原理解析:http://www.80sec.com/csrf-securit.html
分享到:
评论

相关推荐

    SpringSecurity的防Csrf攻击实现代码解析

    Csrf 攻击原理: 1. 攻击者构造恶意的 HTML 表单,例如:&lt;form action="http://example.com/transfer" method="post"&gt;&lt;input type="hidden" name="amount" value="1000"/&gt; 2. 用户在不知情的情况下,点击该表单,...

    第一节 CSRF原理介绍-01

    CSRF漏洞原理介绍 在Web应用安全中,CSRF(Cross-site request forgery,跨站请求伪造)是一种常见的攻击方式。它通过伪装成受信任用户请求受信任的网站,执行某些非法操作。以下是CSRF漏洞的详细介绍。 CSRF漏洞...

    CSRF跨站请求伪造CSRF PHP demo代码

    总之,理解CSRF攻击的原理和防范措施是每个Web开发者的必备知识。这个PHP demo提供了一个实践的例子,展示了如何在实际应用中实现CSRF令牌,以及如何在表单设计和处理中考虑安全。通过学习和分析这个demo,我们可以...

    挖掘CSRF之道

    #### 二、CSRF攻击常见场景分析 1. **关注功能** - 在社交网络应用中,如果“关注”某人这个操作未经过充分的安全验证,攻击者可能通过CSRF手段迫使用户关注特定账号。 - **防御策略**:实现双重验证机制,比如在...

    CSRF demo代码

    通过分析和学习这个代码,你可以深入理解CSRF攻击的工作原理以及如何在实际应用中进行有效的防护。如果你打算使用或分析这个代码,确保在安全的环境中进行,以防止对真实系统造成潜在风险。同时,时刻保持代码库和...

    Python Django框架防御CSRF攻击的方法分析

    首先,我们需要了解Django防御CSRF攻击的基本原理: 1. **生成CSRF令牌**:当Django渲染HTML模板时,它会在每个需要防护的POST表单中添加一个名为`&lt;input type="hidden" name="csrfmiddlewaretoken" value="..." /&gt;...

    hucart-含有CSRF漏洞的源码.zip

    通过分析和修复hucart的CSRF漏洞,开发者可以深入理解CSRF攻击的机制,提升Web应用的安全性。同时,也可以了解如何在实际项目中运用上述防范策略,以保护用户的数据安全。 总之,理解和掌握CSRF漏洞对于任何Web...

    检查CSRF.docx

    1. **CSRF攻击原理**: - 当应用程序完全依赖HTTP Cookie来传递会话令牌时,攻击者可以通过构造恶意链接或表单,让用户在点击或访问时无意中触发敏感操作。 - 用户在登录状态下访问含有恶意代码的网页,浏览器会...

    详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击

    **四、CSRF攻击原理及防御措施** CSRF攻击依赖于用户已登录的状态和浏览器自动发送的Cookie。攻击者可能会在用户不知情的情况下,构造携带用户Cookie的恶意请求。为了防止这种情况,Django的CSRF中间件会在每个请求...

    django框架CSRF防护原理与用法分析

    ### Django框架CSRF防护原理与用法分析 #### 一、什么是CSRF? **CSRF**(Cross-site request forgery,跨站请求伪造)是一种常见的安全攻击手段,它利用已认证用户的浏览器来发起针对Web应用程序的恶意操作。这种...

    CSRF攻击与防御,Web安全的第一防线

    二、CSRF攻击的原理及过程 1. 用户登录受信任网站A并获取Cookie。 2. 用户未退出A,在同一浏览器中访问恶意网站B。 3. B站点向A站点发送含有用户Cookie的请求。 4. A站点接收请求,认为是用户C的合法操作,执行相应...

    web大作业.docx

    CSRF 攻击与防御的基本研究摘要 CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的 web 安全漏洞,通过欺骗服务器执行未经授权的操作,危害到用户的安全。鉴于 CSRF 漏洞的严重性和普遍性,本文将对 ...

    CSRF漏洞的靶场实验

    首先,我们需要了解CSRF攻击的基本原理。当用户访问一个网站并登录后,浏览器会保存一个叫做会话(Session)的状态,使得用户在后续的请求中无需再次验证身份。攻击者利用这一点,构建一个恶意的页面或邮件,其中...

    83.WHUCTF之CSS注入、越权、csrf-token窃取及XSS总结_杨秀璋的专栏-CSDN博客1

    本文作者通过对WHUCTF比赛中的实际题目进行分析,详细讲解了上述四种攻击技术的原理和利用方法。强调了理解这些攻击手段的重要性,以便于进行有效的防御。同时,作者还分享了自己的学习资源和经验,鼓励读者一起探索...

    Django CSRF跨站请求伪造防护过程解析

    攻击原理 1、用户访问正常的网站A,浏览器就会保存网站A的cookies。 2、用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数。 3、恶意网站B的自动化请求,执行...

    csrf-in-action:演示CSRF的示例应用

    1. CSRF攻击原理: CSRF攻击通常发生在用户已经登录了某个网站,攻击者通过构造恶意请求,诱使用户在不知情的情况下执行,比如修改密码、转账等。由于用户当前浏览器已经持有该网站的有效会话(Cookie),因此恶意...

Global site tag (gtag.js) - Google Analytics