SQL等のクエリがエスケープされずに実行される場合、SQLインジェクションなどのリスクが発生します。
最近ではORMの登場によりSQLインジェクションの脆弱性は減ってきましたが、特殊な操作が必要になり生SQLを発行する必要が発生した際などに脆弱性が組み込まれる可能性があります。
実際にSQLインジェクション攻撃を行う事でどのような問題に発展するのかを確認してみます。
注: CELTF の "ToDo管理サービス" に関する解析方法を含みます。
SQLインジェクションのリスク
一番多く取り上げられている内容として「' OR 1=1 -- `」により条件を強制的にTrueに、後続のクエリをコメントアウトして正常なクエリを構築する方法がありますが、クエリを工夫する事で条件を突破する以外にもテーブルのデータを書き換えたり、取得する事ができます。
SQLインジェクションの脆弱性が発生した際に、「このエンドポイントは条件を比較するだけだし、重要なデータを扱っているわけでもないから問題ない」と判断すると致命的なセキュリティインシデントにつながる可能性があります。
どのような場合でも、SQLインジェクションの脆弱性が確認された場合は直ちに修正を行う事が求められます。
SQLインジェクションの確認
今回攻撃するCS学習サイトでは、「お試し問題」のページ内にSQLインジェクションが存在しています。
特定の文字列を送信すると問題の回答と比較され、正しい場合には「正解です!」と表示されます。
ブラウザのデバッグ画面から通信内容を確認すると、正解の文字列が送られた時のみ正解と同じ文字列が返却され、比較されます。
不正解の文字列を送信すると、レスポンスは空のリストになります。
回答と比較して結果を返しているように見えるため、強制的に条件を一致させる「' OR 1=1 -- `」を送ってみます。
すると画面には不正解と表示されますが、レスポンスには「TCP」が含まれている事がわかります。
この事から送られてきた文字列とテーブルの文字列を比較し、結果が一致したらその値を返却している事がわかります。
攻撃手法の確立
攻撃手法を確立するために、任意の文字列をレスポンスに差し込めるか検証を行います。
先ほどと同様に条件を強制的に一致させつつ、UNION ALLを利用しSELECTで任意の文字列を結合してみます。
' OR 1=1 UNION ALL SELECT 'hoge' -- `レスポンスに任意の文字列「hoge」を含める事ができました。
この事からデータベース内の任意の文字列をレスポンスに差し込める事がわかりました。
データベースの調査
攻撃手法が確立したため、データベース内の情報を取得していきます。
データベースにどのようなテーブルがあるか調査したいため、information schemaからテーブル一覧を取得してみます。
' UNION ALL SELECT Table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE'; -- 'テーブルの一覧をレスポンスに含める事ができました。
テーブルの中に「flag」が存在しており、フラグが格納されている可能性が高いためこのテーブルを対象に調査を進めます。
フラグの取得
レスポンスがリストになっており、複数カラム存在すると正常に返却できない事が予想されるため、返却するべきカラムを調査します。
テーブルと同様に、information schemaからカラム一覧を取得します。
' UNION ALL SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='flag'; -- '「flag」が返却されました。
カラムが1つなのでワイルドカードでも問題なく参照できると思いますが、今回は明示的にカラム名を指定して情報を取得します。
' UNION ALL SELECT flag from flag; -- '無事フラグを取得する事ができました。
「パスワードリセット」の競技内容について
CS学習サイトには「パスワードリセット」の競技内容が含まれていますが、今回実施した内容の応用となります。
これまでに得た知識を使う事でデータベースを調査し、パスワードリセットまでたどり着く事が可能です。
何をして良いかわからない場合、今回取得したテーブルの一覧にヒントが含まれているためそれらを参考に攻略を進めてみてください。
おわりに
実際にSQLインジェクションを利用し、データベースを調査しました。
今回は広い範囲の読み取り権限を付与していましたが、information schemaへのアクセスを制限する事で調査の難易度を引き上げる事ができます。
ワードリストから推測攻撃を行われると回避はできませんが、不正アクセス検知の仕組みが存在していれば攻撃が成功するまでに対策する事ができる可能性もあります。
インジェクションの脆弱性を組み込まない事も重要ですが、「最小権限の原則」に従う事でセキュリティインシデントは未然に防げたかもしれません。
セキュリティは一つ一つの積み重ねの上に成り立つものなので、権限管理も重要な要素になります。









コメント