SQLインジェクション
SQLインジェクションとは、Webサービスなどの入力フィールドから受け取った値をSQL文に結合した場合、想定していないSQLの生成・実行されてしまうという脆弱性のことである。また、この脆弱性を突いた攻撃手法を指す言葉でもある。SQLインジェクションによりWebサイトやデータの改ざん、もしくは個人情報などの情報漏洩が発生することもある。
概要[編集]
システムのSQL文生成の構造に起因する脆弱性であり、データベースの外部から不正にSQL文を注入(インジェクション)することで情報の改ざんや窃取を行う攻撃に利用されるものである。一見すると関係なさそうなWebサイトにおいても背景ではデータベース上のデータをSQLで操作しており、このデータベースを標的にした攻撃は古くから見られているものである。2011年においてはPlayStationNetwork(PSN)の個人情報7,700件が流出する原因ともなったといわれている[1]。
通常はあらかじめシステム上に以下のようなコードを用意しておき、受け取った内容を結合して実行可能なSQL文を生成するようになっている。
SELECT * FROM data WHERE code = '(受け取る内容)';
例えば入力フォームに「test」と入力した場合、入力フォームから受け取った内容を結合し、以下のようなSQL文が生成される。
SELECT * FROM data WHERE code = 'test';
通常であればdataテーブル内にあるcodeが「test」となっているデータが表示される(と思う)。
一方、入力フィールド内に「test'or '1'='1」SQL文を入力した場合、以下のようなSQL文が生成される。
SELECT * FROM data WHERE code = 'test' or '1'='1'
この場合、1=1が常に真となってしまうためdataテーブルの中身がすべて表示されるSQL文となってしまうのである。
対策[編集]
主な対策としてはプレースホルダの使用や権限設定によりアプリ側からデータベースへのアクセス権を制限することが挙げられている。また、エラーメッセージにおいてテーブル名などを表示すると攻撃者がその情報を足掛かりとすることもあるため、詳細な情報は表示させないという対策も必要である。