RCTF 2017 rCDN & noxss writeup
发表于 2017 年 5 月 24 日
To make it easier for foreign players to read, I try to use normative expressions and grammars in this writeup to make machine translations as accurate as possible and not puzzling. Google Translate is recommended!
为了方便外国选手阅读,我在这篇 writeup 中尽力使用规范的表述和语法,以让机器翻译尽可能得准确,不令人费解。
rCDN (4 solved)
从首页我们可以看到 Basic 服务提供的是随机生成的 8 位字符的子域名,而 Pro 服务可以自定义短域名。在 /gopro
页面中也可以看到 “Short subdomain (3~6 chars) is only available for Pro account” 。添加一个 Basic 服务会发现只有销毁操作是可用的,虽然 Pro-only 的操作是禁止点击的状态,但它们的链接可以从 HTML 源码中看到。
提交 ticket 以请求技术支持是 Pro 用户一个与 rCDN 客服交流的方式。但 rCDN 没有把控好权限,以至于 Basic 用户也能访问这个链接,并且提交 ticket。通过测试可以知道,我们在 ticket 中填写的子域名必须是 <= 6 个字符的,否则会被认为是来自 Basic 的提交,返回“Only email support is available for Basic CDN Service”。如果我们提交短域名,会得到“该子域名不存在”的回复——对于 Basic 用户来说,确实是这样。
那么我们应该怎样假装拥有短的子域名呢?答案是利用浏览器的 Unicode Normalization in Domain。试着用 Chrome 点击下面这两链接,它们将打开同一个页面:
https://b㏒.㎈c.cn
https://blog.cal1.cn
或许你已经从字体发现了差异,在第一个链接中,“log” 被 “㏒” (\u33D2) 替代,“cal” 被 “㎈” (\u3388) 替代。关于这个技巧,推荐阅读 2014 年 @mramydnei 在 Wooyun drops 发表的文章《短域名进化史》。利用该技巧,将已有的 Basic 的域名变短,提交 ticket 欺骗客服,就可以获得 flag 了。
noxss (3 solved)
本题是 Cross-Origin CSS Attacks Revisited (feat. UTF-16) 的复现。强烈建议阅读原文。
利用 CSS 解析器强大的容错性,和 php <= 5.6.0 default_charset 默认为空的缺陷,从 phpinfo 中窃取 http-only 的 cookie。
由于 CSP 的限制,这里应使用 background: url() 向外部域名发出请求。
Content-Security-Policy: default-src *; img-src * data: blob:; frame-src 'self'; script-src 'self' unpkg.com; style-src 'self' unpkg.com fonts.googleapis.com; connect-src * wss:;