加藤祐介ブログ

AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦

記事投稿日: 2024年9月8日(日)

最終更新日: 2024年9月8日(日)

目次

はじめに

はじめに

リアルタイムではないですが、AlpacaHack Round 2の問題に挑戦してみます。 今回は最初の問題の「Simple Login」を解いてみます。 ジャンルとしては「Web」とのことです。 CTFの問題はまだ数問しか解いたことがないので初心者も初心者ですが、 調べながらやっていこうと思います。

AlpacaHack Round 2のトップページ

AlpacaHack

AlpacaHackへのリンクはこちら

AlpacaHackのサイトへのリンク

私のCTF環境

前回の記事

2024年8月19日の記事です。

AlpacaHackで始めるCTF入門3:初めてのCTFに参加

Simple Login

問題を確認

問題はこんな感じです。 ログイン処理があるウェブサイトが題材のようです。 これまでCTFに参加してこなかったのでCTFの普通というものが分かっていないですが、基本的にはCTFでは問題文的なものはないっぽいです(もちろん問題文があるコンテストもあるとは思います)。 flagを回収するというルールは変わらないので問題文は必要ないのかもしれません。

問題情報

問題用サーバにアクセスしてみる

「simple-login.tar.gz」をクリックすると問題のデータをダウンロードできます。 「.tar.gz」は圧縮ファイルなので展開します。 中身を確認するとウェブサイトのトップページとログインページのHTMLファイル、サーバ側の処理のPythonスクリプト、データベースのファイルが存在しています。

次に「Spawn Challenge Server」ボタンをクリックして問題用サーバを起動します。 とりあえずアクセスしてみるとログイン画面が表示されます。 データベースのファイルを読んでみるとユーザ名が`admin`でパスワードが`pass`のユーザデータがあるっぽいので入力してみます (`hacker`というユーザもいる)。

INSERT INTO users (username, password) VALUES ('admin', 'pass');
INSERT INTO users (username, password) VALUES ('hacker', '1337');

ログイン画面↓

ログイン画面

ログインできるとこのような表示になります↓

ログインできた

flagの場所を確認

データベースのファイルを読んでみると「flag」が挿入されている箇所が見つかるので、おそらくデータベースからflagを奪取できれば良いのだろうと分かります。

INSERT INTO flag (value) VALUES ('Alpaca{REDACTED}');

flagを奪取する方針

ウェブ上での動作は確認できたのでサーバ側の処理も確認します。 Pythonスクリプトを読んでみるとログインページにPOSTされた時に、 データベースからユーザ情報を照合しているようです。 つまりここでSQLインジェクションを行える可能性があります。

該当箇所は下記の一行です。ここではPOSTされた時の`username`と`password`を使ってデータベースでユーザ情報を照合しているようです。 処理としては`users`というテーブルの中に`username`と`password`が一致するデータがあるかどうか調べています。

f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"

ここの処理で何とかして`flag`テーブルからflagの文字列を奪取したいです。

POSTしてみる

下記のPythonスクリプトをログインページへPOSTすると`200`が返ってきて、ログイン後のトップページのHTMLも取得できます。

import requests
response = requests.post("http://<Server-Address>/login", data={'username': 'admin', 'password': 'pass'})
print(response.status_code)
print(response.text)

SQLインジェクションの試み

SQLへの操作を行う一文では`username`と`password`をそのまま入れ込んでいるので、ここでいい感じにSQLインジェクションを行いたいです。 ChatGPTにSQLインジェクションについて質問したところ、シングルクウォートを`username`か`password`に入れて予期せぬ操作を行うのが基本らしいです。 ただし、app.pyではシングルクウォートが入らないようにif文で予防しているのでそのままでは無理そうです。とはいえ`\'`でシングルクウォートをエスケープはできそうです。

`username`に`\`を入力するとエラーが出ます↓

500
Error: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1")

ChatGPTが`OR 1=1`と書けば条件が常に`true`になると教えてくれたので、POSTするデータを下記のように変更したところ、無事ログインできました。

data={'username': '\\', 'password': 'OR 1=1 #'}

あとはflagのテーブルからflagの文字列を取得すれば良さそうですが、SQLの知識が無くて現状flagは取得できていません。 SQLインジェクションについては何となく理解できたので、 続きは他の方のwrite upなどを参考にしてみようと思います。

おわりに

今回はAlpacaHack Round 2の問題「Simple login」に挑戦してみました。 結果的には解けていませんが、SQLインジェクションについて理解が深まったので良かったです。 またAlpacaHackには挑戦していきたいと思います。 おもしろかったです! それでは、また。

お知らせ

過去のお知らせ

シリーズ記事一覧

各シリーズの記事を下記にまとめてあります。

セキセイインコ「れもん」の日記 インコ仲間「れもん&ぽぽ」の日記11 : ズグロシロハラインコのぽぽ、我が家へ セキセイインコ「れもん」の日記10 : 生後100日のれもん、ついに喋る セキセイインコ「れもん」の日記9 : 換羽期のれもん セキセイインコ「れもん」の日記8 : 病院へ挑戦! セキセイインコ「れもん」の日記7 : 外出用ゲージにチャレンジ! セキセイインコ「れもん」の日記6 : 新宿ことり博に行ってきました! セキセイインコ「れもん」の日記5 : 3週間経って順調に成長している模様 セキセイインコ「れもん」の日記4 : 鳥フェス千葉2024に行ってきました! セキセイインコ「れもん」の日記3 : 2週間経って我が家にも慣れてきた模様 セキセイインコ「れもん」の日記:第2回 セキセイインコの「れもん」が我が家にやってきました!
AlpacaHackで始めるCTF入門 AlpacaHackで始めるCTF入門4:AlpacaHack Round 2 - Simple Loginに挑戦 AlpacaHackで始めるCTF入門3:初めてのCTFに参加 AlpacaHackで始めるCTF入門2:DreamhackでCTF入門 AlpacaHackで始めるCTF入門1:初めてのCTF
シェル芸 第66回シェル芸勉強会メモ 第64回シェル芸勉強会メモ ChatGPTでシェル芸勉強会の問題が解きたい シェル芸botで遊びたい(Bash)
ROS 2 ROS 2 Humble 公式チュートリアル 02: ROS 2 のノード関係のコマンド ROS 2 Humble 公式チュートリアル 01: 環境構築から turtlesim まで
料理日記 料理日記:鶏肉の照り焼き&小松菜のおひたし 料理日記:納豆蕎麦 料理日記:ローストビーフ 料理日記:バターガーリックチキン
その他 JR東日本公式のお忘れ物チャットにお世話になった話 HTMLとCSSで画像のスライドショーを作成 GitHub Actionsでサーバ上のブログを自動更新 『Omega Crafter』プレイ日記: チュートリアル編 自作ブログ大改造計画 Windows と Ubuntu のデュアルブート HTML数式表示テスト 自作ブログ開始

加藤祐介ブログの著作物はCC BY-NC-ND 4.0で公開されています。
加藤祐介ブログのソフトウェアはApache License 2.0で公開されています。
About License: GitHub - YusukeKatoBlog/LICENSE
© 2023 YusukeKato All Rights Reserved.