【$10,000】绕过GitHub HTML标签过滤

admin 2022年10月28日23:03:14评论39 views字数 4587阅读15分17秒阅读模式

声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。


背景介绍:


【$10,000】绕过GitHub HTML标签过滤

几个月前,白帽小哥Saajan Bhujel正在无聊的刷着 Twitter ,突然间,来自GitHub 的一条推文吸引了他的注意,Tweet 是关于 GitHub 的新功能,它提供了通过 MathJax 库在 Markdown 中显示数学表达式(TeX 和 LaTeX 样式语法)的功能。

【$10,000】绕过GitHub HTML标签过滤


什么是 MathJax?

MathJax 是适用于所有现代浏览器的 LaTeX、MathML 和 AsciiMath 表示法的开源 JavaScript 显示引擎,内置对屏幕阅读器等辅助技术的支持。

阅读完推文后,可以了解到“GitHub 现在正在使用 MathJax 库在 Markdown 文件中显示数学表达式”,于是,白帽小哥尝试的第一件事便是在 MathJax 库中查找以前或已知的漏洞,而他的专注点是寻找曾经爆出的 XSS 或 HTML 注入 CVE。

阅读推文后,我了解到,“GitHub 现在正在使用 MathJax 库在 Markdown 文件中显示数学表达式”。所以,我尝试的第一件事是在 MathJax 库中查找任何以前或已知的错误。主要是,我正在寻找任何以前的 XSS 或 HTML 注入 CVE。

很幸运,在 MathJax 库中发现了影响版本 < 2.7.4 的已知 XSS 漏洞,并且POC需要采用 Unicode 格式才能触发。

【$10,000】绕过GitHub HTML标签过滤

于是白帽小哥迅速地在测试存储库中创建了一个markdown文件,他在一个文件中输入了如下的payload:

Payload:- or , etc.$$\u003cuu003eHellou003c/uu003e{}$$$$\u003cuu003eWhyu003cuffofuu003e{}$$

但是,这其实并没起任何作用,而且,该漏洞“仅在版本 <2.7.4 时易受攻击,而 GitHub 使用的是较新的版本”。

因此,白帽小哥认为“必须自己找到一个绕过方法才能成功利用该攻击,并且如果能够以某种方式呈现基本的 HTML 标签,例如:.”。也许你可能会想知道为什么只是基本的 HTML 标签?要知道大多数时候网站都会使用 WAF、过滤器和限制器来防止使用高级标签,但它们对基本的HTML标签和普通标签的作用却不同。

第一种利用方式:

白帽小哥做的第一件事是“找到任何对使用数学表达式渲染基本标签非常有用的有趣行为”,为此,他尝试了不同类型的方法(如 Unicode、URL 编码等)。

终于功夫不负有心人,某个时候的标签会被渲染而没有任何错误或过滤”,POC是下面这样:

 $$ <u>HELLO</u> {}$$


于是白帽小哥很快使用其它高级标签(如<script>、<iframe>、 <style>)替换了这个标签,以了解“网站是否使用了更多的过滤器来防止高级标签的使用”,答案是肯定的,GitHub markdown文件使用了更多的过滤器...

然后在测试了这个 MathJax 集成之后,白帽小哥发现可以在()之前使用反斜杠添加标签,因此,为了自定义 CSS,白帽小哥在他的文件中使用了以下POC:

<style>\<style>{property:value}</style>测试.md$$<style>*{display:none}</style>{}$$$$<style>div{background-color:#66f3e6}</style>{}$$$$<style>*{font-size:23px;}</style>{}$$$$<style>body{padding: 50px;background-color: #4b6bb7;}</style>{}$$

可以看到,现在我们可以更改整个页面的 CSS了。

【$10,000】绕过GitHub HTML标签过滤

白帽小哥迅速创建并提交了漏洞报告,但是,5 分钟内显示报告已被关闭,并说“这是一个先前发现的问题,正在内部跟踪”

白帽小哥提交的第一份漏洞报告就这样以‘撞洞’的形式而被关闭了...

第二种利用方式:


GitHub 在 24 小时内修复了该问题,于是白帽小哥想用他以前的方法和POC重新测试这个问题,同时,他发现“不再能够使用以前的方法和POC来使用高级标签了”。

但是他并没有气馁,而是设法找到了另一种呈现标签的新方法,但这一次,只能使用普通标签,例如:

<div> , <span>,</span><section> <span>,<input> , <label>, <button>

而不是

<style> and <script>
$$<div>Test</div>{}$$$$<input type=text>{}$$$$<button>Click Here</button>{}$$

我们可以使用<input>、<button>等标签在markdown中使用数学表达式。

尽管如此,白猫小哥并没有向GitHub报告这一问题,因为“除了使用受限标签外,没有看到任何安全影响”,因此,他尝试找到与上面类似的第一种方法,也许可以修改页面的CSS,但GitHub修复问题后,我们便不能再使用<style>标记了,因此,剩下的唯一选择就是使用style属性来修改CSS,但一个新的问题出现了,“GitHub限制了属性的使用”。

* NOTE * As we know that we can use “class”, “id” and a few more attributes in markdown(.md) files but not the “style” attribute because it may lead to a change in the CSS of the page.

但是,令人惊讶的是,我们只能在数学表达式使用“style”属性,如果不使用数学表达式,在markdown文件中使用“style”属性是不可能的。

Payload:

$$<tag style="property:value" acceptedAttribute="True"></tag>{}$$

因此,白帽小哥简单地创建了一个POC,可以使文件页面像登录页面一样:

$$<div style="position:fixed;padding:10%;padding-right:100%;left:-9%;top:-20%;background:white;padding-bottom:100%;"><section style="margin-left:500px;padding:30px;"><h2 style="text-align:center;">Sign in to GitHub</h2><div><label>Username: </label><input type=text style="border-radius:5px;border:1px solid;"><label>Password:  </label><input type=password style="border-radius:5px;border:1px solid;"><div style="text-align:center;"><button style="background:#2da44e;color:white;margin:10px;border-radius:9px;border:none;font-weight:500;padding:4px;padding-right:20px;padding-left:20px;" type=submit>Sign in</button></div></section></div></div><!--{}$$


【$10,000】绕过GitHub HTML标签过滤

白帽小哥在第一份漏洞报告的下方评论道:“我刚刚发现了一个可以再次更改整个页面的 CSS 的 Bypass,所以请告诉我,内部团队是否已解决了这个问题?如果问题已解决,那么我很高兴创建一个Bypass的新报告作为……”

很快 GitHub 的工作人员回复了如下声明,如下图中所见😁

【$10,000】绕过GitHub HTML标签过滤

第二天一觉醒来,小哥注意到 GitHub 团队再次修复了该问题,因为新的POC 不再能够触发😶,因此这也表明“他们是对的,他们确实在内部研究 MathJax”。

第三种利用方式:

尽管如此,这并没有阻止白帽小哥在 MathJax 功能中发现一些不寻常的东西。

小哥注意到在第二次修复之后,他无法使用之前的POC来渲染任何高级标签。

我们可以清楚地看到“在使用数学表达式中的任何标签之前都使用了反斜杠,例如:

\<tagName>{}

花了更多时间之后,小哥终于找到了一种新方法来渲染一些标签,例如使用:

$$<tagName>{}$$$${<tagName>}$$<input>,<svg>,<button>,<textarea>

Payload

$$ <script>{<renderTag>}$$


这个有效Payload是如何工作的呢?

  • 在反斜杠之后的第一个位置,标签会从Payload中被过滤掉恶意标签,例如


\<script><style>
  • 我们要渲染的主要标签应该在大括号之间,大于号和小于号应采用 HTML 实体的形式:

{<renderTag>}

因此我们的最终Payload将如下所示:将过滤掉在花括号之前写入的或任何标记,并且Mathjax 将只渲染大括号中的标签。

$$<script>{&lt;renderTag&gt;}$$<script>

test.md 文件中使用了以下Payload:

$$<script>{&lt;div&gt;&lt;section&gt;&lt;h2&gt;Sign in to GitHub&lt;/h2&gt;&lt;label&gt;Username: &lt;/label&gt;&lt;input&gt;&lt;br&gt;&lt;label&gt;Password: &nbsp;&lt;/label&gt;&lt;input&gt;&lt;br&gt;&lt;button&gt;Sign in&lt;/button&gt;&lt;/section&gt;&lt;/div&gt;<!--}$$## Input tag:$$<script>{&lt;input&gt;<!--}$$## Button tag:$$<script>{&lt;button&gt;Test Button&lt;/button&gt;<!--}$$## Textarea tag:$$<script>{&lt;textarea&gt;Write something...&lt;/textarea&gt;<!--}$$


【$10,000】绕过GitHub HTML标签过滤

白帽小哥试图增加这个漏洞的影响性,但最终失败了。

因此,他将此漏洞报告给 GitHub ,并自评为低严重性,而这一次,GitHub 接受了中等严重性的问题,并联同 SWAG 和 GitHub Pro 支付了 10,000 美元的赏金。

漏洞时间线:

5 月 21 日 - 向 GitHub 提交第一份漏洞报告

5 月 21 日 - 报告因重复而关闭

5 月 24 日 - 再次报告了新的绕过问题

5 月 25 日 - 由 GitHub 分类报告

8 月 20 日 - GitHub 修复了这个漏洞

8 月 20 日 - GitHub 奖励10,000 美元赏金、一个 SWAG 和 GitHub Pro

====正文结束====

原文始发于微信公众号(骨哥说事):【$10,000】绕过GitHub HTML标签过滤

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月28日23:03:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【$10,000】绕过GitHub HTML标签过滤http://cn-sec.com/archives/1376923.html

发表评论

匿名网友 填写信息