見出し画像

SQLインジェクションとは #199日目

最近頻度が急減していたpaizaですが、面白そうな講座ができたのでやってみました。ハッカー体験をしながらWeb開発でのセキュリティを学べるチュートリアルです。

ここでSQLインジェクションについて少し学んだので整理してみます。


SQLインジェクションとは、意図しないコードをシステムに注入し、実行させることを指します。これにより、通常は参照できないデータベースの値(ユーザー名とパスワード等)を盗み見たり、データを破壊したり改ざんしたりが出来てしまいます。

ただ、現在のWebアプリは大半がフレームワークを活用して作成されているので、基本的にはSQLインジェクションの脅威からは守られています。一方で、知識として全く持っていない状態だと思わぬセキュリティホールを作ってしまうかもしれないので、きちんと理解しておくことは重要です。


上記のチュートリアルでは、掲示板アプリのサーチ機能からSQLインジェクションを仕掛けました。

掲示板アプリのフレームのソース(html)を表示すると、以下のようになっています。「keyword」が入力した検索ワードです。

    <form>
        Search:
        <input type="text" name="keyword" value="">
        <input type="submit">
    </form>
        <!-- [debug SQL]: SELECT id, content, user_name FROM bbs WHERE content like "%keyword%" -->

フォームに入力された値を用いて、bbsというテーブルからデータ抽出するSQL文が実行されていることが分かります。

この部分を利用して、テーブルを破壊する命令を出してみます。
フォームに以下のよう入力して検索すると、

"; TRUNCATE TABLE bbs; --

先ほどのSQL文は以下のようになります。

    <form>
        Search:
        <input type="text" name="keyword" value="">
        <input type="submit">
    </form>
        <!-- [debug SQL]: SELECT id, content, user_name FROM bbs WHERE content like "%"; TRUNCATE TABLE bbs; --%" -->

検索用のSQL文が「"%";」で一度閉じられてしまい、二つ目の「TRUNCATE TABLE bbs;」も命令文に混ざりこんでしまっています。このTRUNCATE TABLEはテーブルのデータを全削除する命令です。

ちなみに「--%" -->」はコメントアウトされる形になっています。


今回のケースではテーブル名が分かってしまっているので、後はカラム名を適当に当てはめてみて一致すれば、データが抽出されてしまいます。例えば「password」や「user_name」などがそのままカラム名になっていて、上記の要領でそれらを抽出するSQLにしてしまえば表示されてしまうのです。

こういう攻撃をきちんと防げるようなシステムになっているかどうか、どうやって防いでいるのか、きちんと理解していきたいですね。


ここまでお読みいただきありがとうございました!!


この記事が気に入ったらサポートをしてみませんか?