質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

2回答

2891閲覧

ストアドプロシージャの脆弱性有無について

M-Kajiwara

総合スコア24

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2016/04/13 03:07

###質問内容
SQLServer のストアドプロシージャで
引数で受け取った SQL 文を実行する記述をしている場合
脆弱性になりえるでしょうか?

質問1.脆弱性の有無
質問2.脆弱性がある場合、発生しうる状況・方法
質問3.脆弱性が無い場合、安全だといえる理由
###環境情報

  • クライアントサーバ型のツールがあり、ローカルネットワーク内の DB サーバに対して、データ取得などの通信を行っている。(サーバはローカルネットワークからの接続のみ可能)
  • 引数で渡す SQL はツール内のソースコードに記述している。(ユーザによる任意の SQL 文は発行できない)
  • SQLServer は安全なパスワードで接続を行う。

###該当のストアドプロシージャ
/* Exec(引数)でストアド呼び出し時の引数を実行 /
/
引数として実行する SQL 文(例:SELECT * FROM テーブル名)を設定する */

USE [データベース名]
GO
CREATE Procedure [dbo].[execSql]
(@sql NVARCHAR(MAX))
As
BEGIN

Exec (@sql)

END
GO

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

SQLServerをご利用とのことなので、フレームワークがASP.NETの前提でご回答します。ASP.NETあればDBアクセスにADO.NETやLINQなど利用されるかと思います。その場合にSQL文(もしくはストアドプロシージャ)を実行するオブジェクトにパラメータを渡す方式を取ればインジェクションのブロックに有効と言えます。

SqlParameterでSQLインジェクション対策

ASP.NETにおけるXSS、SQLインジェクション対策

以下はMSDNのコンテンツですが、プロシージャでも脆弱性が有るのでパラメータの利用が推奨されています。

How To: ASP.NET で SQL インジェクションから保護する方法

ご参考までに。

投稿2016/04/13 07:16

編集2016/04/13 07:30
BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M-Kajiwara

2016/04/14 05:25

ご回答ありがとうございます。 参考サイトを拝見しました。 > ASP.NETにおけるXSS、SQLインジェクション対策 ユーザからの入力を SQL に利用しない場合でも、後に改修が入る可能性も考えると、最初からパラメータを利用することが有効だと分かりました。 今まであまり意識していなかったので、とても参考になりました。 > How To: ASP.NET で SQL インジェクションから保護する方法 こちらのリンクでは SQL インジェクション対策と一括りに言っても、複数の箇所で対策を意識しなければならないことを知ることができました。 ありがとうございました。
guest

0

ベストアンサー

引数で渡す SQL はツール内のソースコードに記述している。

というのが、固定文字列であるという意味なら脆弱性とは言えません。
SQL文の組み立てを行う処理がソースコード内に記述されている、という意味ならごく一般的なSQLインジェクションの潜在的リスクです。

投稿2016/04/13 03:56

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M-Kajiwara

2016/04/13 04:19

ご回答ありがとうございます。 >引数で渡す SQL はツール内のソースコードに記述している。 というのは、おっしゃる通り固定文字列という意味です。 固定であればツールの脆弱性は無いということですね。 ありがとうございます。 追加の質問で申し訳ないのですが、 ツールからストアドプロシージャに対するリクエストの通信を利用し、第三者が不正な SQL を実行させることは可能でしょうか?
M-Kajiwara

2016/04/14 08:18

SQLServer とツールの通信をパケットキャプチャしたところ、標準では SQL 文は平文で流れているようでした。 そこで、重ねて質問をさせて頂きたいのですが、 パケットの内容について、対象パケットは「Protocol:TDS」の「SQLbatch」 を確認しました。 内容は階層構造で、 「TabularDataStream」⇒「TDS Query Packet」⇒「Query:Execute dbo.execSql 'SELECT * FROM T\350\251\246\351\250\223'」 と表示されていました。 最後の Query:Execute 以降が発行している SQL文 です。 「SELECT * FROM T試験」という文を発行しています。 テーブル名の「T試験」の 2 バイト文字が、エンコードされているようですが、 「T\350\251\246\351\250\223」から「T試験」へ、どのようにすれば復元が行えますか? 最初の質問は yuba様 のご回答で解決したのですが、 気になったので質問させて頂きました。 ご存知でしたら教えて頂けないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問