跟程序猿学习之——"跨站攻击" 浅谈
今天随意在chrome console 里敲了一行代码
window.location.href="https://www.facebook.com"
结果看到了以下结果。啊嘞!这是什么???
本着刨根问底的精神,直接跑去向程序猿老公求助。他说的很浅显,但我感觉是一些必须了解的知识,解决了我一直以来概念模糊的问题。我把我们的对话整理记录在这,帮助自己加深记忆,也希望能帮助到有需要的小伙伴
懒兔子:刚刚敲了一行代码,感觉Facebook 还挺细致的 (请原谅我的废话)
程序猿:现在好多都有的,你可以看看www.taobao.com, www.douban.com .....
懒兔子:不过难道密码框里输入的东西能被程序捕捉下来吗?这不是浏览器自己的原生输入框吗,为什么有这样的警告?
程序猿:原生的html输入框里的东西能被js读,能被浏览器的插件读,所以很多网站安全登陆都让你装一个插件,那你用的密码框就是安全插件提供的,就不会被其它插件读取到。这个地方是防止xss攻击,cross site script攻击,也不算防止,就是警告一下。
懒兔子:确实能读到。直接 document.getElementById("pass").value 就读到了。
懒兔子:但是JS的运行不是在沙箱里吗。包括页面里直接写的,外链的,console 里敲的。怎么会有跨站攻击的问题?
程序猿:JS是本身是在沙箱里运行的没错,而且一般也不能发送请求到另一个domain的
懒兔子:那这里所谓的跨站是什么意思,我以前以为是跨domain/hostname .听你这么说好像没什么关系嘛
程序猿:这里的跨是指,比如你浏览www.domainA.com, A攻击domainB, 那就在A的网页里放上B的标签< img src="www.domainB.com/api/">。这样就跨站啦
懒兔子:只有img 有这个问题吗。这么说是不是所有的 href 比如 <link href=...> 和 src 比如<script src=...> 都有这样的问题
程序猿:都有。img是最常用的,一般不会被浏览器做任何限制
懒兔子:跨站攻击有几种方式?
程序猿: 跨站攻击有以下两种。一个是跨站引用,csrf(cross site reference), 一个是跨站脚本 xss 。
跨站引用的例子:比如你提供一个REST API 功能是转账1块钱, 如果我发你一个邮件,邮件里加一个img src='your-rest-api/pay-one-dollar/', 那么浏览器会以为是图片,默认调用一下,而你的浏览器上已经有your-rest-api的cookie了,比如remember me功能,那么这个接口就调用成功了;
跨站脚本的例子,就是站点输出的内容,比如评论的内容,没有转意,如果评论的内容是一段js脚本,那么就会被嵌在html正常执行。
<div>{{user_comment}}</div>如果user_comment是
<script>alert('inject');</script>那么就会变成
<div><script>alert('inject');</script></div>