什么是crsf
CSRF (Cross-site request forgery,跨站请求伪造)也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。
简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以站点会觉得这是真正的用户操作而去运行。
基本流程:用户在某网站A进行登录-------->身份验证成功,返回cookie给用户---------->攻击者构建一个网站F,诱使用户使用同一浏览器进入(前提:未退出网站A,一般都会有默认浏览器)------------->网站F收到用户请求后,返回恶意代码给用户,强制他访问网站A---------->用户浏览器在网站A上执行相关操作(以已经持有的cookie)。
dvwa中crsf的具体操作
low级别
攻击者:1337
受害者:admin
1.首先我们登录1337的账户,登录找到csrf,输入更改的密码123。
2.然后抓包,在action找到engagement tools,点击Generate csrf Poc。
3. 点击copy html。
4.创建恶意网站。在phpstudy中创建网站,将刚刚复制的html,粘贴进去。
5.打开网站发现URL太长太奇怪了,需要缩短。我们用百度进行缩网址。
6.登录admin账户,点击刚刚创建的恶意网站。
7.这样admin密码就被改了,但是受害者知道密码被改了,此刻退出去使用之前的密码,已经登录不上了。
medium级别
1.首先我们像low级别一样操作,这是报错说请求不正确。
2.我先后抓了一个报错和一个修改成功地包,发现多了一个referer的请求头。
3.于是我自己加了一个referer的请求头,发现可以了,但是受害者不可能自己加一个referer。
想知道有什么好方法可以绕过referer呢?
最后分析一下medium的源代码
中等级别的代码增加了 referer 判断:
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )
如果原网站和恶意网站不是来自同一个域的话就无法进行到循环内部,执行修改密码的操作。这个时候需要我们手动伪造 referer 来执行 CSRF 攻击。
high级别
可以发现High加入了token机制,用户每次访问改密页面时,服务器都会返回一个随机的token,当浏览器向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
1.话不多说先抓包,抓取token的值。
2.将包发到Repeater。send跑一下。发现第一次没问题,但在第二次发现302(临时重定向),可以简单的理解为该资源原本确实存在,但已经被临时改变了位置。
此时有俩方法:
1.BP抓Cookie
2.BP的插件
BP抓Cookie
我们先抓low的包,将其cookie替换到high的数据包,只有security的参数不同。发现密码更改成功了。
BP的插件
我们还可以用bp的插件CSRF Token Tracker绕过token验证。
在CSRF Token Tracker写入主机名,token字段,值。
Send跑一下,虽然token的值没有发生变化但是看CSRF Token Tracker里面的token值已经随机生成了,发现密码修改成功。