2011-06-28 13 views
1

私はSQLインジェクション攻撃を受け、データベース "root"のユーザー名とパスワードを取得しました。SQLインジェクションを使用した他のデータベースからの選択

しかし、他のデータベースのデータも表示されていますが、このサイトの名前は間違いなくコードに含まれています。

SQLインジェクションでは、(フルアクセスのユーザーが)他のデータベースから選択することはできますか? これは、このデータベースにアクセスできるURLを使用する唯一の方法です。

これが可能であれば、それはどのようなsqlですか?だから私は自分のログで見つけることができます。

答えて

0
SHOW DATABASES; 

これにより、アクセス権のあるデータベースのリストが表示されます。 rootはそれらのすべてにアクセスできます(ほとんどのインストールで)。

のテーブルを参照するには:あなたは、複数のことを行うことができ、これらのテーブルの構造を見るために

SHOW TABLES IN `myDB`; 

SHOW CREATE TABLE `myDB`.`myTable`; /* This shows a executable query that can be used to recreate the table structure */ 

or 

SHOW COLUMNS FROM `myTable` IN `myDB`; /* This shows a list of columns */ 
0

データベースのルートパスワードがあれば、何でもできます。 SQLは、ほとんど間違いなくあなたが複数のテーブルを参照する場合と同じメカニズムを使用して、同じサーバ内の他のデータベースから選択することができます:あなたのフロントエンドに面しものを行うために「ルート」を使用して

select database1.table.field, database2.othertable.otherfield, etc... 

は決して良いアイデアではありません。特に脆弱なコードを書いているならば。常に必要な特権を持つ専用ユーザーを作成します。たとえば、単純なブログエンジンでは、テーブルを変更したり、データベースを削除したり、権限を変更したりする権限は必要ありません。

ログには、GETクエリパラメータのみが表示されます。 POSTコールによるハッキングがすべて発生した場合、ログには送信された実際のデータは含まれないため、その前にSOLが存在する可能性が最も高いです。 mysqlバイナリログが有効になっている場合、実行されるすべてのクエリがたくさんあります。

0

もちろん、MySQLクエリは、MySQLの同じインスタンスに存在するすべてのデータベースを参照できます。

SELECT * FROM `databasename`.`tablename` ... 

そして、攻撃者はrootとして、任意のクエリを実行するためにSQLインジェクションを使用することができる場合には、データベース名のリストを取得することも簡単です。

SHOW DATABASES; 

または:私は奨励

SELECT DISTINCT table_schema FROM INFORMATION_SCHEMA.TABLES; 

すべてのコードの完全なコードレビューを実行し、動的SQLクエリを書くことについてより安全にする必要があります。ほとんどの場合、適切な型変換、文字列エスケープ関数、およびクエリパラメータを使用することができますが、動的SQL文字列を作成する必要がある場合もあります。

マイプレゼンテーション、SQL Injection Myths and Fallacies、または私の本SQL Antipatterns: Avoiding the Pitfalls of Database ProgrammingのSQLインジェクションの章を参照してください。

関連する問題