CSRF:跨站请求伪造(Cross-site request forgery)
攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作,由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。
本质是利用受害者未失效的身份认证信息,诱骗其点击恶意链接或者包含攻击代码的页面,从而完成非法操作。
即: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。
从信任的角度来区分
xss: 利用用户对站点的信任
crsf: 利用站点对已经身份认证的信任
LOW:
直接在修改密码的url上进行修改
攻击手段太拙劣,结果太明显
用户可以直接看出攻击者的攻击用途
在真正攻击场景下,我们需要对链接做一些处理。
例如可以使用短链接来隐藏URL
或者
编写一个伪造的http页面
访问时只会出现一个显示404 not found的页
测试修改后的密码是否可以登录
当受害者访问伪造的html时,会误认为是自己点击的是一个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改
源码:
服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制
ps:可以使用BP的CSRF的插件
MED:
尝试使用LOW的方法,修改后的Url重新访问
显示that request didn't look correct
BP抓包
发现多了一个referer字段
我们在自己修改的包中加入referer字段,包含127.0.0.1的值,然后重新发送请求
显示密码修改成功
只要是referer字段包含了目标主机地址就可以绕过,所以我们可以将构造的文件名称起为:X.X.X.html
再将其部署到攻击者的服务器上,然后诱导受害者点击即可。
源码:
比起LOW等级增加了
此句是判断HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(
http包头的Host参数,及要访问的主机名)的部分
stripos函数是规定对比要查找的字符和要搜索的字符段,如果有则返回字符串在另一字符串第一次出现的位置,如果没有则返回FALSE
High:
增加了检查 Anti-CSRF Token的部分
用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
抓包获取用户的token
请求里面包括了token值,这里发出的token一般是在上次请求时返回的报文中,这次请求返回的报文中查找token,可以查到
修改url,后面增加token部分,重新发送请求,可以达到修改密码的目的
这样做好像丝毫没有意义,都是在本地实现抓包,正常的攻击思路应该是攻击者伪造请求然后放在被攻击者的服务器,引诱用户去进行点击,然后获取用户的cookie去修改页面获取关键的token。
但是这样还存在一个问题,就是跨域问题,即
浏览器为安全性设置的同源策略,同源是指域名,协议,端口相同。三者中有任意一个不相同,都不可以进行通讯。
我们要访问的目标服务器的站点和我们主机所处不在一个服务器,两者域名不同,所以主机所处服务器的任意一个站点都不可以主动获取目标服务器的页面信息。
这种情况下,我们要将攻击代码注入到目标服务器中,才有可能完成攻击。利用存储型XSS和CSRF结合,可以通过ajax实现跨域请求来获取用户token达到攻击的目的。
通过修改textname的值然后插入
<·iframe src="…/csrf"οnlοad=alert(frames[0].document.getElementsByName(‘user_token’)[0].value)>
获取用户token
impossibe:
impossible级别修改密码需要输入之前的密码,黑客无法知道用户之前的密码,所以无法进行CSRF攻击。