Csrf漏洞
一,漏洞简介:
身份嫁接,伪造。攻击者通过一些手段欺骗用户的浏览器去访问一个受害者之前登录过的网站并进行一些操作。因为之前在浏览器认证过,所以网站会认为是受害者在操作而去运行。但同时也造成了受害者必须在登录受信任网站的前提下才能进行利用。
二,运行逻辑:
1、客户端通过账户密码登录访问网站 A。
2、网站 A 验证客户端的账号密码,成功则生成一个 sessionlD,并返回给客户端存储在浏览器中。
3、该客户端 Tab—个新页面访问了网站 B。
4、网站 B 自动触发要求该客户端访问网站 A。(即在网站 B 中有链接指向网站 A)。
5、客户端通过网站 B 中的链接访问网站 A。(此时携带有合法的 SessionID 进行访问站 A 的)。
6、此时网站 A 只需检验 sessionIlD 是否合法,合法则执行相应的操作。(因此具体啥工具就得看链接,以及网站 B 要求访问时携带的数据。
三,利用条件
1、登录受信任网站 A,并在本地生成 Cookie。
2、在不登出受信任网站 A 的情况下,访问危险网站 B。
3、需要请求伪造数据包。
4、无过滤防护。
这就造成了他的使用条件较为苛刻。
四,防护手段。
- referer
HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,在 通 常 情 况 下 , Referer 字 段 应 和 请 求 的 地 址 位 于 同 一 域 名 下比 如 需 要 访 问http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先
登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就
会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。
2,stripos() 函数
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
代码检查了保留变量 HTTP_REFERER (http 包头部的 Referer 字段的值,表示来源地址)是否包含 SERVER_NAME(http 包头部的 Host 字段表示要访问的主机名)。
所以核心思路就是将 referer 的数据和 host 一致即可。
但是有缺陷:
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写),也就是只要这个referer 里面包含 host 的内容就可以绕过,所以我们是不是可以把攻击者的网站路径改一下,改成包含host 的内容,我们是攻击者,所以我们能够做到这一步Host 是 127.0.0.1,那么我们把 referer 改成含有 127.0.0.1 的内容,怎么改?将恶意代码文件放到
一个叫 http://127.0.0.1 文件名里面即可,但是又有问题,问题就是 linux 不能创建含有特殊字符的文件名,得配合文件上传了,我把这个恶意的代码文件上传到你自己的服务器,然后让你去访问你自己的地址那么这个 host 和 referer 就对上了。
3,token检测
每次访问都会产生一个新的 token,这个 token 攻击者拿不到,拿不到就不能构造出有效的请求包,就算拿到了,token 在每次对话结束后,都会变化,攻击者无法预测新变化的 token 是什么。