Nmap で SQL インジェクション実験を行う

Beginner

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

SQL インジェクションは、攻撃者が悪意のある入力を作成し、バックエンドのデータベースで任意の SQL 文を実行することで、Web アプリケーションを悪用するためによく使われる手法です。この実験では、docker を使って sqli-labs を用いた SQL インジェクション環境をセットアップし、実践的な実験を行って、SQL インジェクション脆弱性の原理と悪用方法を理解します。


Skills Graph

インジェクションポイントの特定

こんにちは、Web セキュリティテストの入門コースへようこそ。今回は、潜在的な SQL インジェクション脆弱性の特定に焦点を当てています。SQL インジェクションは、Web アプリケーションにおける一般的で潜在的に壊滅的なセキュリティ上の欠陥ですが、適切な知識を持てば、それを特定し防止する方法を学ぶことができます。

SQL インジェクションとは?

SQL インジェクションは、攻撃者が悪意のある SQL コードを Web アプリケーションのデータベースクエリに挿入する手法です。Web アプリケーションがユーザー入力を適切にサニタイズしない場合、これはデータ漏洩、データの損失、またはその他の深刻な問題につながる可能性があります。

潜在的な SQL インジェクションポイントの特定

データベースとやり取りする Web アプリケーションは、しばしばパラメータを含む URL を持っています。これらのパラメータが適切にサニタイズされていない場合、潜在的に悪用される可能性があります。たとえば、次のような URL があるかもしれません。

http://some-website.com/page.php?id=XX

この URL では、id はデータベースとやり取りするパラメータです。このようなパラメータを使用する Web ページは、入力が適切にサニタイズされていない場合、潜在的に SQL インジェクションに対して脆弱です。

SQL インジェクションのテスト:シングルクォート手法

SQL インジェクション脆弱性をテストする簡単な方法の 1 つは、シングルクォート手法を使用することです。やり方は次の通りです。

  1. URL のパラメータ値にシングルクォート (') を追加します。たとえば、URL を次のように変更することができます。http://some-website.com/page.php?id=1'
  2. エンターキーを押した後に Web ページがエラーを返す場合、そのサイトが SQL インジェクションに対して脆弱である可能性があります。

この手法が機能する理由は、SQL の数値型と文字列型の両方が、不均衡なシングルクォートが導入されると構文エラーを生成するためです。このエラーは、SQL インジェクション脆弱性の存在を明らかにすることができます。

重要な注意事項

シングルクォートを追加してもエラーが表示されない場合、必ずしも SQL インジェクション脆弱性がないというわけではありません。アプリケーションがシングルクォートをフィルタリングしている可能性があり、その場合は他の手法を使用して脆弱性をテストする必要があります。心配しないでください、これらの高度な手法については、将来のレッスンで取り上げます。

覚えておいてください、エシカルハッキングはセキュリティの向上を目的としています。テスト活動においては、常にプライバシーと合法性を尊重してください。楽しく学習しましょう!

SQL インジェクションのタイプを特定する

潜在的な SQL インジェクションポイントを特定するのに素晴らしい仕事をしました!次に、次のステップに移りましょう。SQL インジェクション脆弱性のタイプを特定することです。ここでは、2 つの主要なタイプに焦点を当てます。数値ベースの SQL インジェクションと文字列ベースの SQL インジェクションです。

数値ベースの SQL インジェクション

入力パラメータ(ここでは x と呼びます)が Web アプリケーションによって整数として扱われる場合、SQL クエリは次のようになることがあります。

select * from <table_name> where id = x

数値ベースの SQL インジェクションを特定するには、2 つの単純な論理条件 and 1=1and 1=2 を使用します。方法は次の通りです。

  1. ブラウザに http://some-website.com/page.php?id=x and 1=1 を入力します。ページが正常に読み込まれたら、次のステップに進みます。
  2. 次に、http://some-website.com/page.php?id=x and 1=2 を試してみます。ページがエラーを返すか、異なる動作をする場合、数値ベースの SQL インジェクション脆弱性がある可能性があります。

なぜこれが機能するのでしょうか?

and 1=1 を入力すると、結果の SQL クエリは次のようになります。

select * from <table_name> where id = x and 1=1

条件 1=1 は常に真であるため、ページが正常に読み込まれる場合は、入力が直接 SQL クエリに挿入されていることを示唆しています。

and 1=2 を入力すると、結果の SQL クエリは次のようになります。

select * from <table_name> where id = x and 1=2

条件 1=2 は常に偽であるため、ページが異なる動作をする(エラーを返すなど)場合は、入力が SQL クエリに影響を与えていることを示唆しており、潜在的な SQL インジェクション脆弱性を示しています。

文字列ベースの SQL インジェクション

場合によっては、入力パラメータ x が文字列として扱われます。SQL クエリは次のようになることがあります。

select * from <table_name> where id = 'x'

文字列ベースのインジェクションを特定するには、数値ベースのインジェクションと同様のアプローチを使用しますが、文字列条件 and '1'='1'and '1'='2' を使用します。方法は次の通りです。

  1. ブラウザに http://some-website.com/page.php?id=x' and '1'='1 を入力します。ページが正常に読み込まれたら、次のステップに進みます。
  2. 次に、http://some-website.com/page.php?id=x' and '1'='2 を試してみます。ページがエラーを返すか、異なる動作をする場合、文字列ベースの SQL インジェクション脆弱性がある可能性があります。

なぜこれが機能するのでしょうか?

and '1'='1' を入力すると、結果の SQL クエリは次のようになります。

select * from <table_name> where id = 'x' and '1'='1'

条件 '1'='1' は常に真であるため、ページが正常に読み込まれる場合は、入力が直接 SQL クエリに挿入されていることを示唆しています。

and '1'='2' を入力すると、結果の SQL クエリは次のようになります。

select * from <table_name> where id = 'x' and '1'='2'

条件 '1'='2' は常に偽であるため、ページが異なる動作をする(エラーを返すなど)場合は、入力が SQL クエリに影響を与えていることを示唆しており、潜在的な SQL インジェクション脆弱性を示しています。

どちらの場合も、Web アプリケーションからの異常な応答は、SQL インジェクションポイントを見つけた可能性があることを示すヒントです。ただし、これらのテストを実行する許可を常に確認し、スキルを責任を持って使用するようにしてください。楽しく学習しましょう!

SQL インジェクションを利用した認証バイパス

この実験では、SQL インジェクション脆弱性についてさらに深く掘り下げます。特に、これらの脆弱性を利用してログイン認証を回避する方法、いわゆる「万能パスワード」攻撃に焦点を当てます。

実験環境の準備

まずは、実験環境を準備する必要があります。ここでは、Damn Vulnerable Web Application (DVWA) を使用します。これは、意図的にセキュリティが脆弱な PHP/MySQL の Web アプリケーションで、Web アプリケーションセキュリティを理解するための理想的な学習ツールです。

  1. sqli - labs の Docker イメージをダウンロードする:sqli - labs の Docker イメージは Docker Hub でダウンロードできます。ターミナルで次のコマンドを使用してイメージを取得します。

    docker pull acgpiano/sqli-labs
  2. sqli - labs の Docker コンテナを起動する:イメージのダウンロードが完了したら、次のコマンドを使用してコンテナを起動します。

    docker run -it -d --name sqli-labs -p 80:80 -p 13306:3306 acgpiano/sqli-labs

    このコマンドは新しいコンテナを起動し、コンテナ内のポート 80 と 3306 をそれぞれホストマシンのポート 80 と 13306 にマッピングします。

これらの手順を実行することで、必要な実験環境を正常にセットアップできました。

セットアップが完了したら、Firefox を開き、アドレスバーに http://localhost を入力します。

初めて http://localhost にアクセスする場合は、Setup/reset Database for lab をクリックして実験環境を準備し、その後 Web ページを更新してください。

SQL インジェクションの特定

Less - 11 をクリックすると、シンプルなログインページが表示されます。任意のユーザー名 123 とパスワード 123 を入力してみましょう。

エラーページには「Invalid username or password.」と表示されます。

バックエンドコードの解読

認証プロセスを担当するバックエンドコードを見てみましょう。

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
	$uname=$_POST['uname'];
	$passwd=$_POST['passwd'];

	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'User Name:'.$uname);
	fwrite($fp,'Password:'.$passwd."\n");
	fclose($fp);

	// connectivity
	@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
	$result=mysql_query($sql);
	$row = mysql_fetch_array($result);
....
}

実際に実行される SQL クエリは次の通りです。

SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1

このクエリは簡単に理解できます。usernamepassword が一致する行が返された場合、ログインは成功します。

脆弱性の悪用

前の実験で学んだ知識を活かして、次のペイロードを入力してみましょう。

ユーザー名:123' or 1=1 #
パスワード:123' or 1=1 #

面白いことに、これでログインに成功します!これは、実際に実行される SQL クエリが次のようになるからです。

SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'

MySQL では、# 記号はそれ以降の行をコメントアウトするために使用されるため、クエリは実質的に次のようになります。

SELECT * FROM users WHERE username='123' or 1=1

条件 or 1=1 は常に真であるため、クエリは常に結果を返し、ログインに成功します。

コメント記号を使用しないバリエーションも試してみることができます。

ユーザー名:123' or '1'='1
パスワード:123' or '1'='1

この場合、実行される SQL クエリは次のようになります。

SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'

この場合、2 つの or 条件により、それらの間の and 条件は常に真となり、ログインに成功します。

まとめ

上記のように、SQL インジェクション脆弱性を悪用して認証をバイパスするための多くの手法があります。自由に様々なペイロードを試してみてください。ここでの目標は、これらの脆弱性を理解し、自分のアプリケーションをそれらからより良く保護することです。楽しくエシカルハッキングをしましょう!

まとめ

この実験では、シングルクォート手法を用いて SQL インジェクション脆弱性を特定する方法と、特定のペイロードを使って SQL インジェクションのタイプ(数値ベースまたは文字列ベース)を判断する方法を学びました。また、SQL インジェクション脆弱性を悪用してログイン認証をバイパスする方法、いわゆる「万能パスワード」攻撃として知られる一般的なシナリオについても調査しました。実践的な実験を通じて、入力サニタイズが適切に実装されていない場合に Web アプリケーションに多く見られる SQL インジェクション脆弱性を理解し、悪用する実践的な経験を積むことができました。