CSRF

同源策略

协议、域名、端口这些是相同的

漏洞简介

这个就可以为攻击者使用受害者的已经认证了的页面去访问,也就是这样就可以做到登录受害者的账号

这个根源是使用相同的cookie也就是,用户的cookie,这个cookie用于保存用户信息的。在XSS那里提到过,有时候我们不能直接获得cookie的具体的值,那我们就可以不得到他的值,我们直接只用这个访问

跨站:从一个网站到另一个网站

请求:HTTP请求

伪造:伪造,伪装

总结一下的说:攻击者盗用了你的身份,以你的名义发送恶意请求。

漏洞成因

CSRF漏洞一般是由于没有检查Referer以及未在头部设置token造成的。

通过这个我们也可以联想到漏洞的检查方式。当我们把referer修改了之后发现还能正常的访问就说明存在这些问题

执行操作的时候没有只检查了cookie 并没有具体验证身份;请求的参数可以猜测到,也就是说请求参数是确定的

漏洞危害

CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全等等等等。可以说CSRF能够做什么,取决于你在网站里能做什么操作

根据src 经验来说,可能对一个场景中,只有增删改利用的危害要大一些
一般查的csrf 是不收的

与XSS的区别

前面也提到了,我们可以使用这个cookile而不是直接获取这个值

下面是更加完整的说法

CSRF与XSS不同,主要在于XSS是获取用户的凭证信息等,而CSRF是利用用户凭证信息,并不获取

漏洞类型

GET型

接下来示范一下

攻击者:

正常的修改密码

image-20231210144012391

image-20231210144102490

密码已经修改了,我们使用攻击者使用url看看

http://192.168.15.166/dvwa/vulnerabilities/csrf/?password_new=ASASd&password_conf=afsdf&Change=Change#

然后诱导受害者点击这个url那他的密码也会被修改

如果这个联合存储型XSS的话,只要用户触发了这个XSS那么他的密码就会被无意的被修改了

POST

这个的危险程度没有GET那么大,同常的形式是一个表单,访问该页面表单位自动提交

1
<form action=http://test.com/csrf.php method=POST> <input type="hidden" name="xx" value="11" /> </form> <script>document.forms[0].submit()</script>

相当于模拟了用户提交表单的这个过程

漏洞利用

前提:

  1. 对方登录了系统,并且没有退出
  2. 攻击者拥有对方的cookie (可以使用xss 的方式进行获取)

主要是和XSS打组合拳,当网站设置了http-only的话,那我们就不能只用XSS获取cookie了,那么我们可以换一个思路不获取它,而是直接利用这个值

例如,在存在xss漏洞的A网站上注入一条链接点击这里领取黑客秘籍<a href=”xxx.xxxx.xxx/test.php?money=1111”/>,当用户点击之后,进入攻击者提前写好的网站B,触发网站B中,例如<img src=”http://网站A/test.php?Id=1&money=100000”/>这样的恶意代码。这时候由于用户带有A网站的认证信息,B网站利用用户此时的请求,篡改GET或POST表单内的参数,在用户不知情的情况下请求A网站,完成转账,修改密码等恶意操作

绕过漏洞

  1. 如果对方使用了检测referer,可以通过固定数据包里面的来源
  2. 如果发现网站寻找上传地方,上传的数据包文件,取到当前同域名可以访问的地址

漏洞修复

  1. Referer检查。攻击者虽然是利用用户的请求进行访问,但是Referer的内容显示的是B网站,也就是攻击者自己构造的网站。如果对Referer进行白名单检查,看是否来自合法的网站。如果不是,就极有可能是CSRF攻击
  2. 添加Token验证。CSRF攻击成功的原因就是利用用户已经认证过的cookie信息。cookie中的身份信息在请求时会自动添加,所以我们要在cookie外再加入一种验证身份的信息。具体的做法是在HTTP请求中,以参数的形式加入一个随机产生的Token,并在服务器端建立一个拦截器来验证这个 Token,如果请求中没有 Token 或者 Token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求
  3. 对敏感信息的提交使用post ,不适用get ,进一步的放置被伪造get 请求

面试

  1. CSRF跨站请求伪造原理

    1. 攻击者利用服务器对用户的信任,从而欺骗服务器(伪造的恶意url)
    2. 服务端没有对请求中的referer 做检查,没有添加对应的token ,在进行关键操作的时候没有再次验证
  2. 和xss 区别

    xss: 利用的是用户对服务端的信任;具体的利用是脚本在用户浏览器上执行,并不会对服务器造成什么影响

    csrf:利用的是服务器对用户的信任;具体的利用是已经认证的用户(登录的用户)身份信息,对服务器请求,服务器会认为是用户的正常请求

  3. 攻击要点

    1. 用户处于登录状态
    2. 服务端没有对请求进一步验证,referer,token等
    3. 攻击者能有一个可以利用的请求也很重要
  4. 如何防御CSRF

    1. 避免url 中的参数被直接获取,或者是猜测到
    2. 使用同步令牌及其有效性
    3. 检测Referer Header
    4. 不在客户端存放敏感信息(身份认证信息)
    5. 会话最长的时间,如果之间没有请求就断开
    6. 有关重要操作需要进行进一步操作(比如修改密码)
    7. 敏感信息的修改使用post而不是get
    8. 避免交叉漏洞, 如XSS等
    9. 禁止跨域访问
    10. 在响应中设置CSP(Content-Security-Policy)内容安全策略

CSRF
https://tsy244.github.io/2023/12/09/web/CSRF/
Author
August Rosenberg
Posted on
December 9, 2023
Licensed under