美文网首页
[转载]Markdown's-XSS-Vulnerabi

[转载]Markdown's-XSS-Vulnerabi

作者: 穆弋 | 来源:发表于2016-04-08 08:53 被阅读180次

Introduction

Cross-side scripting is a well known technique to gain access to private information of the users of a website. The attacker injects spurious HTML content (a script) on the web page which will read the user’s cookies and do something bad with it (like steal credentials). As a countermeasure, you should filter any suspicious content coming from user input. Showdown doesn’t include an XSS filter, so you must provide your own. But be careful in how you do it…

Markdown is inherently unsafe

Markdown syntax allows for arbitrary HTML to be included. For instance, this is perfectly valid markdown:

This is a regular paragraph.

<table>
    <tr><td>Foo</td></tr>
</table>

This is another regular paragraph.

This means a malicious user could do something like this:

This is a regular paragraph.

<script>alert('xss');</script>

This is another regular paragraph.

While alert('xss'); is hardly problematic (maybe just annoying) a real scenario might be a lot worse. Obviously, this kind of straightforward attack can be easily prevented. For instance, Showdown could provide some kind of whitelist where only certain HTML tags are allowed. However, this can be easily circumvented...

Whitelist / Blacklist can't prevent XSS

Consider the following markdown content:

hello <a href="www.google.com">*you*</a>

As you see, it's a link, nothing really malicious about this. And <a> tags are pretty innocuous right? Showdown should definitely allow <a> tags. What if the content is altered slightly, like this:

hello <a name="n" href="javascript:alert('xss')">*you*</a>

Now this is a lot more problematic. Once again, it's not that hard to filter Showdown's input to expunge problematic attributes (such as href in <a> tags) of scripting attacks. In fact, a regular HTML XSS prevention library will probably catch this kind of straightforward attack.

At this point you're probably thinking that the best way is to follow Stackoverflow's cue and simply disallow embedded HTML in markdown. Well, unfortunately it's not enough.

Striping HTML tags is not enough

Consider the following markdown input:

[some text](javascript:alert('xss'))

Showdown will correctly parse this piece of markdown input as:

<a href="javascript:alert('xss')">some text</a>

In this case, it was Markdown's syntax itself to create the dangerous link. No HTML XSS filter can catch this. And unless you start striping dangerous words like javascript (which would make this article extremely hard to write), there's nothing you can really do to filter XSS attacks from your input. Things get even harder when you tightly mix HTML with Markdown.

Mixed HTML/Markdown XSS attack

Consider the following piece of markdown:

> hello <a name="n"
> href="javascript:alert('xss')">*you*</a>

If we apply a XSS filter to this Markdown input to filter bad HTML, the XSS filter, expecting HTML, will likely think the <a> tag ends with the first character on the second line and will leave the text snippet untouched. It will probably fail to see that the href="javascript:…" thing is part of the <a> element and leave it alone. But when Markdown converts this to HTML, you get this:

<blockquote>
 <p>hello <a name="n"
 href="javascript:alert('xss')"><em>you</em></a></p>
</blockquote>

After parsing with Markdown, the first > on the second line disappears because it is used as the blockquote marker in the Markdown blockquote syntax, and now you’ve got a link containing an XSS attack!

Did Markdown generate the HTML? No, the HTML was already in plain sight in the input. The XSS filter couldn’t catch it because the input doesn’t follow HTML’s rules: it’s a mix of Markdown and HTML and the filter doesn’t know a dime about Markdown.

Mitigating XSS

So, is it all lost? Not really. The answer is not to filter the input, but rather the output. After the input text is converted into full fledged HTML, you can then reliably apply the correct XSS filters to remove any dangerous or malicious content.

Also, client-side validations are not reliable. This should be a given, but in case you're wondering, you should (almost) never trust data sent by the client. If there's some critical operation you must perform to the data (such as XSS filtering), it should be done SERVER SIDE not client side.

HTML XSS filtering libraries are useful here, since they prevent most of the attacks. However, you should not use them blindly: a library can't predict all the contexts and situation you application may face.

Conclusion

Showdown tries to convert the input text as closely as possible, without any concerns for XSS attacks or malicious intent. So, the basic rules are:

  • removing HTML entities from markdown does not prevent XSS. Markdown syntax can generate XSS attacks.
  • XSS filtering should be done AFTER Showdown has processed any input, not before or during. If you filter before, it’ll break some of Markdown’s features and will leave security holes.
  • perform the necessary filtering server-side, not client side. XSS filtering libraries are useful but shouldn't be used blindly.

Disclaimer

This wiki page is based on "Markdown and XSS" excellent article by Michel Fortin

相关文章

  • [转载]Markdown's-XSS-Vulnerabi

    Introduction Cross-side scripting is a well known techniq...

  • 转载转载!

    曾被电影《一代宗师》中的一句经典台词深深触动,就是“见自己,见天地,见众生”,这是一个武师成为一代宗师必经的三个阶...

  • 转载转载!

    校长没错,就应该随机听课。 试想一下:学生正在全神贯注听老师讲课,老师正在专心讲课,校长这时推门而进,肯定是影响了...

  • D80 转载转载转载!

    今天阅读了《教室里的正面管教》第4章——人民为什么那样做。 一个行为不良的学生,是一个丧失了信心的学生。当...

  • D88 转载转载转载!

    我在二类高中任教,学生基础差,领导管理经验不足,只想着怎么抓学生纪律,用班风评比压班主任,班主任只想着怎么不被扣分...

  • D101 转载转载转载!

    何老师: 近段时间,受新冠疫情影响,在学校组织下我们开始了线上教学,现将我所教数学学科授课及学习情况总结如下: 一...

  • D102 转载转载转载!

    截止目前,我们一共观察了42节数学课堂,统计了所有记录的数据之后,从整体上对比新、旧学习习惯的频次,看出旧学习习惯...

  • D104 转载转载转载!

    思辨性阅读,需要合理的课程设计与教学安排,需要合理的阅读规划与必要的思维引导。 思维具有目的性,真正的思维活动必须...

  • D110 转载转载转载!

    1.只有学习才能让自己觉得没有虚度光阴,刷视频以后只有空虚。不要因为寂寞空虚就放纵自己,每天学习充实自己的大脑,就...

  • D106 转载转载转载!

    昨天朋友问我:你这么瘦怎么跑得动马拉松? 我说:我是因为跑了马拉松才瘦的。(马拉松需要提前跑步训练) 曾经也有人问...

网友评论

      本文标题:[转载]Markdown's-XSS-Vulnerabi

      本文链接:https://www.haomeiwen.com/subject/vmrvlttx.html