CSRF 背景与介绍
CSRF定义: 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
CSRF地位:是一种网络攻击方式,是互联网重大安全隐患之一,NYTimes.com(纽约时报)、Metafilter,YouTube、Gmail和百度HI都受到过此类攻击。
对比XSS:跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
CSRF 攻击实例
daguanren(大官人)在银行有一笔存款,输入用户名密码登录银行网银后发送请求进行个人名下账户转账 :
http://www.bank.example/withdraw?account=daguanren1&amount=999&for=daguanren2
将daguanren1中的999块转到了daguanren2账号中。通常用户登录后,系统会保存用户登录的session值(可能是用户手机号、账号等)。但如果这时daguanren不小心新开一个tab页面进入了一个黑客jinlian(金莲)的网站,而金莲网站的页面中嵌有如下html标签:
<!DOCTYPE html> <html> <!--其他页面元素--> <img src=http://www.bank.example/withdraw?account=daguanren1&amount=888&for=jinlian width='0' height='0'> <!--其他页面元素--> </html>
这个请求就会附带上daguanren的session值,成功将大官人的888元转至jinlian的账户上。但如果daguanren之前没有登录网银,而是直接打开jinlian的网站,则由于没有session值,不会被攻击。以上示例虽然是get请求,post请求提交的表单同样会被攻击。
<iframe style="display:none" name="csrf-frame"></iframe> <form method='POST' action='http://www.bank.example/withdraw' target="csrf-frame" id="csrf-form"> <input type='hidden' name='account' value='daguanren1'> <input type='hidden' name='amount' value='888'> <input type='hidden' name='for' value='jinlian'> <input type='submit' value='submit'> </form> <script>document.getElementById("csrf-form").submit()</script>