CSRF

1.漏洞简介

    CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。

2.原理

    CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

3.检测

    通常手工检测一般 先抓一个正常请求的数据包,使用burpsuite发送到中继后去掉Referer 字段后 发送数据包,如果提交有效,一般会有CSRF存在。我们也可以使用burp生成 csrf poc ,把poc带啊吗放在自己的云服务器上,使用已登录的用户访问进行验证。当然,我们也可以使用一些CSRF检测工具辅助我们检测该漏洞。常用的有CSRFTester,CSRF Request Builder这些。当然,还需要我们手工检测。

4.防御

4.1验证http referrer 

    在HTTP协议中,referer字段记录了HTTP请求的来源,可以以此来判断来源地址是不是站内地址。

防御的重点是:前端JS无法修改referer字段

  绕过方法:

    (1)Referrer中包含关键字就通过。

      我们可以 domain.com.hacksite.com、hacksite.com.domain.com

    (2)Referer为空允许通过

      Data协议、https跳转到http

4.2Token 

    CSRF攻击根本在于伪造用户的请求,二请求的所有的用于验证信息都在cookie中,攻击者可以在不知道受害者信息,而直接利用受害者cookie去通过安全验证。我们需要让服务器随机生成token发给客户端,客户端请求时带上token,服务器验证token的合法性。

防御重点是:由于同源策略的限制,攻击者无法使用JS获取其他域的token。

绕过方法:

    同域下存在xss漏洞时,使用js读取页面中的token,然后可以构造 csrf poc 达到csrf 攻击的目的。某运维平台验证码处存在xss,然后可以通过csrf 搞事,哈哈。

4.3在HTTP头自定义属性并验证

    自定义属性的方法也是使用token并进行验证,把token放到HTTP头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这样解决了前一种方法在请求中加入token的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,也不用担心token会通过Referer泄露到其他网站。

4.4 其他

    在执行关键操作时(如修改密码,修改绑定邮箱手机等),除了要做CSRF的token防护之外,还应该要求重新输入当前账号密码,并加入验证码。

    关键操作只接受post请求,只接受https请求

5.新姿势

5.1JSON CSRF

    以json格式传输数据,没有添加token,无referer限制。应用服务器程序会验证Content-type 是否为application/json

    我们还可以使用新姿势:

      制作flash文件

      制作一个跨域XML 文件

      制作一个具有307状态码的PHP文件

原理: flash的header存在一个黑名单,黑名单中的header不允许设置,如referer ,但是Content-Tyep 不再黑名单中(不过在新的谷歌浏览器已经不行了..)。

5.2JSONP 接口劫持

    用户登陆后,通过JSONP的方式获取数据,如JSONP接口未作防护(如没有验证referer头),就会造成JSONP劫持攻击,被定向钓鱼。

6.Burp suite 生成CSRF PoC

参考

https://www.cnblogs.com/blacksunny/p/7940287.html

http://blog.knownsec.com/2015/03/jsonp_security_technic/

未来工作

强迫症,需要配图才行。

最新CSRF JSON 实战,当然是defcon走一波,哈哈

原文地址:https://www.cnblogs.com/Rightsec/p/10317658.html