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

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

ただいまの
回答率

89.62%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,513

M-Kajiwara

score 22

質問内容

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/13 13:19

    ご回答ありがとうございます。

    >引数で渡す SQL はツール内のソースコードに記述している。
    というのは、おっしゃる通り固定文字列という意味です。
    固定であればツールの脆弱性は無いということですね。
    ありがとうございます。

    追加の質問で申し訳ないのですが、
    ツールからストアドプロシージャに対するリクエストの通信を利用し、第三者が不正な SQL を実行させることは可能でしょうか?

    キャンセル

  • 2016/04/13 13:24

    https://msdn.microsoft.com/ja-jp/library/ms191192%28v=sql.120%29.aspx
    接続の暗号化を有効にするというオプションがあるということから、逆に言うと平文のままでは通信に介入されたら何をされてもおかしくないと理解できます。

    キャンセル

  • 2016/04/14 17: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様 のご回答で解決したのですが、
    気になったので質問させて頂きました。
    ご存知でしたら教えて頂けないでしょうか。

    キャンセル

+1

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

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

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

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

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

ご参考までに。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 14:25

    ご回答ありがとうございます。
    参考サイトを拝見しました。

    > ASP.NETにおけるXSS、SQLインジェクション対策
    ユーザからの入力を SQL に利用しない場合でも、後に改修が入る可能性も考えると、最初からパラメータを利用することが有効だと分かりました。
    今まであまり意識していなかったので、とても参考になりました。

    > How To: ASP.NET で SQL インジェクションから保護する方法
    こちらのリンクでは SQL インジェクション対策と一括りに言っても、複数の箇所で対策を意識しなければならないことを知ることができました。

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる