SECCON Beginners CTF 2021 writeup(web:check_url)

※本サイトはアフィリエイト広告を利用しています。
広告

SECCON Beginners CTFと本記事について

2021年5月22日と2021年5月23日に開催された「SECCON Beginners CTF 2021」の「web」の「check_url」問題について、解きましたので、手順を詳細に記載します。

web(check_url)

以下の問題文に記載がありますが、curlコマンドを使った問題のようです。
SECCON Beginners CTF 2021_web_check_url(1)

問題のWebサイトにアクセスすると、以下の画面が表示されます。
SECCON Beginners CTF 2021_web_check_url(2)
「like this」がリンクになっているため、クリックすると、以下の画面が表示されます。
URLを確認すると、パラメータにFQDNが表示されているため、任意のWebサイトを指定できるように見えます。
SECCON Beginners CTF 2021_web_check_url(3)

どのような操作をしたら、フラグが表示されるか分からないため、提供されたファイルを確認します。
提供されたファイルは以下の通りです。

<!-- HTML Template -->
          <?php
            error_reporting(0);
            if ($_SERVER["REMOTE_ADDR"] === "127.0.0.1"){
              echo "Hi, Admin or SSSSRFer<br>";
              echo "********************FLAG********************";
            }else{
              echo "Here, take this<br>";
              $url = $_GET["url"];
              if ($url !== "https://www.example.com"){
                $url = preg_replace("/[^a-zA-Z0-9\/:]+/u", "👻", $url); //Super sanitizing
              }
              if(stripos($url,"localhost") !== false || stripos($url,"apache") !== false){
                die("do not hack me!");
              }
              echo "URL: ".$url."<br>";
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $url);
              curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 2000);
              curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
              echo "<iframe srcdoc='";
              curl_exec($ch);
              echo "' width='750' height='500'></iframe>";
              curl_close($ch);
            }
          ?>
<!-- HTML Template -->

以下の箇所を確認したところ、送信元IPアドレスが「127.0.0.1」である場合にフラグが表示されることが分かります。

            if ($_SERVER["REMOTE_ADDR"] === "127.0.0.1"){
              echo "Hi, Admin or SSSSRFer<br>";
              echo "********************FLAG********************";
            }


送信元IPアドレスが「127.0.0.1」になるには、以下の流れで動作したら

  1. PCがWebサーバに「curl http://127.0.0.1/」の実行命令をする。
  2. Webサーバが「curl http://127.0.0.1/」を実行する。
  3. Webサーバに送信元IPアドレスが「127.0.0.1」の通信があったため、フラグ表示する。
  4. WebサーバからPCにフラグを含むデータを返す。

図にすると、以下のようになります。
SECCON Beginners CTF 2021_web_check_url(4)

パラメータを「url=http://127.0.0.1」にしてWebサイトにアクセスします。
しかし、文字がお化けのアイコンに代わって、フラグが表示されません。
SECCON Beginners CTF 2021_web_check_url(5)

再度提供されたプログラムを以下のプログラムが記載されています。
そのため、「aからz」と「AからZ」と「0から9」の3種類以外の文字列はお化けのアイコンに置換されてしまいます。
また、大文字小文字問わず「localhost」と「apache」があった場合も強制終了されてしまいます。

              $url = $_GET["url"];
              if ($url !== "https://www.example.com"){
                $url = preg_replace("/[^a-zA-Z0-9\/:]+/u", "👻", $url); //Super sanitizing
              }
              if(stripos($url,"localhost") !== false || stripos($url,"apache") !== false){
                die("do not hack me!");
              }


上記の条件で「127.0.0.1」を指定する必要があるため、16進数に変換した「0x7F000001」をurlパラメータで送信しました。
SECCON Beginners CTF 2021_web_check_url(6)

フラグ(ctf4b{5555rf_15_53rv3r_51d3_5up3r_54n171z3d_r3qu357_f0r63ry})が表示されました。

SECCON Beginners CTF 2021に関する記事

SECCON Beginners CTF 2021についての関連記事は以下の通りです。
必要に応じて、ご確認ください。

Noタイトル記事の概要
1SECCON Beginners CTF 2021 writeup以下のカテゴリの問題のwriteupを記載します。
【カテゴリ:welcome】
  ・welcome
【カテゴリ:crypto】
  ・imple_RSA
【カテゴリ:reversing】
  ・only_read
  ・children
【カテゴリ:pwnable】
  ・rewriter
【カテゴリ:web】
  ・osoba
【カテゴリ:misc】
  ・git-leak
  ・Mail_Address_Validator
2SECCON Beginners CTF 2021 writeup
(crypto:simple_RSA)
cryptカテゴリのsimple_RSAの問題の
writeupを記載します。
3SECCON Beginners CTF 2021 writeup
(crypto:Logical_SEESAW)
cryptカテゴリのLogical_SEESAWの問題の
writeupを記載します。
4SECCON Beginners CTF 2021 writeup
(crypto:GFM)
cryptカテゴリのGFMの問題の
writeupを記載します。
5SECCON Beginners CTF 2021 writeup
(crypto:Imaginary)
cryptカテゴリのImaginaryの問題の
writeupを記載します。
6SECCON Beginners CTF 2021 writeup
(web:Werewolf)
webカテゴリのWerewolfの問題の
writeupを記載します。
7SECCON Beginners CTF 2021 writeup
(web:check_url)
webカテゴリのcheck_urlの問題の
writeupを記載します。
8SECCON Beginners CTF 2021 writeup
(web:json)
webカテゴリのjsonの問題の
writeupを記載します。
9SECCON Beginners CTF 2021 writeup
(web:cant_use_db)
webカテゴリのcant_use_dbの問題の
writeupを記載します。