今回は、HTB(Hack The Box)Labの「Starting Point」のTier 1マシン「Appointment」を攻略していきます。

「Appointment」は、SQLデータベースの脆弱性について学習できるマシンです。

マシンを攻略する前に、SQLデータベースについて簡単に調べておくと、効率的に学習を進められます。


なお、本記事では、Kali LinuxからHTBへVPN接続して、マシンを攻略します。

まだ、環境構築が済んでいない方は、以下の記事をご覧ください。


サイバーセキュリティ入門‐環境構築編1|VirtualBoxの導入

サイバーセキュリティ入門‐環境構築編2|Kali Linuxの導入と初期設定

サイバーセキュリティ入門‐環境構築編3|HTBのアカウント作成とVPN接続


※本サイトでは、HTBの記事作成ガイドラインに沿って、記事を作成しています。

1.「Appointment」の学習準備

まずは、以下の手順に従って、「Appointment」の学習準備を済ませましょう。



上記の手順は、別の「Starting Point」マシン攻略でも流れは共通です。

今回初めて「HTBのマシン攻略」に触れるという方は、以下の記事で学習準備について詳しく解説しているので、参考にしてください。


サイバーセキュリティ入門‐実践編1|実際にHTBのマシン「Meow」を攻略してみよう


1-1.取得したIPアドレスを変数に入れておこう

上記の「Start Machine」からマシンを起動したあと、画面にIPアドレスが表示されます。

マシンの攻略では、このIPアドレスを度々使うのですが、毎回入力するのは手間です。

そこで、IPアドレスに名前をつけて保存し、簡単に使えるようにしましょう。


ターミナルを開き、以下のコマンドを実行します。


$ exportIP={IPアドレス}


これで、IPアドレスを以下のように、「$IP」で使えるようになりました。


変数の使用例

$ echo $IP
$ ftp $IP
$ nmap $IP


回答時の注意点

HTBのVPNに接続する際、フルトンネル(全ての通信が強制的にHTBにルーティングされる)になることがあります。

そうした場合、Webブラウザで開いている学習ページへのアクセスも「HTB内部ネットワーク経由」になり、接続が不安定になる場合があります。

その結果、「Task」や「Submit Flag」の送信時、通信エラーが発生する場合があります。


「Task」や「Submit Flag」の送信に失敗する場合は、以下の方法を試してみてください。


一度VPN接続を切ってから、Task等を送信する

Kali Linux側のブラウザではなく、Windows側のブラウザで、Task等を送信する


2.Task1「What does the acronym SQL stand for?」

設問の意味は、「SQLは何の略ですか?」です。


Task1の正解は「Structured Query Language」です。


SQLとは

SQLは、リレーショナルデータベース(RDBMS/SQLデータベース)のデータを管理するための言語で、以下のような操作が可能です。


SQLの操作例

  • データベースの作成
  • データの追加・削除・更新・読み取り
  • データの検索・集計・加工
  • トランザクション処理


なお、SQLで操作できるデータベースとしては、「MySQL」「Maria DB」「PostgreSQL」「SQLite」といったシステムが挙げられます。


3.Task2「What is one of the most common type of SQL vulnerabilities?」

設問の意味は、「SQLの脆弱性の中で最も一般的なものは何ですか?」です。


Task2の正解は「SQL injection」です。


SQLインジェクションとは

SQLインジェクション(SQL Injection / SQLi)は、外部から悪意のあるSQLを実行して、データベースを不正に操作することです。

SQLインジェクションの想定される被害としては、データの破壊や改ざん、情報漏洩、システムの破壊などが挙げられます。

参考:安全なウェブサイトの作り方 - 1.1 SQLインジェクション | 情報セキュリティ | IPA 独立行政法人 情報処理推進機構


4.Task3「What is the 2021 OWASP Top 10 classification for this vulnerability?」

設問の意味は、「OWASPトップ10の2021年版において、SQLインジェクションは何に分類されていますか?」です。


「OWASPトップ10」は、Webアプリケーションのセキュリティ分野で活動している非営利団体が取りまとめたガイドラインです。

具体的には、Webアプリケーションに関するセキュリティリスクについて、特に重大な10項目をまとめた資料です。

実際に、OWASP Top 10 - 2021を開いて、SQLインジェクションの順位を確認してみると、以下のような記述があります。


A03:2021-Injection slides down to the third position. 94% of the applications were tested for some form of injection with a max incidence rate of 19%, an average incidence rate of 3.37%, and the 33 CWEs mapped into this category have the second most occurrences in applications with 274k occurrences. Cross-site Scripting is now part of this category in this edition.
A03:2021-インジェクション は、3位に下がっています。94%のアプリケーションで何らかのインジェクションに関する問題が確認されています。最大発生率は19%、平均発生率は3.37%であり、このカテゴリにあたる33のCWEは、アプリケーションでの発生数が2番目に多く見られます。発生数は27万4千件でした。今回から、クロスサイトスクリプティングは、このカテゴリに含まれています。
参考:OWASP Top 10 - 2021


上記より、Task3の正解は「A03:2021-Injection」と分かります。


※「OWASPトップ10」の最新版(2025年)が公開されています。

※最新のセキュリティリスクランキングはIntroduction - OWASP Top 10:2025をご覧ください。


5.Task4「What does Nmap report as the service and version that are running on port 80 of the target?」

設問の意味は、「Nmapによるポートスキャンの結果から、ターゲット(「Appointment」マシン)のポート80で稼働しているサービスとそのバージョンはどのようなものだと分かりますか?」です。


では、実際にターミナルを開いて、以下のコマンドでポートスキャンをしてみましょう。


$ nmap -sV -p80 $IP

※「-sV」:サービスとバージョンの検出に使うオプション。

※「-p{ポート番号}」:スキャンするポートを指定するオプション。


すると、以下のようなスキャン結果が得られます。

https://i.gyazo.com/7232d2f2b2b736cc1400db462faef2f1.png※「Debian」:Linuxディストリビューションの1種で、サーバー構築によく用いられる。

※「Apache httpd」:ApacheというWebサーバの常駐プログラム。


上記から、「Appointment」マシンでは、Webサーバーが稼働していることが分かりました。

では、試しに、ブラウザで開いて、マシンのIPアドレスにアクセスしてみましょう。

すると、以下のような画面が表示されます。

https://i.gyazo.com/f6f6cfe630ffb69c6c645f1aed6d3242.jpg

調査の結果通り、Webサーバーにあるページが表示されます。

以上より、Task4の正解は「Apache httpd 2.4.38 ((Debian))」と分かります。


6.Task5「What is the standard port used for the HTTPS protocol?」

設問の意味は、「HTTPSプロトコルで一般的に使用されるポート番号は何ですか?」です。


では、Service Name and Transport Protocol Port Number Registryで調べてみましょう。

検索欄に「https」と入力します。

すると、以下のような検索結果が表示されます。

https://i.gyazo.com/68f941f5c29197426d8210d6c7570e7b.png

検索結果からは、TCPでもUDPでも共に443番ポートが使用されていることが分かります。

よって、Task5の正解は「443」です。


7.Task6「What is a folder called in web-application terminology?」

設問の意味は、「Webアプリケーションの用語で、フォルダは何と呼ばれますか?」です。


Task6の正解は「directory」です。


8.Task7「What is the HTTP response code that is returned for Not Found errors?」

設問の意味は、「Not Foundエラーに対して返されるHTTPレスポンスコードは何ですか?」です。


Task7の正解は「404」です。


「Not Found」とは

「Not Found」は、Webサーバーがリクエストされたページやファイルを見つけられない場合に返すエラーです。

例えば、GitHubででたらめなURLを入力してアクセスしてみましょう。

すると、以下のような「Not Found」エラー画面が表示されると思います。

https://i.gyazo.com/3b4ac9ae57fc2ff29cee552df76896b5.png

一昔前は、Webサーバーに用意されているデフォルトの404ページを使っている企業が多かったようですが、現在は自社でカスタマイズした404ページを使用している場合も増えています。


9.Task8「Gobuster is one tool used to brute force directories on a webserver. What switch do we use with Gobuster to specify we're looking to discover directories, and not subdomains?」

設問の意味は、「Gobusterは、Webサーバー上のディレクトリを総当たりで探すために使用されるツールの1つです。Gobusterで、サブドメインではなくディレクトリを検出するためには、どのようなオプションを使いますか?」です。


Task7の正解は「dir」です。


では、実際にGobusterを使って、「Appointment」マシンのWebサーバー上のディレクトリを総当たりで探してみましょう。


Gobusterは、総当たりでディレクトリを探すために、ワードリスト(今回であれば、Webサーバーのディレクトリ名によく使われる単語を羅列したテキストファイル)を指定して実行する必要があります。

今回は、「/usr/share/wordlists/dirb/」フォルダにある「common.txt」というワードリストを使ってディレクトリを探してみましょう。


ターミナルを開いて、以下のコマンドを実行します。


$ gobuster dir -u $IP-w /usr/share/wordlists/dirb/common.txt

※「dir」:ディレクトリ探索を指定するオプション。

※「-u」:ターゲットを指定するオプション。

※「-w」:ワードリストを指定するオプション。


すると、以下のようなスキャン結果が返ってきます。

https://i.gyazo.com/33328d58c647bf5e2d917eec6bfaacf7.png

スキャン結果からは、「/css」「/fonts」「/images」「/js」「/vendor」というディレクトリに現時点でアクセスできることが分かります。


Gobusterで使うワードリスト

デフォルトでKali Linuxにインストールされているワードリストを見てみましょう。

スタートボタンを押して、検索欄に「wordlists」と入力し、一番上のアイコンを押します。

https://i.gyazo.com/97bf5faef69076b1f07c4e5c08470487.png

すると、以下のように、インストールされているワードリストの一覧が表示されます。

https://i.gyazo.com/652c50dd59a80d5b440d97f191bdce0c.png

CTFでは、上記のようなデフォルトで用意されているワードリストを使うこともあれば、自身でカスタマイズしたワードリストを使うこともあります。


なお、SecListsというワードリストも、CTFではよく使われます。

SecListsはデフォルトでインストールされていません。

必要に応じて、インストールしましょう。

参考:Installation – SecLists Documentation 


10.Task9「What single character can be used to comment out the rest of a line in MySQL?」

設問の意味は、「MySQLで、行の残りの部分をコメントアウトできる1文字は何ですか?」です。


MySQL(マイ・エスキューエル/シーケル)は、オープンソースのSQLデータベース管理システムです。

行と列からなる表形式でデータを管理しており、その名の通り、SQL文でデータを操作できます。


SQL文の例

CREATETABLE{テーブル名}(データの定義); # テーブル作成
INSERTINTO{テーブル名}(カラム名,...)VALUES(,...); # レコード追加
SELECT{カラム名,...}FROM{テーブル名}WHERE{絞り込み条件}; # データ取得
UPDATE{テーブル名}SET{更新内容}  {絞り込み条件}; # データ更新


なお、MySQLのコメントアウト構文は、以下の通り4種類あります。


SQL文のコメントアウト構文の例

{SQL} # ここから行末までコメント
{SQL}-- ここから行末までコメント
/* 複数行のコメント */
/*! MYSQL以外のDBではコメント扱い、MYSQLであればSQLとして実行される*/


上記より、Task7の正解は「#」と分かります。


11.Task10「If user input is not handled carefully, it could be interpreted as a comment. Use a comment to login as admin without knowing the password. What is the first word on the webpage returned?」

設問の意味は、「ユーザー入力を慎重に処理しないと、「それ」がコメントとして解釈される可能性があります。コメントを利用すると、パスワードを知らなくても管理者としてログインすることができます。返されるウェブページの最初の単語は何ですか?」です。


ブラウザでIPアドレスを開くと、以下のようなログイン画面が表示されます。

https://i.gyazo.com/f6f6cfe630ffb69c6c645f1aed6d3242.jpg

この設問では、実際に上記ののログイン認証を突破する必要があります。


まずは、Task8のディレクトリ探索で見つけたディレクトリにアクセスして、ログインに有用な手がかりがないか確認しますが、今回は、ディレクトリからログインに有用な情報は得られませんでした。


次に、デフォルトのユーザー名やパスワードでログインできないか、「user」「root」「admin」「pw」「password」などの組み合わせで、ログインを試しましたが、失敗してしまいます。


なお、ログインを試行した際、どのようなデータが送受信されているかも、確認してみましょう。

デベロッパーツール(F12を押して表示されます。)の「Network」タブをみると、以下のようなデータが表示されます。

https://i.gyazo.com/2910eba81af58c386b722ca7859b6c67.png

上記からは、「Login」ボタンを押した際に、POSTリクエストが正常に送受信されていることが分かりました。


では、SQLインジェクションを試してみましょう。

このマシンでは、ログイン時、以下のような処理が行われていると考えられます。


  1. ユーザー名やパスワードを入力して送信(クライアント)
  2. 送信された情報から、SQLのSELECT文を組み立てる(サーバー)
  3. 組み立てたSQLを実行(サーバー)
    1. 1件以上ヒット:認証成功
    2. 0件ヒット:認証失敗
  4. 認証結果に応じて、データをクライアントに返す(サーバー)


上記の通り、Webアプリケーションは、ユーザーが入力したユーザー名やパスワードを用いて、以下のようなSELECT文を組み立てます。


SELECT*FROM{認証情報が記載されたテーブル}WHERE username ={入力したユーザー名}AND password ={入力したパスワード};


SQLインジェクションの仕組みは、WHERE句を「常に真」にすることで、条件一致を壊すことです。

ここでは、もっとも簡単で一般的な「' OR '1'='1」という文字列と、Task7で得られた手がかりを元に、SQLインジェクションをしてみましょう。

例えば、「' OR '1'='1 # 」をユーザー名に入力すると、以下のようなSQL文が組み立てられます。


SELECT*FROM users WHERE username =''OR'1'='1' #' AND password = 'hogehoge';


上記は、「username = '' OR '1'='1'」というWHERE句と、「#' AND password = 'hogehoge';」というコメントに分解できます。

「OR」は、右辺と左辺のどちらかが真であれば、全体も真として評価されます。

よって、「'1'='1'」は常に真であるため、上記のSQL文のWHERE句「username = '' OR '1'='1'」は、常に真となります。


また、Task7から、SQL文において、「#」以降はコメントとして評価されることがわかっています。

そのため、「password = 'hogehoge'」というパスワード部分は、無視されます。


結果、フォームに、



を入力すると、SQL文は全件一致を返し、ログインに成功します。


ログインに成功すると、以下のような画面が表示されます。

https://i.gyazo.com/5d63012885a0f87351c511779e1d317a.png

上記のログイン画面から、Task7の正解であるウェブページの最初の単語は「Congratulations」であることが分かります。


12.Submit Flag

Task10でログインに成功すると、画面に「Your flag is:{ランダム文字列}」と表示されます。

このランダム文字列をSubmit flagに入力すれば、「Appointment」のマシン攻略完了です。

お疲れ様でした。


13.あとがき

今回は「Appointment」というマシンの攻略を通して、



などを学習しました。

今回登場した「MySQL」は、幅広いWebサイトやアプリケーションで活用されているシステムなので、その脆弱性についてはきちんと覚えておきましょう。


今後も引き続き、「Starting Point」のマシンを攻略していくので、ぜひご覧ください。