--------------------------------------------------------------------------
■コメント
--------------------------------------------------------------------------
先日、12/17(土)に「セキュリティTIPS講座」開催され、
私もこの講座に参加してきました。
3000円という格安な値段でした。また、一日の講座で
内容もデモを中心とした本格的なもので大変ためになりました。
講師の河端さん、本当にありがとうございました。
以下は、そのときの内容と自分で集めた情報をを忘れないようにまとめてみました。
セミナー詳細:http://ameblo.jp/amaterasu/entry-10006686368.html
--------------------------------------------------------------------------
■SQLインジェクション(SQL injection)
--------------------------------------------------------------------------
リクエストのパラメータにSQL文を与えてSQLデータベースを不正に操作する攻撃、
またはその攻撃を可能にする入力値の未チェックの脆弱性のこと。
「ダイレクトSQLコマンド・インジェクション」とも呼ばれる攻撃
--------------------------------------------------------------------------
■脆弱性の確認手順
--------------------------------------------------------------------------
・Webインタフェースに以下の入力して実行結果から確認する方法
SQL攻略文字列をフォームもしくはURLに入力する
空白 ( ) 文字列やコマンドの区切りに使われる
" ' , 文字列の区切りに使われる
- 負の数を表すために使われる
. フィールドの指定に使われる
& + / | 演算子として使われる
: 変数の設定に使われる
; コマンドの区切りに使われる
< = > 演算子として使われる
% ? * _ 正規表現で使われる
ODBCエラーを意図的に発生させることを目的としている
/store/checkout.asp?StoreID=‘%20OR&ProductID=12984
/store/checkout.asp?StoreID=124&ProductID= ‘%20OR
「対応する引用符が存在しない」 などのエラーが表示される
エラーが表示された場合、SQLインジェクションが可能であると特定できる
洗練された企業Webではエラー表示されない
その場合、HTTPエラー404、302または500表示される
・ログチェック
UNION,EXEC,xp_cmdshell,DELETEシングルクォート、ダブルクォートなどのコマンド入力がログ上に存在しない確認を行う。
・プログラムチェック
ASP Webシステムの場合、次のようなプログラムがないか確認を行う。
name=Request("name") クエリー変数をそのまま、ASPの変数に代入している。
値の検査をしていない。
query="SELECT *FROM TA WHERE name="'&name&'""
ASPの変数を文字列合成によりクエリーとしている。文字のエスケープ処理をしていない。
EXCEL,ACCESS、VBの場合、次のようなプログラムがないか確認を行う。
name=txtName.Text
入力欄の文字列をそのまま、変数に代入している。
query="SELECT *FROM TA WHERE name="'&name&'""
変数を文字列合成によりクエリーとしている。文字のエスケープ処理が実行されていない。
--------------------------------------------------------------------------
■対策について
--------------------------------------------------------------------------
・文字列制限:IF LEN(name)>10 THEN..
・文字制限:全角入力のみにする事でコマンドが実行できない。
・エスケープ:シングルクォート、ダブルクォート、%、-など危険な文字を制限もしくは削除する。
REPLACE(name、""、"")
・パラメータ引数
・エラー処理
--------------------------------------------------------------------------
■攻撃手法
--------------------------------------------------------------------------
任意のコマンド実行:ストアドプロシージャ呼び出し
認証の迂回:適切な認証を迂回し、データベースへのアクセス
ツール:自動化されたツールによる攻撃
・任意のコマンド実行
master..xp_cmdshell拡張ストアドプロシージャを悪用
‘; exec master..xp_cmdshell dir--
;を先頭に入れることで、1行に複数のSQL文を入れることが可能
xp_cmdshellを通じてdirコマンドを実行
・認証の迂回
サンプルWebサイトに対してSQLインジェクションによるログオン認証回避
ユーザ認証を以下のようなSQLで実現している場合
SELECT UserID FROM UserTbl
WHERE UserName = txtUserName AND Passwrd = txtPassword
ユーザ名として’ OR 1=1 を与えると・・・
SELECT UserID FROM UserTbl
WHERE UserName = txtUserName AND Passwrd = txtPassword OR 1=1
常に認証に成功
正規のユーザ名とパスワードを知っている必要がない
・ツール
中国などで以下の自動化ツールが複数公開されている。
--------------------------------------------------------------------------
■監視手法
--------------------------------------------------------------------------
・プロファイラによる監視
SQL プロファイラは、システム管理者が Microsoft® SQL Server™ のインスタンスで発生するイベントを監視するときに
使用できるグラフィック ツールです。各イベントに関するデータをキャプチャし、ファイルまたは SQL Server テーブル
に保存して、後で分析することができます。たとえば、稼動環境を監視して、どのストアド プロシージャの実行が遅く、
パフォーマンスに影響を与えているかを確認できます。
詳細:http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/adminsql/ad_mon_perf_86ib.asp
http://www.sqlpassj.org/tokushu/dba/01.aspx
・トレースによる監視
プロファイラ相当の監視を常時行う事
詳細:http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/adminsql/ad_mon_perf_227n.asp
http://www.sqlpassj.org/tokushu/dba/02.aspx
・イベントログによる監視
・IDSによる監視(Proventiaの場合)
HTTP_GET_SQL_OpenRowSet
「OPENROWSET」SQL ステートメントの使用に対する HTTP GET 要求をチェックします。
HTTP_GET_CreateTable
HTTP GET 要求を使って データベース コマンド「create table」を実行しようとする試みを検出します。
HTTP_GET_ComputeSum
HTTP GET 要求を使ってデータベース コマンド「compute sum」を実行しようとする試みを検出します。
HTTP_GET_SQL_UnionAllSelect
「UNION ALL SELECT」SQL ステートメントの使用に対する HTTP GET 要求をチェックします。
HTTP_GET_SQL_UnionSelect
「UNION SELECT」SQL ステートメントの使用に対する HTTP GET 要求をチェックします。
HTTP_GET_GroupBy
HTTP GET 要求を使って データベース コマンド「group by」を実行しようとする試みを検出します。
HTTP_GET_SQL_WaitForDelay
「WAITFOR DELAY」SQL ステートメントの使用に対する HTTP GET 要求をチェックします。
HTTP_GET_XP_Cmdshell
HTTP GET 要求を使って sqlServer xp_cmdshell プログラムを実行しようとする試みを検出します。
HTTP_POST_GroupBy
HTTP POST 要求を使って データベース コマンド「group by」を実行しようとする試みを検出します。
HTTP_POST_ComputeSum
HTTP GET 要求を使ってデータベース コマンド「compute sum」を実行しようとする試みを検出します。
HTTP_POST_CreateTable
HTTP GET 要求を使って データベース コマンド「create table」を実行しようとする試みを検出します。
HTTP_POST_SQL_UnionAllSelect
「OPENROWSET」SQL ステートメントの使用に対する HTTP POST 要求をチェックします。
HTTP_POST_SQL_UnionSelect
「UNION SELECT」SQL ステートメントの使用に対する HTTP GET 要求をチェックします。
HTTP_POST_SQL_WaitForDelay
「WAITFOR DELAY」SQL ステートメントの使用に対する HTTP GET 要求をチェックします。
HTTP_POST_XP_Cmdshell
HTTP GET 要求を使って sqlServer xp_cmdshell プログラムを実行しようとする試みを検出します。