SQLインジェクション(SQLi)攻撃とは?事例と対策、体験サイト
公開日: 最終更新日:
見出し
SQLインジェクション(SQLi)攻撃とは?
Webサイトを簡単に制作できるWordPressなどのCMSの多くや、たいていのwebシステムは、ファイルとデータベースの組み合わせで構成されています。
例えばページを移動する際には、新たに表示するページのコンテンツなどをデータベースから取得し、これをphpやCSSファイルによって構成された「枠組み」の中に表示させます。
この際にデータベースに対してどのデータを取得するかの命令を出しますが、これをクエリ(SQL文)と言います。
このSQL 文の組み立てに問題があると、攻撃によってデータベースの不正操作がなされるケースがあります。
例えば、データベース内のコンテンツの改ざん、削除、追加、また顧客情報や会員情報といった個人情報や、クレジットカード情報などの漏えいなど、重大な結果を招く攻撃となります。
これをSQLインジェクション(SQLi,SQL injection)と呼んでいます。
引用元:https://www.ipa.go.jp/files/000017316.pdf
SQLインジェクション(SQLi)攻撃を体験して学ぶ
非常に簡単で分かりやすいのが、
明治大学 理工学部 情報科学科 情報セキュリティ研究室の、Webアプリケーションの脆弱性の解説&体験ページです。
あえてSQLインジェクション(SQLi)の脆弱性を持たせた脆弱サイトが用意されていますので、実際に体験してみましょう。
ログイン情報は、
ユーザ名:ueto パスワード:aya です。
ログインすると、
こうした画面になります。
検索したい会員の名前を入れて下さい(脆弱) とある入力ボックスに、今ログインに使ったユーザー名、uetoと入れてみましょう。
検索ボタンを押すと、
会員番号 | 氏名 | 電話番号 |
---|---|---|
1 | ueto | 1001 |
と、会員番号、氏名、電話番号が表示されるはずです。
ところがほかのユーザーについてはユーザー名が分かりませんから検索できません。
悪意を持った攻撃者ならこの会員情報をすべて窃取したいと考えるかもしれませんが、ユーザー名を知らなければ検索はできません。
しかし、このフォームにはSQLインジェクション(SQLi)の脆弱性が存在します。
そこで、その脆弱性をついて会員情報を一覧で取得してみましょう。
ueto ではなく、
1 |
aiueo' or 'A'='A |
と入力してみましょう。
会員番号 | 氏名 | 電話番号 |
---|---|---|
1 | ueto | 1001 |
2 | saito | 1002 |
3 | goriki | 1003 |
4 | shina | 1004 |
5 | hamasaki | 9999 |
このように、会員情報の一覧を取得することができました。
さて、実際の仕組みをもう少し当該サイトの開設を参考に見てみましょう。
最初は会員名としてuetoを入力しましたが、攻撃のための文字列をWebブラウザから受け取ると、この検索機能は下のクエリを実行します。
1 |
String sql = "SELECT * FROM user WHERE id = '" + id + "'"; |
” + id + “の部分に攻撃のための文字列(aiueo’ or ‘A’=’A)を入力すると、下のSQL文が構成されます。
1 |
SELECT * FROM user WHERE id='aiueo' or 'A'='A' |
WHEREは検索条件を指しています。
このSQL文のWHERE句では検索条件は「id(データベース中の氏名)が’aiueo’と一致するか、もしくは、’A’が’A’と一致するかどうか」になります。
このorが曲者で、idがaiueoであろうかなかろうがどんな値であっても’A’と’A’は常に一致しますから、検索条件は常に真となります。
このため、全件取得されてしまう結果になります。
そのため、データベース内の全ての行で検索条件が真となり、全ての行が選択されてしまいます。
SQLインジェクション(SQLi)攻撃の事例
SQLインジェクション(SQLi)攻撃は非常にポピュラーな攻撃手法でもあります。
このため多くの被害事例が存在しますが、攻撃の性質上顧客データベースの漏えいなど非常に重大な事案であり、事業者の破綻に至ったケースも少なくありません。
2008年4月 | サウンドハウスで延べ97,500件のクレジットカード番号を含む個人情報が流出 |
2010年8月 | ユニーやマルエツなど8社のネットスーパーシステム運営受託のネオビートで12000件のクレジットカード情報流出 |
2011年4月 | ソニーのPlayStation関連のネットワークサービス「PlayStation Network」(PSN)で約7700万人の個人情報漏えいが発生 |
2018年5月 | ミステリーショッピングリサーチの株式会社MS&Consultingで57万件の個人情報が流出 |
2019年01月 | 株式会社釣りビジョンのwebサイトで約64,000件の個人情報が流出 |
2020年04月 | 世界平和統一家庭連合(旧統一教会)系書籍発行の光言社webサイトにSQLインジェクションによる不正アクセス |
SQLインジェクション(SQLi)攻撃への対策
SQL 文の組み立ては全てプレースホルダで実装する
プレースホルダによる組み立てとは、パラメータ部分を「?」などの記号で示しておき、後に、そこへ実際の値を機械的な処理で割り当てる方法です。
SQL文本体と埋め込む値を別々に渡すことで、SQLサーバはパラメータの内容はあくまでも「値」として解釈します。
その値にSQLとして解釈できる文字列があっても、あくまで値として処理しそれをSQLとして実行しないということです。
プレースホルダのことを「バインド変数」と呼ぶこともあります。
なお、SQLインジェクション(SQLi)攻撃に対する対策は、独立行政法人 情報処理推進機構の「安全なSQLの呼び出し方」にも詳しく解説されています。
SQLインジェクション(SQLi)攻撃の体験サイト
明治大学 理工学部 情報科学科 情報セキュリティ研究室の、Webアプリケーションの脆弱性の解説&体験ページ
関連記事
カテゴリ:サイバー攻撃
タグ:SQLi,SQLインジェクション