SQLインジェクションの例についてまとめています。
SQLインジェクションによる情報漏えいなどの報道
SQLインジェクション攻撃でユーザの入力データ63,656件が流出
衛星放送やケーブルテレビで番組配信している趣味系の専門チャンネルにて、63,656人のお客様情報が不正アクセスで流出した可能性ありという、2019年1月25日発表の報道です。
ウェブサーバーの保守管理会社から、想定外の大量アクセスを検知したと連絡があり、何者かが脆弱性診断ツールを悪用し、SQLインジェクション攻撃を仕掛け、サーバに侵入した痕跡が発見されました。
脆弱性診断ツールとは、ウェブサイトに対して擬似的な攻撃をしかけ脆弱性をチェックするためのツールです。
なお、流出したデータには、クレジットカード等の決済情報は含まれていませんでした。流出したデータは、2006年以降のプレゼント応募や番組人気投票など、ウェブサイト上で入力されたものです。
- メールアドレス:5万1,345人
- メールアドレス、氏名:7,629人
- メールアドレス、氏名、住所:4,682人
- 合計:6万3,656件
参考)SQLインジェクション攻撃で個人情報約6万4千件が流出、株式会社釣りビジョン
オンラインクリーニングサービスでクレジットカード情報58,813件が流出した可能性
2020年10月30日に、オンラインクリーニングサービスで発覚した事件。一部のクレジットカード会社から、カード情報の流出の懸念を伝えられました。カード決済機能を停止して、第三者機関を通じて調査実施したところ、何者かがSQLインジェクションを仕掛けていた事実が判明。
ウェブサイトに内在する脆弱性を利用したもので、過去、同社サイトで新規登録や情報変更をおこなったユーザのクレジットカード情報58,813件が流出した可能性があるというものです。
運営会社は、対応策としてウェブサイトの脆弱性を修正し、現行システムの移行を開始。同時にカード会社と連携し、監視体制を強化しています。
運営会社は他にもネットでのサービスを運営していますが、運用環境が異なるため不正利用被害はないとしています。
参考)SQLインジェクション攻撃でカード情報5万8,813件流出の可能性|せんたく便
新型コロナワクチン接種予約システムで、SQLインジェクションで不正利用ができるという噂
新型コロナワクチン接種予約システムは、システムの立ち上げスピードを優先したためか、架空の番号で予約できる、接種期間外でも予約できるなどの問題がSNSで指摘されていました。
東京新聞によると適当な接種券番号、120歳になる計算の生年月日を入力したところ、エラー等はなく、予約完了直前の画面までたどりつけたとのこと。
参考)ワクチン大規模接種の予約システムに欠陥 マイナンバー追跡でも不具合…関連会社の顧問に竹中平蔵氏:東京新聞 TOKYO Web
ワクチン接種予約システムでは、生年月日、事前に配布された接種券番号(10桁)、市町村コード(6桁)の3種類を入力します。ネットセキュリティ専門会社の専門家によると、SQLインジェクション攻撃が成功すると予期しないデータの追加や書き換え、削除ができてしまうため、予約が不正データで埋め尽くされてしまう可能性や、用意したワクチンが無駄になってしまう可能性もあるとのこと。
システムに蓄積するデータは上記の3種類のみで、個人情報や機密情報は含まれていませんが、攻撃されたデータベースが他のシステムと連携していた場合に、影響が出る可能性があります。
参考)ワクチン予約システムで話題の「SQLインジェクション」って何? 試すと法律違反? 専門家に聞く – ITmedia NEWS
SQLインジェクションの種類
SQLインジェクションは、大きくわけて2種類あります。インバウンドSQLインジェクションと、ブラインドSQLインジェクションです。
インバンド SQL インジェクション
インバウンドSQLインジェクションは、ウェブアプリケーションへの入力に対し、レスポンス内容を収集して分析していく方法です。システムの脆弱性を突いて不正なSQLを実行し、個人情報や機密データなどをごっそり抜き取る方法です。
エラーベース SQL インジェクション
データベースに対してエラーメッセージを生成させるアクションを実行する方法。エラーメッセージにより、データベースの種類やバージョン、データベース構造などを知られる可能性があります。
データベースの種類やバージョンが知られることで、ゼロデイ攻撃など脆弱性をついた攻撃につながります。
わざとエラーになるような入力を多数おこなっている場合などは、返ってくるエラーメッセージからデータベースの情報を分析している可能性があります。
UNION インジェクション
UNIONは、SQLのselect文の抽出結果を複数まとめて返すSQLコード。
【関連記事】
▶SQLのunion allはselectの検索結果を統合 DBMSごとの構文
UNIONを含んだSQL文を不正に実行させ、アプリケーションのテーブルだけではなくシステムが使用するテーブルを読み出すことも可能になります。そうすると、アプリケーションが想定している以外のテーブルを読み出せてしまうんですね。
以下は、ウェブアプリケーションの入力欄に「d001」が入力されたときに、アプリケーション内部で実行されるSQLの例です。
mysql> select * from departments where dept_no='d001'; +---------+-----------+ | dept_no | dept_name | +---------+-----------+ | d001 | Marketing | +---------+-----------+ 1 row in set (0.00 sec)
このとき、SQLインジェクションに対する防御がされておらず、入力欄に「d001′ union select emp_no, first_name from employees limit 10」といった攻撃コードが入力された場合、アプリケーション内部で以下のコードが実行されてしまいます。
アプリケーション側で意図していない全然別のテーブルの情報を取得できてしまうんですね。
mysql> select * from departments where dept_no='d001' union select emp_no, first_name from employees limit 10; +---------+-----------+ | dept_no | dept_name | +---------+-----------+ | d001 | Marketing | | 10001 | Georgi | | 10002 | Bezalel | | 10003 | Parto | | 10004 | Chirstian | | 10005 | Kyoichi | | 10006 | Anneke | | 10007 | Tzvetan | | 10008 | Saniya | | 10009 | Sumant | +---------+-----------+ 10 rows in set (0.05 sec)
ブラインド SQL インジェクション
Webサーバのメッセージやデータのレスポンスでデータを読み出すのではなく、ステータスや応答時間を収集して攻撃可能箇所を探る方法です。悪用するのに時間がかかる傾向にありますが、理論上、待ち時間を最小限にして攻撃する方法もありそうです。
ブラインドSQLインジェクションの一種、Time-Based SQLインジェクションは、仕掛けた攻撃に対して、レスポンスが返るまでの時間の変化を計測し、データベースの情報を探る攻撃方法です。
Aという入力の応答時間が1秒で、Bという入力の応答時間が5秒と、応答時間に変化がでる場合、攻撃者に攻撃のヒントを与えてしまいます。これを繰り返すことで、攻撃に必要な情報を蓄積していくんですね。
通常、Time-Based SQLインジェクションは何らかの情報を得るまでに時間がかかりますが、攻撃方法によっては時間をかけずに情報を得られる可能性があります。
参考)眠らないTime-Based SQL Injection – WAF Tech Blog
SQLインジェクションには、WAF導入が効果的
WAFは、Web Application Firewallの略で、Webアプリケーションの脆弱性を防御します。SQLインジェクションやクロスサイトスクリプティングなどの対策として有効です。
一般的なファイアウォールは、ネットワークポートを制御して不正アクセスを防止します。しかし、正常に接続された状態で不正なデータを送るSQLインジェクションのような攻撃を防ぐことはできません。
WAFは攻撃パターンをブラックリストファイルとして持ち、Webアプリケーションへの攻撃を防止します。WAFのブラックリストは、新しい攻撃方法が発見されるたびに更新する必要がありメンテナンスコストが高いのがデメリットですが、最近では、クラウド型WAFも登場し、ブラックリストを自動更新してくれるタイプもあります。
まとめ
- SQLインジェクションにより、システムのデータベースに蓄積された個人情報や機密情報が抜き取られる可能性あり
- SQLインジェクションには、データベースの種類やバージョンを特定するための攻撃もある
- WAF導入は、SQLインジェクション対策に有効。ブラックリストを自動更新するクラウド型もある。