初めまして、今年から未経験で脆弱性診断の勉強を始めたyukimalo9と申します。
Qiita初投稿となります!
ROM専でお世話になったイメージしかないQiitaですが縁あって今回投稿する運びとなりました。
最初の題材として取り上げるのは、脆弱性の中でもビッグネームでしょう…
SQLインジェクション
SQLインジェクションとは、
本来データベースにアクセスできるはずのないユーザが、
サイト側の想定しないSQL文を用いて不正なアクセスができてしまう恐ろしい脆弱性です…
数ある脆弱性の中でもかなり代表的なものであり、
その巧妙さから、新人研修でSQL文にほんの少しだけ触れていた私は
『マジかよ!そんなことが!?』
と思いました…笑
では実際にどんなものなのか、そしてどう対策すべきなのか、拙いながら書かせていただきます。
…の前に一旦注意事項を。
その辺のWebページなどにSQLインジェクションを働かせるコマンドは絶対に入力しないで下さい!
当たり前ですが、データベースへの不正アクセスですので…!
では…
例として、とある入力フォームがあったとします。
ユーザはこのフォーム内に文字列を入力してその情報を送信することでデータベースへのアクセスを行うとします。
ここに入力される文字列は、データベースに問い合わせるSQL文中に
’入力される文字列’
として挿入されます。
ではもっと具体的にしてみましょう。
とあるWebサイトでログインしたいとき、データベース(今回はMySQLとする)に問い合わせるSQL文は以下のようになります。
…このシングルクォーテーションマーク(‘)とSQL文特有の文法や文字から無理矢理こじ開ける入力文字列が以下の赤シングルクォートで囲まれた文字列です。
これによって
idが1 or 1が1
のとき、つまり絶対に条件文は正になってしまいます。
一方MySQLではハイフン2つ(— )以降はコメントアウトとなり、その直前には終端文字(;)もあることから、
意味をなすSQL文は前半部分のみになります。
idとpasswordというカラム内のレコードが全て返ってしまい、ログイン認証としてはクリアされてしまいます。
よく見ると、たしかになぁ…!という感想になります。
なかなかおもしろいですね!
ちなみに開発側からの見解はほとんど経験がないため、多くは語れないのですが、
SQLインジェクションの対策として挙げられるのは
・エスケープ処理
・WAFの導入
が主になるでしょうか。
エスケープ処理は一番物理的に効果を発揮するもので、
SQL文中で意味をもってしまうシングルクォーテーションマーク(‘)やセミコロン(;)などを
通常の文字として認識させるような設定することです。
対してWAF(ワフ)はWeb Application Firewallの略称で、
SQLインジェクションやXSS(クロスサイトスクリプティング)などの脆弱性への対策であり、
Webアプリケーションにアクセスが届く前に、悪意のあるアクセスをシャットアウトしてくれます。
こういった不正なアクセスから引き起こされる事象は決してあってはならないものでありますが、
提供側は必ずそのケアをしておかなければならないことも言うまでもありません。
私も欲深に学んでいこうと思います。
今回初投稿ということで、かなり拙い文章で申し訳ないですが、
指摘箇所等ございましたら是非ご指導いただきたいです。
よろしくお願い致します。