CSRF
什么是CSRF?
CSRF被称为跨站请求伪造,它利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义完成非法操作。
跟跨站脚本攻击(XSS)相比,XSS利用的是用户对指定网站的信任,
跨站请求伪造(CSRF)利用的是网站对用户(网页浏览器)的信任。
原理
上图中网站 A为存在CSRF漏洞的网站,网站B为攻击者构建的恶意网站,User 为网站A网站的合法用户。CSRF攻击攻击原理及过程如下:
1、 用户user打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A
2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A
3、用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B
4、网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A
5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
6、这就是网站B,在用户C不知情的情况下,伪造成A网站受信任的用户C去操作一些事情,但是A网站不知道操作这些事情的C是不是本人在操作。即利用了网站对用户浏览器的信任。
简单的来说,如果要利用CSRF攻击。
需要满足两个条件:
(1)受害者登录信任的网站A,并且生成cookie。
(2)在登录状态下,且cookie有效下访问攻击者网站B。
特点及危害
CSRF的特点
- 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
- 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
- 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。
- CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。
CSRF的危害
- 发送邮件
- 修改账户信息
- 资金转账
- 盗取用户隐私数据
- 网站被上传网马
- 作为其他攻击方式的辅助攻击(比如xss)
- 传播CSRF蠕虫(见下文中的YouTube CSRF漏洞)
- 等等
防护
1、同源检测
也就是我们常说的referer。
通过referer检测该请求是否为同一个IP来的。
但是这种方法很容易被绕过或者伪造。
2、使用随机token
CSRF的一个特征是,攻击者无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息。
而CSRF攻击之所以能够成功,是因为服务器误把攻击者发送的请求当成了用户自己的请求。那么我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。
攻击分类
Get型
这种类型的CSRF一般是由于程序员安全意识不强造成的。GET类型的CSRF利用非常简单,只需要一个HTTP请求,所以,一般会这样利用:
<img src=http://example.cn/csrf.php?xx=11 />
在访问含有这个img的页面后,浏览器会自动向
http://example.cn/csrf.php?xx=11
发出一次HTTP请求。example.cn就会收到包含受害者登录信息的一次跨域请求。所以,如果将该网址替换为存在GET型CSRF的地址,就能完成攻击了。
Post型
这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单,如:
<form action=http://example.cn/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>
访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。
POST类型的攻击通常比GET要求更加严格一点,但仍并不复杂。任何个人网站、博客,被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许POST上面。
链接类型
链接类型的CSRF并不常见,比起其他两种用户打开页面就中招的情况,这种需要用户点击链接才会触发。这种类型通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击,例如:
<a href=" http://example.cn/csrf.php?xx=11" taget="_hacker">
百万福利,点击就送!!
<a/>
由于之前用户登录了信任的网站A,并且保存登录状态,只要用户主动访问上面的这个PHP页面,则表示攻击成功。
CSRF探测
利用burp suite,通过抓取数据包,修改相应表单信息,重新提交,伪造客户端请求,请求成功则说明存在csrf漏洞。
1、 配置浏览器代理。Burp的默认代理是127.0.0.1:8080
2、 抓取有可能存在csrf的页面(个人中心信息修改等等),右击选中的链接,选择Engagement tools—->Generate CSRF POC选项
3、 在弹出的CSRF Poc generater页面,点击”Test in browser—>Copy”,复制生成的URL,打开刚才访问过目标网站的浏览器(注意不能关闭原来登录网站的页面,此时也不能关闭代理),新建一个页面,粘贴刚才复制的URL,访问.
或者
把HTML写到自己服务器的phpstudy环境下,然后命名index.php,然后去访问自己的服务器ip地址,看看个人中心的信息是否被修改。
4、如果信息被修改,那么就存在csrf漏洞。但是这个HTML表单有一个不好的地方就是,需要点击一下。我们可以修改代码,让其不需要点击,即可直接访问我们的服务器。
ps:测试csrf漏洞要在个人中心或者能够修改,增加的地方测试,如果没有修改的地方,那么就算存在csrf漏洞也是不行的。
参考文章
https://www.kancloud.cn/buxiaju/wangluoshentoujichu/2068695
一位不知名大佬在看云写的文章。
文章中还有一些POC利用,绕过没有参考,后续再学习。