専門用語を使わずにゼロからわかるSQLインジェクション
先日、私は日課のランニングをしていました。その後、たまたま友達と遭遇して飲みに行きました。その友達は営業マンで、ニュースで「SQLインジェクション」という言葉を聞いたそうです。
しかし、エンジニアが使う言葉は横文字が多くてさっぱりわからないと言っていました。私はエンジニアなので、彼にSQLインジェクションについて簡単に説明しました。すると彼は驚いて、「こんなに簡単にわかるなら最初からそう言ってよ」と言いました。
この記事では、私が友達に説明した資料を使って、SQLインジェクションについて専門用語を使わずにゼロからわかるように紹介します。記事を読めば、SQLインジェクションがどんなものか、どうやって防ぐかが分かります。エンジニアでも営業でもない方でも安心して読める内容です。
SQLインジェクションってなに?
SQLインジェクションとは何でしょうか?IT用語辞典 e-Wordsによると
データベースを利用するWebサイトの中には閲覧者の求めに応じて動的にプログラムを起動し、データベース管理システム(DBMS)へデータの検索や更新などを依頼するものがあるが、その際にSQL(Structured Query Language)と呼ばれる問い合わせ言語が標準的に利用される。
検索機能などを実装するために、閲覧者がフォームなどに入力した文字列をプログラムが受け取り、あらかじめ用意されたSQL文の一部に埋め込んでDBMSへ渡すという処理がよく行われる。その際、悪意のある攻撃者が検索文字列として引用符や条件式などを組み合わせたSQL文の断片を渡すことにより、開発者が想定していないSQL文が生成・実行され、本来得られないはずのデータを出力してしまったり、保存されたデータが破壊・改竄されることがある。
SQLインジェクションの被害で最も多いのは個人情報などデータベースに保存された重要なデータや機密データの漏洩で、過去に名簿やアカウントリストなどの流出事件が様々なサイトで発生している。また、Webサイトの改竄に悪用された場合、Webページ上にWebブラウザを攻撃するコードなどを埋め込まれる場合もあり、サイトを訪れた閲覧者に二次被害が広がってしまう。
対策としては、単純な文字列連結で動的にSQL文を生成するのをやめてプレースホルダ(バインド機構)やプリペアードクエリ(プリペアードステートメント)のような仕組みを活用したり、渡された入力値を入念にチェックして特定の文字を適切にエスケープ(無害な文字に置換)するといった手法がよく知られ、これら複数の手法を組みわせることも推奨されている。
だそうです。正直何を書いているのかさっぱりわからない方が多いと思います笑
準備
前のパートでは正直何を言っている方が多かったと思います。当たり前です。僕も最初何言っているのかわかりませんでした。しかし、百聞は一見に如かずという言葉があります。実際に体験してもらったほうがすぐに理解できると思います。大丈夫です。これから使うものは一切法を犯さずにSQLインジェクションを安全に体験することができます。
まずは明治大学 情報セキュリティ研究室が作成したSQLインジェクションを体験してもらうために作成したログインページに飛んでください。
明治大学 情報セキュリティ研究室 -脆弱サイトの会員検索エンジンサービスへのログイン
つぎにユーザ名にueto、パスワードにayaと入力して「ログイン」ボタンをクリックしてください。ログインに成功したら以下のようなページが表示されると思います。これで準備完了です
実践
まずは検索したい会員の名前を入れて下さい(preparedstatementの利用)ようこそページの検索したい会員の名前を入れて下さい(脆弱):に「ueto」と入力して「検索」クリックしてください。
クリック後はこのように表示されていると思います。会員名を入れて「検索」ボタンを押せば会員情報が表示される。ここまでは普通だろうと思っている方が多いと思います。
↓
では次に本題のSQLインジェクションをやってみましょう。さきほどの検索したい会員の名前を入れて下さい(preparedstatementの利用)ようこそページの検索したい会員の名前を入れて下さい(脆弱):に「aiueo’ or ‘A’=’A」と入力して「検索」クリックしてください。クリック後はこのように表示されていると思います。
↓
いったいどういうことでしょうか?全く違う赤の他人の個人情報が丸見えではありませんか!!!!
説明
これまでの章でわかった方がいるかもしれません。SQLインジェクションとは、Webサイトが利用するデータベースを狙った攻撃のことなのです。攻撃者(悪い人)は、Webサイトの入力フォームなどに、システムが想定していない不当なSQLというデータベースの操作言語(悪い呪文)を入力します。ちなみに今回だと「aiueo’ or ‘A’=’A」がその悪い呪文にあたります。
すると、その不当なSQL(悪い呪文)がデータベースに送られて実行されてしまい、データベースのデータを不正に見たり、変更したり、削除したりすることができてしまいます。
SQLインジェクションは非常に危険で恐ろしい攻撃です。ちなみにこの攻撃は、不正アクセス禁止法に違反する立派な犯罪です。不正アクセス禁止法に違反した場合、最高で懲役3年以下または100万円以下の罰金が科せられます。
対策
では、この恐ろしい攻撃を防ぐ方法はあるのでしょうか?
もし今読んでいるあなたがシステムを開発する立場なら独立行政法人情報処理推進機構 -安全なウェブサイトの作り方 – 1.1 SQLインジェクションのページを参考にして開発や改修を必ず行ってください。
ではもし、あなたが開発者ではなく一般のユーザーの場合はどうしたらよいのでしょうか?私もかなり頑張って調べましたが、一般ユーザーがSQLインジェクションを防ぐ方法はないというのが現状です。
参考文献
カゴヤのサーバー研究室 -【初心者向け】SQLインジェクションの概要と対策方法
明治大学 情報セキュリティ研究室 -脆弱サイトの会員検索エンジンサービスへのログイン
明治大学 情報セキュリティ研究室 -Webアプリケーションの脆弱性の解説&体験ページ
警察庁Webサイト -特集II:安全・安心で責任あるサイバー市民社会の実現を目指して
このカテゴリの最新記事
2024.02.15
2024.04.24
2023.05.24
2023.09.22