前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Markdown也有xss

Markdown也有xss

作者头像
随心助手
发布2019-10-15 12:02:58
2.5K0
发布2019-10-15 12:02:58
举报
文章被收录于专栏:nginx遇上redisnginx遇上redis

作者:惊鸿一瞥最是珍贵

前言

最近我测试一个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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx遇上redis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 何为Markdown?
  • 怎么在markdown中触发XSS?
  • 再探Markdown
  • exploit
  • 这是就完了吗?
  • 再进一步!
  • 总结
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档