CSRF详解:攻击原理与防御

  最近在研究怎么在代码中携带用户名和密码模拟登陆某一网站,发现一些网站的代码中携带了csrftoken这一值,向它发起POST请求时需要带着网站方随机分配给你的这个csrftoken值的参数POST才能请求成功完成登陆,否则,你的请求就算携带了正确的用户名和密码也登录不了网站。在此,了解了一下CSRF是什么以及网站为什么要这么做,简单做了一下总结。

1.CSRF

1.1 CSRF简介

CSRF是指一种网络攻击方式,全称 Cross Site Request Forgery,即 跨站域请求伪造,与SQL注入等方式一样,黑客在受害人不知不觉间可以通过跨站域脚本攻击达到一些私有目的。

1.2 攻击原理

CSRF的原理就是以受害者名义伪造网络请求发送给被攻击的网站,从而获得受害人的执行权限在被攻击网站上执行相应的操作。简单来说,就是攻击者盗用了你的身份和你对相关网站、数据库的执行权限,以你的名义发送恶意请求,盗取你的账号、转账、购买商品和发送邮件等等。这种在未经授权的情况下执行在权限保护范围内操作的方法,具有很大的危害。

CSRF攻击示例
上图可能画的有点乱,下面给出一个简洁一点的:

B受害人 A某网站 C攻击者 1.登录 2.登录成功并在浏览器生成cookie| 3.无意间访问攻击者的网站或其恶意代码 4.要求B向A发起访问 5.访问A并执行C的恶意代码 B受害人 A某网站 C攻击者

如上,比如B正在电脑上登陆了某个银行的网站,首先他登录成功后,银行A产生Cookie信息并返回给浏览器,这时B就可以在A上操作、转账、汇款了(当然,现在转账汇款都要是短信验证,这里忽略)。但是B在没退出A银行网站并且seesion会话在有效期内的时候,又无意打开了C的网站或者链接,点击了进去,C攻击者收到了请求返回给B一些攻击代码,并发送请求要求访问第三方网站A。B的浏览器收到了C的请求在B不知情的情况下携带Cookie信息向A发出请求,A网站验证了Cookie认为是B授权的操作,执行发来的请求。

上面这个只是一个经典的例子,相关电影比如《Who Am I》,电影中黑客们想要黑了政府机构,利用社会工程学,他们先去翻垃圾堆,在成千上万垃圾中找出了一些个人信息,比如某个人的邮箱地址,然后开始观察这个人,了解她的性格、生活习惯和弱点,当黑客们分析中这位公职人员十分喜欢猫的时候,在她上班的时候给她发了一封邮件,内容里有一张非常可爱的猫咪的图片,她收到邮件后没忍住打开了图片的链接,黑客们埋好的恶意代码随之被执行,他们黑进了政府的内网并在数据库里插入了他们设计的账户。最后一步,他们趁夜深人静潜入了政府机构的大楼,连接到内网后用插入的账户登录然后备份数据。。。

2. 防御

当我们登录某一网站后,服务器通过Cookie验证我们的身份和登录的有效性,但攻击者无法轻易拿到我们的cookie,也看不到其中的内容。并且所有浏览器都有同源策略的限制,服务器返回的结果黑客无法远程进行解析。所以,他能做的,就是借助我们的有效cookie骗取服务器信任,发送求情给服务器以执行命令。所以我们有以下防御方式

2.1 验证HTTP Referer

HTTP协议的头部中有一个叫Referer的字段,表示HTTP请求的来源地址。我们登陆一个安全受限网站后,在页面上的所有操作其实都是该网站的内部请求,但是攻击者实施CSRF攻击,只能在自己的网站构造请求,该请求的Referer是指向攻击者自己客户端或网站的,所以我们增加一个拦截器过滤Referer就可以屏蔽攻击。但是Referer是由浏览器提供的,我们无法保证所有浏览器的Referer都不会被篡改。

2.2 在请求地址中添加token并验证

攻击者利用CSRF实现攻击的关键在于攻击者伪造了受害用户的请求,并携带受害者的cookie完成了用户信息的验证,所以本方法的目的是设计一个独立于cookie之外随机产生的token,并在服务器端建立拦截器验证这个token,如果请求中没有或者token内容不正确,都会拒绝连接,这样,攻击者就会因为无法伪造这个token而无法达成攻击目的。

这种方法比第一种安全,token的值在用户完成登录后产生和存放到session中,每次请求都把token从session中拿出来与请求中的token值对比。
对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成

http://url?csrftoken=tokenvalue

而对于 POST 请求来说,要在 form 的最后加上

<input type=”hidden” name=”csrftoken” value=”tokenvalue”/>

这样就把 token 以参数的形式加入请求了。
但这个方法也不是绝对万无一失,攻击者仍有方式获得token值发动攻击。

2.3 在HTTP头部中加入token

同样是使用token进行验证,但是这里的token没有以参数形式加入到HTTP请求,而是放到了HTTP头部自定义的属性中。通过使用XMLHttpRequest类,可以一次性给该类所有请求加入csrftoken,解决了2中加入token的不便,也不会被记录到浏览器地址栏,更不用担心token会透过2Referer泄漏到其他网站。
但这种方法局限性非常大,有些请求不适合使用XMLHttpRequest(Ajax方法对于页面局部的异步刷新常使用这个类)。而且通过该类请求得到的页面不能被浏览器记录,也就说不能前进、后退、刷新和收藏等,对用户很不友好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值