小萌羽w

初入了解CSRF跨站请求伪造
CSRF(Cross-site Request Forgery)是指跨站点请求伪造,也就是跨站漏洞攻击,通常用来指...
扫描右侧二维码阅读全文
21
2019/06

初入了解CSRF跨站请求伪造

CSRF(Cross-site Request Forgery)是指跨站点请求伪造,也就是跨站漏洞攻击,通常用来指 WEB 网站的这一类漏洞,即在某个恶意站点的页面上,促使访问者请求你的网站的某个URL(通常会用 POST 数据方式),从而达到改变服务器端数据的目的。这种攻击方式是国外的安全人员于2000年提出,国内直到06年初才被关注,网上也出现过动易后台管理员添加的CSRF漏洞等,08年CSRF攻击方式开始在BLOG、SNS等大型社区类网站的脚本蠕虫中使用

头图地址:PERFUME(´∀`)-repi★(レピ)

CSRF原理

CSRF攻击.jpg

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成cookie;
2.在不登出A的情况下,访问危险网站B。

虽然只要不满足以上两个条件中的一个,就不会受到CSRF的攻击,但无法保证以下情况不会发生:
受害者不能保证其登录了一个网站后,不再打开一个tab页面并访问另外的网站。
受害者不能保证其关闭浏览器了后,其本地的cookie立刻过期,上次的会话已经结束。(事实上,

关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。CSRF的定义是强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为。

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

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

CSRF简单的实现演示

在学校提供的平台下有了实验环境极大的方便了一些漏洞的复现

首先打开平台提供的实验环境(win7虚拟机)
启动xampp开启apache和mysql服务。

xampp.jpg

访问已经安装好了的DVWA的环境

dvwa.jpg

登陆账户为:admin 密码:password

之后就进入了DVWA的界面了,可以看到给出了很多的功能模块用来测试漏洞等。

dvwa1.jpg

之后我们选择进入DVWA的安全设置将PHP的安全等级设置为low级别

dvwa2.jpg

再进入CSRF导航页面,并点击右下角查看PHP源代码

dvwa3.jpg

php.jpg

在这里我们查看到PHP源代码是利用GET的方法获得参数,之后用函数提交到数据库上并用md5加密。
因为这段代码没做任何额外的操作并且是以GET方法提交,这样会使信息暴露在url上,攻击者则可以利用获得到的合法cookie并构造url传参从而使得用户密码被串改。

我们单机下更改密码按钮可以看见,以get形式显示在url上:

http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=&password_conf=&Change=Change

url.jpg

这时候我们因为保持着用户和服务器之间的会话cookie不变由浏览器保存,在打开新的标签页面后构造一段更改密码的传参

http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change
回车后即可发现

csrf.jpg

新页面显示了密码已更改,我们注销账户后在进行登陆会发现密码已更改用更改后的123密码即可访问原密码就失效了

CSRF防范

1.验证 HTTP Referer 字段

HTTP头中的Referer字段记录了该 HTTP
请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,而如果黑客要对其实施 CSRF
攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证Referer值来防御CSRF 攻击。

2.使用验证码

3.在请求地址中添加token并验证

CSRF攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie
来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP
请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有token或者 token
内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。这种方法要比检查 Referer 要安全一些,token
可以在用户登陆后产生并放于session之中,然后在每次请求时把token 从 session 中拿出,与请求中的 token
进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。

4.、在HTTP 头中自定义属性并验证

这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到
HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP
头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest
请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

总结

CSRF攻击也是现在攻击常见的一种方式,在我们平时上网时候经常登录账户不注意注销会话时候就容易被别人利用(前提是你登录的网站有CSRF漏洞),只要良好的规范代码以及上网习惯就可避免此类风险,当然除了GET方法还有POST方法等等原理一样方式不一样而已,有兴趣的可以自己在深入研究下,这里只是科普

本文参考了学校平台给出的实验做出科普
在防范上参考了文章:CSRF 攻击是什么?如何防范?
毕竟也不是什么大佬写出来的感觉也没别人好,不如借用前辈总结好的用于学习.jpg

Last modification:June 21st, 2019 at 07:45 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment