目次
- hidden
- cookie1
- cookie2
- directry_traversal
- SQL Injection 1
- browsing
- directry_traversal
hidden
セキプロのwebサイトのどこかにflagを隠しました。どこに隠したか分かるかな?
flagの形式はkitsec{}です。
セキプロwebサイト: https://www2.kanazawa-it.ac.jp/kitsec/
アクセスすると、セキプロのホームページにアクセスすることができました。他のページを見てみてもwebページ上では、特に何も表示されていません。
解法
webサイトがどのように書かれているのかを確認するために、webサイトのソースコードを閲覧します。ソースコードの見方はさまざまですが、今回はCtrl+U
を押すことでソースコードを見てみます。
このような感じで、ソースコードが表示されます。どの部分にflagが書いてあるか探索すると、活動内容 | /activity.html
のソースコードを見ると、コメントアウトされているflagを見つけられます。
よってflagはkitsec{hidden_flag_in_code}
になります
cookie1
このアプリケーションには、管理者だけがアクセスできる秘密のページがあるようです。
以下のwebページにアクセスしてFlagを見つけて下さい。
flagの形式はkitsec{}です
https://cookie1.kitsecprj.uk
webページにアクセスすると、ログインページが与えられます。しかし、UsernameとPasswordが分からないので、何も手が付けられません。適当なUsernameとPasswordを入力しても、以下のようなページになるだけです。
adminの権限に昇格する手立てとして何があるだろうと考え、問題のタイトルにもなっているcookie
に注目してみます。
cookieってなに?っていう人がいると思いますが簡単にいうと、サーバがユーザのウェブブラウザに送信する小さなデータのことです。webの第2回目の資料、もしくは以下のリンクを参照してください。
https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies
https://zenn.dev/collabostyle/articles/8949e8db686263
解法
このwebサイトのcookieを画面を確認してみましょう。
chromeの場合cookieの見方は、以下の手順になります。
- 右クリック
- 検証をクリック
- アプリケーションタブを見る
- ストレージ -> Cookieを参照する
この手順でcookieを確認すると、PHPSSID
とis_Admin
というパラメータが見えることが分かります。
is_Admin
というパラメータに注目してみると、値がFalse
になっていることが分かります。is_Admin
のパラメータのTrue/Falseで判定してそうなので、ここをTrue
にしてみるとどうなるでしょう。無事flagがゲットできました。
※ is_Admin
のパラメータをTrue
に書き換えた後、ページ自体をリロードすると変更が反映されます。
flag : kitsec{check_your_cookie_success}
cokkie2
VIP専用コンテンツにアクセスし、隠されたFLAGを見つけ出してください。
flagの形式はkitsec{}です
https://cookie2.kitsecprj.uk/
webページにアクセスすると、ユーザ名のみ入力を求められます。今回もユーザ名が与えられていないので、適当なユーザを入力します。すると以下のような画面に遷移します。
今回も権限エラーのようです。
解法
それでは今回も問題のタイトルとなっているcookieを見てみましょう。cookieを見てみると以下のようになっています。
cookieにはsession
というパラメータが入っていることが分かります。
session
というパラメータにはeyJ1c2VybmFtZSI6ICJoZWxsbyIsICJyb2xlIjogIm5vcm1hbCJ9IA==
が入っていることが分かります。これが怪しいなという検討を付けます。
base64で暗号化されたものの特徴として、末尾に==
がつくという特性があります。
cyberchef (https://gchq.github.io/CyberChef/) を使ってbase64デコードをしてみましょう。デコードした結果が以下のようになります。
この結果からsessionには{"username": "hello", "role": "normal"}
が格納されていることが分かりました。今回はwebサイトに最初にアクセスした際時、VIP専用コンテンツを閲覧する場合はログインして下さいという指示があるので、role: "vip"
にしてみましょう。
するとbase64エンコードした結果がeyJ1c2VybmFtZSI6ICJoZWxsbyIsICJyb2xlIjogInZpcCJ9
になります。
これをsession
に格納して再リロードすると、flagが出現しました。
flag: kitsec{check_cookie2_base64}
SQL Injection1
ログイン画面を操作して管理者の権限を取得し、隠された情報(FLAG)を取得してください。
flagの形式はkitsec{}です
https://sqlin1.kitsecprj.uk/
webページにアクセスすると、Username
とPassword
を操作するログインフォームが与えられます。webページに書かれているとおり、UsernameをBob
、 PasswordをZmlnaHQ
にしてアクセスしてみましょう。すると以下のようなページになります。
ID
とUsername
、rentalbook
という項目が出てきました。
解法
この情報から管理者権限を取得すると、FLAGがゲットできるのではないかという検討を付けます。
そこで問題のタイトルになっているSQL Injectionについて試してみることにします。
SQLInjectionに関しては、webの第1回目の資料について確認してください。
SQL Injectionを試す方法としてはいろいろなものがありますが、一番知られているもので試してみましょう
UsernameとPasswordに' OR '1' = '1
を指定してみましょう
裏で動いているスクリプトは今回見えませんが、この入力により、SQL文が
SELECT * FROM users WHERE username = '' OR '1' = '1' AND password = '' OR '1' = '1'
と解釈されます。
'1' = '1'
が常に真と返されるので、usernameの部分の検証がTRUE
になります。
passwordの部分の検証もusernameの検証と同じくTRUE
になります。
すると、データベース内の情報が全てSQL Injectionによって閲覧することができるようになります。
flag: kitsec{sql_In_jec_tiOn1}
※ 今回はusernameとpasswordに同じものを指定しましたが、他にも突破する方法はあります。気になる方はぜひ他の方法も試してみて下さい。
browsing
このサイトの管理者は公開するべきでない管理者ページを公開してしまいました。隠されたページを探してください。
flagの形式はkitsec{}です
https://browsing.kitsecprj.uk
指定されているwebページにアクセスすると、ログインフォームが与えられます。
UsernameやPasswordを求められますが、これ以外情報が与えられていないため突破するのは困難です。ここで問題文に注目してみましょう。管理者は公開するべきでない管理者ページを公開してみましたと書かれています。
そこで、このサイトについて公開されているページに関しての情報を得ることから始めましょう。
そこで/robots.txt
に注目します。
robots.txtとは?
通常、webサイトのルートに配置されているファイルで、クローラー(ウェブページからデータを収集するために自動的にウェブを閲覧するbot
)からウェブサイトへのアクセスを許可するか、禁止するかを決定するファイル。
解法
それではこのwebサイトのrobots.txtについて確認しましょう
https://browsing.kitsecprj.uk/robots.txt アクセスしてください。
すると、User-agent: *
とDisallow: /admin/
という2つの情報が見られることが分かります。
ここではUser-agent: *
はすべてのウェブクローラーに対して、Disallow: /admin/
配下の URL をクローラーにクロールしないよう指示しています。
このことから、このwebサイトには/admin
というディレクトリがあることが明確になります。試しに https://browsing.kitsecprj.uk/admin にアクセスしてみましょう
このように、403 Forbiddenのレスポンス(サーバがリクエストを許可したものの、処理することを拒否したこと)が分かります。そのため/admin
ディレクトリが存在することの確認が取れました。ここからflagが含まれていると思われるディレクトリ名を推測して入力してみましょう。
今回は https://browsing.kitsecprj.uk/admin/flag にアクセスするとflagをGETすることができます。
※ 今回flagをGETする上で使用した方法を強制ブラウジング
といいます。詳しくは以下の資料を参考にしてみて下さい。(https://e-words.jp/w/%E5%BC%B7%E5%88%B6%E3%83%96%E3%83%A9%E3%82%A6%E3%82%BA.html)
flag: kitsec{forced_browsing_success}
directry_traversal
このwebサイトには秘密のファイルが隠されています。それを探し出して下さい。
flagの形式はkitsec{}です。
https://directry.kitsecprj.uk/
指定されているページにアクセスすると、sekipro cafeという架空のカフェのメニュー表サイトにアクセスすることができます。各メニューを選択すると、商品の詳細ページが表示されます。
解法
この問題を解くうえで、次に何をしたらいいのかを考えます。問題のタイトルが directry_traversal
なので、ディレクトリトラバーサルがどこかで仕掛けられないか確認します。そこで商品の詳細ページにアクセスしたときのurlに注目します。
https://directry.kitsecprj.uk/file?file_name=item1.txt
商品が変わるごとに /file?file_name=
の部分が変化していることが分かります。
そのため、ここからディレクトリトラバーサルが仕掛けられないか試してみましょう。
試しに file?file_name=../
を指定してみます。すると /file?file_name=
が /src/public
内のファイルを参照していることが分かります。
webページに情報を公開するためのディレクトリとして public
が使われていることが推測できるので、秘密の情報が含まれているディレクトリとして、secret
が使われているのではないかと推測できます。
あとは、その中にflagが含まれているのでは?という予想がつくので、最終的に file?file_name=../secret/flag
を指定してみます。するとflagがゲットできます。
flag: kitsec{di_rec_tory_tra_versa_l}
別解(上級者編)
ディレクトリトラバーサルを仕掛けるという点では、同じですが他にも解き方があります。それは直接環境ファイルを参照するという方法です。
環境ファイルを参照する際には、まずは環境変数が入っているファイルについて知る必要があります。環境変数が入っているファイルを指定するときは /proc/self/environ
を指定します。
/proc/
Linux システム上で動作中のプロセスに関連する情報が格納されているディレクトリ
/proc/self/
Webサーバーが処理しているプロセスについて書かれているディレクトリ
/proc/self/environ
実行中のプロセスに関連する「環境変数」を格納しているファイル
プロセスが持つ環境情報(PATH、HTTPヘッダー、セッション情報など)が含まれる
このファイルのpathをディレクトリトラバーサルで指定することで、アクセスすることができるのかを参照することができます。このファイルはルートディレクトリから参照することができるので、適時確認した上でpathを指定します。その結果が以下になります。
参考文献
https://linuc.org/study/knowledge/526/
https://qiita.com/mizutoki79/items/de7d4818a21378820eef
終わりに
これにて学内CTFのwriteup web編の記事を終わります。
今回の学内CTFの解きなおし、解く際に使用した脆弱性の原理や技術、脆弱性が残らないようにするにはどうすればいいのか?などを自分で調べてみるとより理解が深まって、良い学習になると思います。
ありがとうございました。