一、csrf是什么
csrf:cross-site-request-forgrey,跨站请求伪造。
我们伪造了一个跨站请求,让登录状态的用户点击,就会执行伪造的请求,因为是用户自己的点击,服务器会认为这是用户在做操作。
二、实施条件
1、用户愿意点击链接(如果对方服务器存在xss漏洞,写一个存储型xss,只要用户加载页面就会实施我们伪造的请求,不过既然都写存储型了,何必再用csrf)
2、用户打开链接的浏览器与他登录账户的浏览器是同一个(如果默认浏览器与登录浏览器不同,将无法跨浏览器实现获取到session)
3、用户没有实行严格的IP、Referer等校验(比如校验了Referer必须以"http://主机名"开始等)
4、用户点击链接时处于登录状态,但我们拿不到cookie(如果能拿到cookie就直接用伪造用户身份进行登录了)
5、能抓到对方修改信息的接口
三、怎么实施
容易露馅版:
1、伪造一个用户修改的url链接,并将我们想修改的参数放进去(基于get请求)
http://192.168.17.133/php/csrfdemo.php?password=123abc&repassword=123abc
2、最好将后边拼接的参数转码,否则不要太太太太明显
http://192.168.17.133/php/csrfdemo.php%3f%70%61%73%73%77%6f%72%64%3d%31%32%33%61%62%63%26%72%65%70%61%73%73%77%6f%72%64%3d%31%32%33%61%62%63
3、发给用户,至于如何让他点链接,这就涉及到社会工程学了……
基础版:
1、抓包到用户的修改界面,用burp工具,生成CSRF POC
2、复制代码到html文件中,修改value中的值,删去不需要的地方(这需要诱使用户进入链接后再点击才行,可以添加一点吸引人的素材)
或者写这样的钓鱼网站(只要点入链接就会执行修改)……
3、将该链接发给用户,当用户点击就会跳转到我们指定的页面,并执行伪造的命令(最好将html文件命名得迷惑一点,类似康帅傅这种迷惑度……)
4、用户密码被改成123456
有点Referer校验版:
1、用户设置了Referer校验:必须包含HOST(不那么严格,仅包含),直接修改文件名,使其包含HOST!(前提是浏览器版本不会去掉文件名!)
token版:
用户的每一个请求都会刷新token,因此为了获取新鲜可用的token,采用ajax或者引入jQuery进行异步提交,不刷新用户页面的情况下先获取token,再进行信息修改
1、(Windows中)写一个ajax的js文件,用外部引入js的形式,写进用户的服务器中
2、用外部引入js的形式,写进用户的服务器中(下面仅仅是举个例子,实际中要找用户服务器上我们可以进行输入的地方,比如服务器上的留言、发帖等可以被用户加载到的地方)
3、当用户访问到该存储信息时,会直接被修改密码
四、防御
1、不要在url中使用明文操作,抓包一抓一个准,敏感信息修改使用post请求
2、严格检查Referer头部信息,非本网站的请求拒绝;
3、做增删改之类的操作要进行二次校验,再次校验管理员密码
4、设置session过期时间,避免持续保持登录状态被利用
5、避免交叉漏洞(即使有token的情况下,利用xss漏洞仍然能够完成修改)