【picoCTF】Bookmarklet - ブックマークレットでフラグを復号して表示する

問題概要

picoCTFの「Bookmarklet」という問題の解説記事です。

  • カテゴリ: Web Exploitation
  • 難易度: Easy

問題文

picoCTF Bookmarklet

解説

ステップ1: Webページの確認

問題には以下のように記されています:

Why search for the flag when I can make a bookmarklet to print it for me?

ブックマークレットを使ってフラグを取得する問題なのでしょうか?


問題文中のリンクをクリックして、Webページを開きます。

Bookmarklet Page

Webページでは以下のようなJavaScriptが提供されています。

        javascript:(function() {
            var encryptedFlag = "àÒÆÞ¦È¬ë٣֖ÓÚåÛÑ¢ÕӜÒËɧœ©™í";
            var key = "picoctf";
            var decryptedFlag = "";
            for (var i = 0; i < encryptedFlag.length; i++) {
                decryptedFlag += String.fromCharCode((encryptedFlag.charCodeAt(i) - key.charCodeAt(i % key.length) + 256) % 256);
            }
            alert(decryptedFlag);
        })();
最後に alert(decryptedFlag); とあるので、フラグが復号されてアラートで表示されるようです。 このJavaScriptコードをbookmarkletとしてブラウザに登録して実行することで、フラグを取得できるようです。

ステップ2: bookmarkletの登録と実行

ブラウザのブックマークバーに新しいブックマークを作成し、「編集」をクリックし、URL欄に上記のjavascriptコードを貼り付けます。

Bookmarklet Creation

登録したbookmarkletをクリックすると、JavaScriptのアラートが表示され、フラグが表示されます。

Flag Alert

※フラグはマスクしています。


つまずきポイント(補足)

bookmarkletが実行できない/クリックしても何も起きない

ブラウザや設定によっては、ブックマークのURL欄に javascript: を含む文字列がうまく保存できないことがあります。

その場合は、

  • まずは「開発者ツールのConsoleで実行(ステップ3)」でフラグを取る
  • 別ブラウザ(Chrome/Firefox など)で試す

のどちらかが手早いです。


コードをそのまま貼ると改行が邪魔になる

bookmarkletとして登録するときは、改行や余分な空白が原因で動かないことがあります。 うまく動かない場合は、ワンライナーに整形してから貼り付けるのも手です。


使ったものの軽い解説

bookmarklet(ブックマークレット)

ブックマークのURLに javascript:(function(){ ... })(); のようなコードを登録し、クリックで実行できる仕組みです。 「よく使う操作をボタン化する」用途にも使われます。

まとめ

この問題は、ページ内に提示されたJavaScript(bookmarklet)を実行して、暗号化された文字列を復号するタイプでした。

▼ポイントは次の通りです。

  • まずは提示されたコードを読んで、最終的に何が表示されるかを確認する(今回は alert(decryptedFlag)
  • bookmarkletが面倒なときは、Console(コンソール)で復号処理だけ実行してもOK

閲覧ありがとうございました!

NEXT
次におすすめ

【picoCTF】Unminify - minifyされたHTML/JSを整形して埋め込みフラグを発見

カテゴリ: Web Exploitation難易度: Easy#picoCTF
次の記事へ →
同じカテゴリ/難易度/picoCTFでの表示順が近い記事を優先しておすすめしています。