一、CSRF漏洞原理
CSFRF简介
Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"onclick"攻击。
CSRF攻击方式并不为大家所熟知,实际上很多网站都存在CSRF的安全漏洞。早在2000年,CSRF这种攻击方式已经由国外的安全人员提出,但在国内,直到2006年才开始被关注。2008年,国内外多个大型社区和交互网站先后爆出CSRF漏洞,如:百度HI、NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站)和YouTube等。但直到现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑。
CSRF攻击原理及实例
当我们打开网站或者登陆某个网站后,就会产生一个会话(这里指用户登陆后),这个会话可能是SESSION,Cookie控制,但是这是无关紧要的。唯一的重点是浏览器与服务器之间是在==会话之中==,在这个==会话没有结束==时候,你可以利用你的权限对网站进行操作,如进行发表文章,发邮件,删除文章等操作。当这个会话结束后,你在进行某些操作时候Web应用程序通常会来提醒你,您的会话已过期,或者是请重新登陆等提示。
比如
用户登录了银行网站A,在没有退出登录的情况下访问了恶意网站B。网站B中有一段隐藏的代码,会向银行网站A发送一个转账请求。由于用户在银行网站A还是登录状态,银行网站A收到请求后,可能会以为是用户自己发起的转账操作,就会执行这个请求。
攻击者利用这个漏洞,在用户不知情的情况下,让用户的浏览器发送恶意请求,来执行一些有害操作,像修改密码、删除数据、进行转账等操作。为防止这种漏洞,网站通常会采用添加验证码、验证请求来源的Referer字段、使用CSRF令牌等安全措施。
又比如
你想给用户spisec转账1000元,那么点击提交按钮之后,可能会发送以下请求:
http://www.taobao.com/pay.jsp?user=spisec&money=1000
而攻击者仅仅是改变一下user参数与money参数即可完成一次“合法”的攻击,如:
http://www.taobao.com/pay.jsp?user=hack&money=10000
当你访问了这条URL之后,就会自动向hack这个账户里面转入10000元。而这是你亲手造成的,并没因为有人去破解你的密码或者是Web服务器被入侵所导致的你的金钱丢失。下面以CSRF攻击原理图给大家形象总结:

二、CSRF攻击分类
CSRF漏洞一般分为站外和站内两种类型。
站外
CSRF站外类型的漏洞本质上就是传统意义上的外部提交数据问题。通常程序员会考虑给一些留言或者评论的表单加上水印以防止SPAM问题(这里,SPAM可以简单的理解为垃圾留言、垃圾评论,或者是带有站外链接的恶意回复),但是有时为了提高用户的体验性,可能没有对一些操作做任何限制,所以攻击者可以事先预测并设置请求的参数,在站外的Web页面里编写脚本伪造文件请求,或者和自动提交的表单一起使用来实现GET、POST请求,当用户在会话状态下点击链接访问站外Web页面,客户端就被强迫发起请求。
站内
CSRF站内类型的漏洞在一定程度上是由于程序员滥用$ _ REQUEST等变量,程序除支持接收POST请求传递的参数外也支持接收GET请求传递的参数,这样就会为攻击者使用CSRF攻击创造条件。一般攻击者只要把预测的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起这些请求。
检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
站内实战GET形式
建议php版本在7.0以上
更改密码 mamba

更改密码抓包,查看get请求语句

构造语句
192.168.24.1//DVWA/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change
发给目标用户
成功更改密码

原来的密码登录不上

使用csrf漏洞成功更改密码

如果链接太过显眼,不想被别人一眼看出来,可以使用短网址工具
或者自己写一个网页
从登录网页在更改密码的表单复制下来

把 # 改成构造的语句

访问

点击直接跳转
成功更改

添加默认值,不要自己输入

点击跳转
还可以插入script标签,点击链接之后,过几秒直接跳转

站内实战POST形式
抓包

使用bp的csrf模块


复制链接
如果链接不行
可以直接将form表单复制下来,更改一些地方
在自己本地部署


另外一个链接
127.0.0.1/aacc/aaa.html


过滤了referer头,去掉之后,无法更改密码
因为校验请求从哪里发出来的

将文件名更改为域名

成功绕过