点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

本文来源: https://www.anquanke.com/post/id/220963

本文是翻译文章,文章原作者William Bowling,文章来源:devcraft.io
原文地址:https://devcraft.io/2020/10/19/github-gist-account-takeover.html

0x01 前言

安全研究员William Bowling在研究GitHub用于生成url的每种方法过程中,找到了可用于创建所需令牌的方法url_for,并实现了Gist账户接管,最终获得$10000赏金。

0x02 漏洞发现

url_for方法经常被用来生成指向其他控制器的链接。虽然无法找到任何地方可以作为旁路使用,但也发现了一些点,调用url_for与用户一个可控的哈希。这时候,哈希中的任何额外的参数都会被附加到url中作为一个查询字符串。通过查看档,发现有相当多的选项是可以控制的:

1 .:only_path – 如果为true,返回相对的URL。默认为false

2 .:protocol – 要连接的协议,默认为http

3 .:host – 指定链接的目标主机。如果:only_path为false,则必须显式或通过default_url_options提供该选项

4 .:subdomain – 指定链接的子域,使用tld_length将子域与主机分割开来。如果为false,则删除链接主机部分的所有子域

5 .:domain – 指定链接的域,使用tld_length将域从主机中分割出来

6 .:tld_length – TLD id 组成的标签数,只有在提供 :subdomain 或 :domain 时才使用。默认值为ActionDispatch::Http::URL.tld_length,而默认值为1

7 .:port – 可选择指定连接的端口

8 .:anchor – 附加在路径上的锚名称

9 .:params – 要附加到路径上的查询参数

10 .:trailing_slash – 如果为true,则在路径后面添加一个斜线,如”/archive/2009/“

11 .:script_name – 指定相对于域根的应用程序路径。如果提供了,则预置应用程序路径

我以前在其他应用程序中看到过一些比较常见的选项,比如:protocol:host 选项被列入黑名单/删除,或者:only_path 被设置为 true 以防止被使用(即使是 brakeman 建议这样做是安全的),但以前从未见过 :script_name param。它被path_for方法使用,如果它存在,将被用在路径的开头:

def path_for(options)path = options[:script_name].to_s.chomp("/")path << options[:path] if options.key?(:path)add_trailing_slash(path) if options[:trailing_slash]add_params(path, options[:params]) if options.key?(:params)add_anchor(path, options[:anchor]) if options.key?(:anchor)path
end

GitHub上有几个地方使用了下面类似的代码创建链接:

<a class="link" href="<%= url_for(request.query_parameters.merge(only_path: true)) %>">Click me
</a>

这就意味着,如果使用字符串?script_name=javascript:alert(1)//最终会生成以下html:

<a class="link" href="javascript:alert(1)//user/repo/...">Click me
</a>

然而,这只是一个低严重性的反射型XSS,需要点击,也被CSP所阻止,但这仍然可以看做一个有趣的bug。

关注公众号:后端面试那些事儿,每天学一点,一起进大厂!

随后,我发现另一个地方使用url_for与可控参数,这次是作为重定向的一部分。这段代码在应用程序控制器中,做了如下操作(方法/参数名称已被更改):

 before_action :check_sourcedef check_sourcesource = params["source"]return redirect_to(check_source_redirect_url) if source == "message"enddef check_source_redirect_urlquery = Addressable::URI.parse(request.env["REQUEST_URI"]).query_values || {}filtered_params = query.except("source", "token").merge(only_path: true)url_for(filtered_params)end

由于使用only_path: true,通常只允许使用现有主机的URL,只保留查询参数。但如果使用script_name就会得到一些有趣的结果,script_name不需要以斜杠开头,当与redirect_to一起使用时,可以被附加到host中:

curl -i 'http://local.dev?source=message&script_name=ggg'
HTTP/1.1 302 Found
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Location: http://local.devggg/welcome/index
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
X-Request-Id: 7c8eedfa-f552-4d5a-bbcd-295f4e7fd9c0
X-Runtime: 0.002744
Transfer-Encoding: chunked<html><body>You are being <a href="http://local.devggg/welcome/index">redirected</a>.</body></html>

由于域名的结尾是可控的,如果用.attacker.domain作为script_name,就会重定向到他们的域名。

关注公众号:程序猿DD,与一线架构师共成长!

0x03 漏洞利用

第二天,我和corb3nik聊起开放重定向的影响,他提到 OAuth tokens 是很挖掘的目标。回头再看这个重定向bug,我发现它其实很厉害,因为它在应用控制器中很早就被影响,这意味着将影响几乎所有的路径(所有的控制器都会扩展应用控制器)。

GitHub自带一些内置的OAuth应用,其中一个就是针对Gist的。GitHub Gist与GitHub是同一个rails应用,只是在不同的主机名后面,拥有有不同的路径。当登录Gist时,通过正常的OAuth流程是一大堆重定向,看起来像这样:

1 .https://github.com/login/oauth/authorize?client_id=7e0a3cd836d3e544dbd9&redirect_uri=https://gist.github.com/auth/github/callback

2 .https://gist.github.com/auth/github/callback?browser_session_id=XXX&code=YYY

3 .https://gist.github.com/auth/github

4 .https://github.com/login/oauth/authorize?client_id=7e0a3cd836d3e544dbd9&redirect_uri=https%3A%2F%2Fgist.github.com%2Fauth%2Fgithub%2Fcallback&response_type=code&state=ZZZ

5 .https://gist.github.com/auth/github/callback?browser_session_id=XXX&code=YYY&state=ZZZ

6 .https://gist.github.com/

为了成功登录Gist,攻击者只需要browser_session_idcode,因为client_id是公开的,state param可以由攻击者生成,因为它只是为了防止CSRF。

初始重定向redirect_uri携带有code和 browser_session_id ,所以我试着在其中添加 script_name=.wbowling.info。结果成功了,我被重定向到我自己的域名,并添加了所需的参数。

在一个新建的浏览器隐私页面,我去https://gist.github.com/auth/github/callback,抓取一个有效的状态参数,然后使用这份browser_session_idcode 和 state参数,成功登录了账户。

由于GitHub和Gist使用不同的会话令牌,虽然它不允许访问github.com,但允许完全访问Gist。

最终我因为这个发现,获得了$10000的赏金。

往期推荐

仅用六个字符来完成Hello World,你能做到吗?

StackOverflow热帖:Java整数相加溢出怎么办?

星巴克是如何处理订单的?

MIT黑科技:通过手机记录的咳嗽数据检测是否感染新冠病毒

10个你可能不曾用过却很有用的 LINUX 命令

扫一扫,关注我

一起学习,一起进步

每周赠书,福利不断

深度内容

推荐加入

最近热门内容回顾   #技术人系列

赏金$10000的GitHub漏洞相关推荐

  1. github pages markdown_赏金$25000的GitHub漏洞:通过 GitHub Pages 不安全的Kramdown配置实现多个RCE...

    0x01 开篇 我一直在关注GitHub企业版的发布说明,主要关注补丁的bug修复.这次,我发现补丁发布对Kramdown中的一个问题进行了关键修复. CVE-2020-14001的描述很好地总结了漏 ...

  2. 国内首个比特币勒索病毒制作者落网,但过程有点好笑...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:扩展迷EXTFANS 所谓比特币勒索病毒,就是某一 ...

  3. 重大BUG:你的淘宝双十一订单可能多付钱了!

    又是一年一度买买买的狂欢日子,虽然双十一越来越无趣,越来越复杂.但是还是挡不住无数剁手党的热情,笔者也是其中之一. 今年双十一很大的不同是,很多旗舰店需要预先支付定金,如下图所示.这个图中还有更坑爹的 ...

  4. Loki 2.0.0 发布,ELK之外的优秀日志聚合系统!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.oschina.net ...

  5. GitHub 企业服务器被曝高危 RCE 漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 今天,GitHub 在官网上发布消息称,在 GitHub Enterprise Server 中发现一个远程代码执行漏洞,编号为 CV ...

  6. GitHub 2019年漏洞奖励计划最值得回顾的2个精彩 bug

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 GitHub 发布博客文章指出,截止2020年2月份,GitHub 漏洞奖励计划已走过六个年头.GitHub提到,六年中支付的漏洞奖励 ...

  7. web服务器/中间件漏洞系列2:weblogic漏洞汇总

    前言: 漏洞环境使用vulhub docker一键搭建,利用工具包括burp suite,kali等. weblogic简介: ​ WebLogic是美国Oracle公司出品的一个applicatio ...

  8. oauth最后的确认按钮_绕过GitHub的OAuth授权验证机制($25000)

    这几年来,信息安全研究一直是我的业余爱好,虽然有很多人专职做漏洞众测以获得奖励,但对我个人来说,我只对一些感兴趣的项目投入不多的时间去深入研究.今年,我想看看自己是否是全职漏洞赏金猎人的料,所以就从6 ...

  9. war包启动命令_【漏洞预警】Oracle WebLogic远程命令执行0day漏洞(CVE20192725补丁绕过)...

    概述 近日,奇安信天眼与安服团队通过数据监控发现,野外出现Oracle WebLogic远程命令执行漏洞最新利用代码,此攻击利用绕过了厂商今年4月底所发布的最新安全补丁(CVE-2019-2725). ...

最新文章

  1. Java - HtmlEmail 邮件发送
  2. JS获取元素高度宽度的问题
  3. android和ios兼容面试题,[转]移动端常见面试题一:移动端兼容解决方案
  4. NatApp 内网穿透工具简单使用介绍说明
  5. 如何读取服务器的文件夹大小,请教如何获取outlook文件夹对话框中服务器数据大小?...
  6. MySql索引原理与使用大全
  7. html5 拖拽滚动条,js 简易版滚动条实例(适用于移动端H5开发)
  8. jQuery基础简介
  9. java之xml编程
  10. Java 加密解密之对称加密算法PBE
  11. 数据库索引 类型 (转载)
  12. .net5 不支持winform_.NET5.0 单文件发布打包操作深度剖析
  13. access ok linux,使用linux宏access_ok()有什么意义
  14. 高通平台开发系列讲解(USB篇)Vbus检测程序
  15. W10注册表及其打开方法
  16. java实现短视频拍摄_短视频 SDK 6大功能技术实现方式详解
  17. 虚拟试戴用时尚拉近了粉丝和剧中人的距离
  18. c语言地址有什么作用是什么,C语言中取地址运算符是什么?
  19. 【深度学习机器翻译】GNMT:Google 的的神经机器翻译系统
  20. S7 A7 K7 V7区别

热门文章

  1. Array.splice()--删除数组中重复的数据
  2. telegram bot 机器人 发送 加粗 斜体 字体
  3. linux shell 符号 变量 参数表示
  4. linux RPM-GPG-KEY 包签名机制 简介
  5. python3 域名转ip
  6. docker 容器 defunct 僵尸进程
  7. windows tracert 命令 查看路由表
  8. linux c 错误 'for' loop initial declaration used outside C99 mode
  9. linux alpine 提示'/bin/sh: rc-service: not found'解决方案
  10. linux gdb调试问题汇总