Markdown也有xss

作者:惊鸿一瞥最是珍贵

前言

最近我测试一个web网站的时候发现,我可以通过markdown编辑器和渲染包来触发跨站点脚本(XSS)漏洞。这是我第一次遇到这种类型的漏洞,我发现它特别有趣,因为它允许我绕过在应用程序中实现的多层XSS过滤。以下就是我关于这个漏洞的相关报告。

何为Markdown?

Markdown是一种用于编写和格式化内容的简单语言。简单地说,编写者只需要掌握少量的语法,就可以写出简洁美观的内容。从GitHub上的Gists和readme文件,到您正在阅读的这篇文章,它无处不在。标准化的语法允许不同的markdown处理器以不同的方式显示相同的文档。标题始终是标题,但处理器可以选择应用哪种字体和权重、将标题放置在何处以及标题在目录中的显示方式。看看一个例子视觉效果也非常棒!但是,Medium并不存储HTML和CSS的网页,而是存储一个标记文件。

![The goodest boy](https://images.unsplash.com/the_good_boy.png)

非常实用!Medium读取这一行,由于markdown的语法,Medium知道这是一个分享出来供大家阅读的图像。Medium处理此行并生成构成本文的HTML。

怎么在markdown中触发XSS?

上一段的重点在最后一行。Medium读取markdown中的行,然后生成HTML。敲黑板!如果不能安全地实现这一点,我们可以在markdown中写入恶意JavaScript代码,因此在markdown处理器进行处理时,会触发这段代码。在我测试的Web应用程序中,我知道触发XSS不是很容易的一件事。它是一个Angular应用程序,默认情况下会清除页面上渲染的所有内容。而且,基于对API的测试,我知道任何看起来像HTML或JavaScript的东西在存储到数据库之前都会被去掉。但是,我认为,如果在web应用程序或API上没有正确地对这些代码进行清理,markdown就会是一个突破口。

再探Markdown

Markdown中的另一个例子是链接,它的语法与图像相同,但是没有前缀'!'。

[Click Me](https://www.example.com/)

当由Medium处理时:

<a href="https://www.example.com/">Click Me</a>

如果我们能够在markdown中精心设计,我们就应该能够修改生成的HTML。

exploit

最初的漏洞利用十分简单,从上面的代码来看,我们可以从href属性中转义,并添加一些在DOM事件上触发的脚本。或者,我们直接将代码放在href中。

<a href="javascript:alert('XSS')">Click Me</a>

将payload放在括号中

[Click Me](javascript:alert('Uh oh...'))

果不其然,这奏效了。现在我们有了一个链接,当我们点击它时,它会弹出一个警告。这表明前端和后端都没有将markdown视为XSS向量,或者没有正确地进行处理。

这是就完了吗?

首先,在执行JavaScript之前,用户必须实际单击该链接。理想情况下,我们希望仅通过访问页面来执行它。其次,一个恶意链接没有什么效果,那这次攻击就毫无意义。我们需要在页面加载并在用户不知道的情况下,悄无声息地利用漏洞展开攻击。这让我们将视角切回到图像文件。如果我们可以创建一个图像并将脚本设置为在加载图像时运行,那么响应页面看起来就像预期的那样,我们的攻击代码将在后台运行。

再进一步!

回到markdown中的图像语法

![The goodest boy](https://images.unsplash.com/the_good_boy.png)

这是最终的HTML:

<img src="https://images.unsplash.com/the_good_boy.png" alt="The goodest boy">

当然,我们可以将相同的payload放在括号中触发XSS。但这并没有什么意义。很重要的一点是:

markdown如何渲染为HTML,因markdow不同而异。

在Markdown中将JavaScript注入图像代码的最佳方式

![Uh oh...]("onerror="alert('XSS'))

这是我发现的第一个payload。当JavaScript代码直接放置在src或alt属性中时,似乎无法执行,但我可以关闭src属性并添加更多属性。这个过程为:

<img src="" onerror="alert('XSS') alt="Uh oh...">

由于src值为空,因此加载图像将导致代码执行错误。所以我这样构造:

![Uh oh...](https://www.example.com/image.png"onload="alert('XSS'))

事实证明,我们仍然可以添加源链接并添加onload属性,该属性在页面加载后执行。

谢谢阅读!

总结

聪明的开发者面对这种情况也做了充分的准备,做好渗透测试同样也非常重要,bug bounty计划也为应用程序的安全保驾护航,但开发人员也要时刻保持警醒,满足功能需求的同时也必须考虑安全性。当你在外面进行测试的时候,不要忘记markdown,这里有一个有效负载列表供您使用。

https://blog.usejournal.com/exploiting-xss-via-markdown-72a61e774bf8

本文分享自微信公众号 - nginx遇上redis(GGame_over_the_world)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nginx的11个阶段概述

    // 将请求URI与location表达式匹配前,修改URI,即重定向阶段

    随心助手
  • PhantomJS基础

    PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and...

    随心助手
  • go.mod

    Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。

    随心助手
  • Angular 服务

    本节课的重构完成之后,HeroesComponent 变得更精简,并且聚焦于为它的视图提供支持。这也让它更容易使用模拟服务进行单元测试。

    HoneyMoose
  • 有效防止softmax计算时上溢出(overflow)和下溢出(underflow)的方法

    《Deep Learning》(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了...

    郭耀华
  • 有效防止softmax计算时上溢出(overflow)和下溢出(underflow)的方法

    郭耀华
  • 编程小白 | 每日一练(36)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • 蛋白质组学第3期-蛋白质组学的三大元素

    员工放假,我懒得排版,所以导出图片给大家看,如果觉得不够清晰,点击文末的阅读原文也可以查看文字版,谢谢!

    生信技能树
  • Google 开源 Docker 镜像差异分析工具 container-diff

    Google 发布了一个名为 container-diff 的开源项目,这是一个分析和比较容器镜像的工具,可用来分析 Docker 镜像之间的差异。

    Debian中国
  • redis--redis部署

    https://www.cnblogs.com/ttlx/p/11611086.html

    eadela

扫码关注云+社区

领取腾讯云代金券