好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

浅谈CSRF原理 - 网站安全 - 自学php

今年来根据乌云站点的资料,XSS漏洞在WEB前端的比额已经非常明显,而CSRF的危害又有多少人关心呢?

最近也在看 XSS 的相关资料,但是看到 CSRF 的时候还是忍不住好好的看了一下有关资料,发现 CSRF 其实一样很有影响力。我要写的就是一点读后感 别的没什么哈  轻喷吧 ..

CSRF 全称为: Cross Site Request Forgery  英语没过四级的也应该能看懂点吧 就是跨站请求伪造。对了,这里说一下, CSRF 也有 XSRF 这样的格式,所以认清他们哦。

其实他和 XSS 有本质上的区别,我以前总把他们两个搞混淆,所以有的时候学习 XSS 和 CSRF 经常会把知识点搞乱,其实这是没有从根本上理解他们的原因。

XSS 和 CSRF 的区别:

XSS 是跨站脚本,而他最主要的还是脚本两个字,[跨]是浏览器的特性,而脚本才是 XSS 能够造成危害的核心。

CSRF :是跨站请求伪造,很明显根据刚刚的解释,他的核心也就是请求伪造,通过伪造身份提交 POST 和 GET 请求来进行跨域的攻击。

这样说应该能够很好的区分了吧。

还是继续我们的 CSRF 吧。

当时看书的时候就在想,他是怎么跨站伪造身份进行请求的并且浏览器居然还会认为是正常的请求呢?

这里必须补充一个姿势: 同源策略的限制:是指浏览器会阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的  URL  的域必须与当前  Web  页面的域相同。这意味着 浏览器会主动隔离来自不同源的内容,以防止它们之间的操作。这个浏览器策略很旧,从  Netscape Navigator 2.0  版本开始就存在 。

XSS 发起的攻击是在存在漏洞网站的同域内进行的,所以不受同源策略的限制,但是 CSRF 是跨站点请求,怎么实现呢?

还记的同源策略限制的是什么么? 嗯 加载脚本。而我们的 CSRF 最大的特点恰恰就是不用加载脚本,所以他不受同源策略的限制。但是,必须保证,在跨站点发出请求时,我们的身份是被认证后的,也就是我们的 COOKIES 是合法的。

而且客户端 HTML 标签发出的跨域 GET 请求会被认为是合法的,类似一些网页游戏都会用到。

给大家看下我自己根据攻击原理做的图 比较粗糙 凑活看哈

 

然后我们看下我伪造的一个发出请求的数据:

这个是跨站请求的数据( CSRF 的请求) :

Referer:  http://HdhCmsTestFK_lccl测试数据/CSRF.htm

Accept-Language: zh-cn

Proxy-Connection: Keep-Alive

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)

Host: HdhCmsTestf4ck.net

 

这个是目标网站自己发出的请求:目的是给我加 1000JB   哈哈

Accept-Language: zh-cn

Proxy-Connection: Keep-Alive

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)

Host: HdhCmsTestf4ck.net

这个是正常情况下发出的请求,可以看到除了 Referer 的请求来源不同外,其他的都一样。

重点是 COOKIES 必须一样。因为这个是目标网站认证身份的标识。上面说到只有身份认证后, CSRF 攻击才能得以施展。

书上这里补充了一个关键的姿势:

COOKIES 分本地 COOKIES 和内存 COOKIES 两种,这两类在 CSRF 中存在一些差异。 IE 浏览器默认不允许目标网站 A 的本地 COOKIE 在这样的跨域请求中带上,除非在 HTTP 响应头中设置了 P3P ,这个响应头允许我们的网站带着本地 COOKIES 发出请求,所以这才是关键。同样的 POST 表单我们也可以伪造请求,从而达到我们的目的。

简单的说,完成 CSRF 需要两个步骤:

1.登陆受信任的网站 A ,在本地生成 COOKIE

2.在不登出 A 的情况下,或者本地 COOKIE 没有过期的情况下,访问危险网站 B 。

 

下面看下能够利用 CSRF 的几个要点:

1.网站违反了 HTTP 规范,使用 GET 请求更新资源 。

2.如果网站的过滤方式用这个$_REQUEST 变量,$_REQUEST 既可以获取 GET 请求的数据,也可以获取 POST 请求的数据,这就造成了在后台处理程序无法区分这到底是 GET 请求的数据还是 POST 请求的数据。在 PHP 中,可以使用 $_GET 和 $_POST 分别获取 GET 请求和 POST 请求的数据。在 JAVA 中,用于获取请求数据 request 一样存在不能区分 GET 请求数据和 POST 数据的问题

3.$_POST用这个变量只获取 POST 请求的数据 。我们可以隐藏一个POST 进行突破

<body onload=]steal()]>

<iframe name=]steal] display=]none]>

<form method=]POST] name=]transfer]   action=] http://HdhCmsTestf4ck.net/addJB.php]>

<input type=]hidden] name=] id] value=]FK_lccl]>

<input type=]hidden] name=]JB] value=]1000″>

理解上面的 3 种攻击模式,其实可以看出, CSRF 攻击时源于 WEB 的隐式身份验证机制, web 的身份验证机制虽然可以保证一个请求来自于某个用户的浏览器,但却不无法保证该用户的请求是用户批准发送的。 从而产生 CSRF 的利用。

在网上看资料的时候看到了一篇利用 CSRF 破解 WPA 密码,给大家看下吧:

他利用的是一般路由器在内网中缺少身份验证通过认证绕过 漏洞 或者默认登录,攻击者可以修改 路由器 的任何设置。 这是链接地址:http://HdhCmsTest2cto测试数据/Article/201302/190967. html  我觉得值得大家思考一下。

查看更多关于浅谈CSRF原理 - 网站安全 - 自学php的详细内容...

  阅读:48次