SQLインジェクション

2019.04.22

サイバー攻撃用語

SQL

有名な「DDoS攻撃」「ブルートフォースアタック」の他にもサイバー攻撃はたくさんあります。

アプリケーションの脆弱性をつき、個人情報漏洩事故につながる可能性のあるサイバー攻撃の中でも、特に悪質なものに「SQLインジェクション」があります。
今回は、この「SQLインジェクション」について解説していきたいと思います。

目次

SQLインジェクションとは?

SQLインジェクションのSQLとは、Structured Query Languageの略称で、「データベースへの問合わせ(Query)命令文を」、「組立てて(Structured)」、「実行するためのコンピュータの言語(Language)」のことです。つまり、「データベースサーバ(SQLサーバ)を操作する命令文」を指します。
そして、インジェクション(injection)とは「注入・挿入」という意味を持ちます。

SQLインジェクションは、SQLに別のSQL文が「注入 (inject)」されることから、「ダイレクトSQLコマンドインジェクション」または「SQL注入」と呼ばれることもあります。

 

SQLインジェクションとは、Webアプリケーションの設計上の欠陥・脆弱性を悪用して行われる攻撃手法、また、そのような攻撃を許してしまう脆弱性そのものを指します。脆弱性の中でも、悪用された際の影響が大きい脆弱性です。主にWebアプリケーションにおいて、SQLインジェクションの脆弱性が多く発見されています。

 

多くのWebアプリケーションは、「SQL」という言語を使い、ユーザからの各種情報入力を受けてサーバ側で処理し、結果をユーザに返しています。この処理の中には、サーバやデータベースにアクセスし、情報参照・更新することも多くあります。
このような処理の過程では、Webアプリケーションはユーザから想定外の情報が入力された場合、本来であればそのまま処理せず、正しくエラー処理を実施する必要があります。

しかし、Webアプリケーションに脆弱性が存在すると、アプリケーションが入力値を適切にエスケープせず、SQL文を命令文として認識してしまい、データベースの情報を勝手に削除したり、情報を抜きだしたりなどのデータベースの操作が可能になってしまいます。SQLの断片だと判断できるコマンドを情報に含めることで、プログラムが想定していないSQLを認識し、合成してしまうためです。

 

では、SQLインジェクションの仕組みを、具体例を見ながら詳しく解説していきます。

 

SQLインジェクションの仕組み

以下の例でSQLを表現してみましょう。

(例)userというユーザ情報が格納されているテーブルに対しデータを検索する。入力されたIDに合致するデータを検索する。

まず、アプリケーションが持っているSQLの形は以下となります。

SELECT * FROM user WHERE id=‘$ID’

これは、アプリケーションが$IDの内容に相当する入力を受けた場合、
それを代入したSQLを生成するというコマンドです。
各語句は以下を意味します。

SELECT ・・・ データを抽出する
*    ・・・ テーブルに含まれる項目全て
FROM user ・・userという名前のテーブルから
WHERE <条件> ・・・抽出条件を指定

例えば、WebサイトのID欄に入力値として文字(例として”aaa”)が入力され、SQLが実行された時

SELECT * FROM user WHERE id=‘aaa’

となり、IDがaaaの情報だけが出力されます。

では、SQLインジェクションを受けた場合はどうなるのでしょうか。以下に一例を示します。
$IDの部分にaaaに続いて「’ or ‘A’=‘A」を注入(Injection)すると、

SELECT * FROM user WHERE id=‘aaa’ or ‘A’=‘A’

となります。WHERE以降を見ると、

 

①id=‘aaa’が成り立つ
 ”または” (or)
②‘A’=‘A’が成り立つ(’1’=‘1’でも成り立っていれば何でもよい)
→②は必ず成り立つので、①、②トータルとして全て成り立つ
→userの全ての情報を出力する

ということになります。
この結果、全てのユーザ情報が漏洩することになります。

SQLインジェクションに対するセキュリティ実装が正しく行われている場合には、このシングルクォート「’」は、問合わせ命令文の中の”普通の文字”として処理されます。
しかし、アプリケーションにセキュリティ実装が正しく行われていないと、シングルクォート「’」に続く「全てを出力」という条件の問合わせ命令文がそのまま、データベースへの命令として実行されてしまうのです。

SQLインジェクションによる被害

SQLインジェクションの脆弱性が悪用されると、外部からデータベースを操作され、その結果、データベースに記録されたデータの閲覧や盗難、変更、消去などを行われる可能性があります。

その被害として代表的なものが、情報の漏えいです。

企業が一般公開していない機密情報や個人情報を盗み出されてしまえば情報漏えい事故になりますし、クレジットカード情報を蓄積している場合は、クレジットカード番号や名義も漏えいすることがあります。盗み出された情報をさらに悪用される二次被害も考えられます。
 

また、データを削除されてしまうと、ビジネスを継続できなくなってしまいます。
 

より深刻なケースでは、サーバ自体を乗っ取られてしまう可能性もあります。

SQLインジェクション攻撃の被害で最近多くなっているものが、企業や政治団体などのWebサイト改ざんです。

攻撃者によってWebサイトの内容が書き換えられたり削除される被害が増えており、昨今はWebサイトにウイルスが埋め込まれ閲覧者がウイルスに感染するという被害も増加しています。

この他にも、システムへ不正ログインや乗っ取りといった被害が出ます。不正ログインの手法も年々高度になり、対策を立てることが困難になってきています。

 

SQLインジェクションは、莫大な金額の損害賠償に発展するような、深刻な被害を受ける可能性があるのです。

SQLインジェクションの対策方法

SQLインジェクション攻撃はWebサイトの性質に関係なく、データベースへ個人情報などの重要情報を格納しているWebサイトは特に注意が必要です。

SQLインジェクションが発生する原因は、本来実行されるべきSQLの構文が変更されるためなので、対策としては、Webアプリケーションがユーザから想定外の情報が入力されてもそのまま処理せず、正しくエラー処理を実施することが最重要事項となります。
 
代表的な対策は、「プレースホルダ」の利用です。
プレースホルダを利用することで、SQLの構文が事前に確定し、ユーザーからの入力値等によって不正なSQLが実行されることを防ぐことができます。
 
この他にも、サイバー攻撃を防ぐために以下のような基本的なセキュリティ対策をすることが大切です。単独のセキュリティ対策よりも、いくつかの対策を併用するスタイルが安心・安全のセキュリティ対策に繋がります。

安全なWebサイトを制作する

根本的なSQLインジェクション攻撃の対策としては、安全なWebアプリケーションを開発することです。セキュアプログラミングでSQLインジェクションの脆弱性が存在しないWebサイトを制作することで対策可能です。
また、独立行政法人情報処理機構(IPA)が公開している「別冊: 安全なSQLの呼び出し方」に基づいてWeb制作することで安全なWebサイト構築ができます。

なお、Webサイト制作を外注する場合は、Webアプリケーションの脆弱性の責任は発注者側にあると判断されることが多いため、発注者は要求仕様にセキュリティ要件を盛り込んでおくべきです。制作・納品までの日数に余裕を持たせておくことで、システムチェックにも十分な時間を割くことができます。

Webアプリケーションを常に最新バージョンに保つ

QLインジェクション攻撃を受けないためには、OSやアプリケーションに最新のバージョンが公開されたら、最新のバージョンへ更新、またはWebアプリケーションの改修が必要です。OSやアプリケーションのバージョンアップの中身は、脆弱性対策と言っても大げさではないでしょう。実行することで現段階に起こりうるリスクを下げることができます。

脆弱性対策情報データベースでは、国内外問わず脆弱性対策情報が日々公開されていますので、脆弱性が発見された場合にはなるべく早くアップデートするようにしましょう。

このように、脆弱性にまつわる最新情報をこまめにチェックすることも大切になります。

クラウド型WAFでのセキュリティ対策

WAF(Web Application Firewall)を導入してSQLインジェクション攻撃の対策をする方法もあります。
WAFはファイアーウォールやIPS/IDSでは防ぐことができない、Webアプリケーションの脆弱性を悪用したサイバー攻撃を防ぎます。SQLインジェクション以外の攻撃にも対応しているため、より安全にWebサイトを運用できるようになります。
 

リソース不足によりWebアプリケーションを最新バージョンへ更新できない場合や、すぐにセキュリティパッチを適用できない状況でも、WAFを導入することでSQLインジェクション攻撃への対応が可能です。
なかでもクラウド型WAFは初期・運用コストが小さいため、手軽に対策できます。
 
クラウド型WAF「攻撃遮断くん」はシステム変更不要で最短翌営業日で導入可能です。新たな脆弱性にも自動で対応するため、サイバー攻撃の被害を未然に防ぐことができます。ユーザー側での運用は一切必要ないため、低価格かつ簡単に高セキュリティを実現します。

まとめ

今回は有名なサイバー攻撃であるSQLインジェクションと、その仕組み、対策方法について紹介しました。

 
SQLインジェクション攻撃対策後もWebサーバのログを監視し、被害を受けていないかチェックすることで、万が一の場合も被害を最小限に食い止めることができます。
個人情報漏えいなどの被害は、企業の利益損失や信用失落など経営課題に直結するため、Webサイト運営者にとってはセキュリティ対策が急務な状況です。
ぜひこの機会にWebサイトのセキュリティ対策を見直してみてください。

参考リンク:IPA「安全なウェブサイトの作り方」

 

安価で高セキュリティなサービスを提供するクラウド型WAF「攻撃遮断くん」の詳細資料は、こちらからダウンロード頂けます。

 

(2017/6/5 執筆、2019/4/22修正・加筆)