SQL インジェクションからデータベースを守るひとつの方法 -難読化ツールの紹介-
現在では、多くのアプリケーションがデータベースと繋がっています。ユーザーが入力した情報をもとに、アプリケーションは SQL 文を構成して Web サーバーやデータベースにアクセスし、その結果をユーザー側に返します。
プログラムの開発方法は多岐に渡りますが、クライアント側のアプリケーションに SQL 文やアカウント情報など、機密性が高い情報をハードコーディングしているケースも珍しくありません。その場合、コンパイルされたアプリケーションを通して、簡単にデータベースにアクセスできてしまいます。
当記事では、ログインシステム (.NETアプリケーション) のサンプルプログラムを用いて、不正アクセスの実態を明らかにし、アプリケーションを保護するための方法を解説していきます。
なお、当ログインシステムで使用するユーザー情報はデータベースに格納されており、ログイン時に入力されたユーザー情報の整合性を確認しています。また、ユーザー権限(level)も管理しています。
※ サンプルプログラムでは、ADO.NET を利用してデータベースに接続しています。
onnection = New PsqlConnection("Host=xxxxxxx;Database=xxxxxx") If connection.State = ConnectionState.Closed Then connection.Open() End If
逆コンパイルの実行
無料の逆コンパイルツールを使用して、サンプルプログラムのアセンブリを逆コンパイルすると、ソースコードが簡単に見つかりました。
Button1_Click イベントを確認すると、ユーザーの入力情報を引数に SQL をそのまま実行していることが分かります。
string sql = string.Concat(new string[] { "select * from UserTable where email= '", this.TextBox1.Text, "'and pw ='", this.TextBox2.Text, "' " });
デバッガーを使用して変数を書き換えることにより、発行される SQL をいとも簡単に操れるようになることは、容易に想像できるでしょう。例えば、このサンプルプログラムでは SQL の結果が1件以上であればログイン成功と見なすため、SQL の条件である「and pw=’’」を削除さえすれば、Email 情報のみでログインできてしまうことになります。
また、データベースから取得したユーザーの権限については、項目「level」によって制御されていることが分かります。その level 値は変数 result_level に格納されていますが、その値を変更することで権限の移行が実行可能になってしまいます。
結果、もともとは Guest ユーザーだったにもかかわらず、Admin ユーザーとしてログインできてしまうという事態になりました。
このように、時間と手間をかけて作ったアプリケーションでも、セキュリティ対策を実施していなければ、悪意をもった第三者に脆弱性を突かれてしまう危険性があります。
これまでの内容をまとめると、次のようになります。
1)逆コンパイルされたソースコードは、オリジナルのソースコードとほぼ同等であることから、アプリケーションの理解が容易である。
2)脆弱性のあるソースコードの場合、第三者によるデータ操作が可能なため、デバッガー環境でアプリケーションを起動されてしまう。
今回は、上記のような問題を事前に防ぐために、有効な手段のひとつとして、難読化ツールの使用を推奨します。
アセンブリを逆コンパイルから保護するには
C#プロジェクトから作成された .NET アセンブリを保護するために、「Dotfuscator」という難読化ツールを使用します。(Dotfuscator の詳細については、下記ページを参照ください。)
・難読化ツール「Dotfuscator」について
▼ https://www.agtech.co.jp/preemptive/dotfuscator/product/
では、実際に難読化がどのように行われていくのかを確認していきましょう。
1.対象アセンブリの選択
Dotfuscator を起動した後、保護するアセンブリをドラッグ アンド ドロップします。
2.設定を行う
デフォルトで最低限の設定はされていますが、強力な難読化を施すためには、「文字列の暗号化」、「デバッグに対する検知(ボタンを押した際に発動)」を追加します。ビルドボタンを押すと、難読化の処理が開始されます。
難読化の処理が完了すると、Dotfuscator ディレクトリに、保護されたアセンブリが生成されます。
出力アセンブリは保護されているので、逆コンパイルツールを実行しても、抽出された情報は、難読化によって解読が困難になっていることがわかります。
(ソースコードを一部抜粋)
また、デバッガーが使用されたことを検知して、例外処理を発生させることもできます。
まずは評価版をお試しください
以上が、難読化ツール「Dotfuscator」を使用した、アプリケーション保護の具体的な方法になります。いかがでしたでしょう。この記事を読み終えたあと、実際に難読化を試してみたいと思われたかもしれません。
実は、Microsoft Visual Studio には、無料でご使用いただける Dotfuscator の簡易版が用意されているのですが、使用できる機能が制限されています。「文字列の暗号化」などを含む全ての機能をお試しになりたい場合は、下記 URL より、ぜひ Dotfuscator の評価版をお申し込みください。
・Dotfuscator 評価版申し込み