• SecurityTIMES
  • ノウハウ
  • 「サイバー攻撃解説」サーバに攻撃を仕掛けるSQLインジェクションについて

「サイバー攻撃解説」サーバに攻撃を仕掛けるSQLインジェクションについて

2017年6月5日(月) ノウハウ

サイバー攻撃はまだまだたくさん種類があります。
今まで、「DDoS攻撃」「ブルートフォースアタック」についてご紹介をしました。
今回のサイバー攻撃解説では「SQLインジェクション」についてお話ししたいと思います。
「SQLインジェクション」は主にWebアプリケーション運営側に対しての攻撃です。
担当者ではない人にとっては関係がないと思われるかもしれませんが、知っておくに越したことはありません。これを機にSQLインジェクションについて知ってみてくださいね。

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

SQLインジェクションのSQLとはStructured Query Languageの略称です。データベースへの問合わせ(Query)命令文を、組立てて(Structured)、実行するためのコンピュータの言語(Language)のことです。主にデータベースに対して実行されます。
また、インジェクション(injection)とは「注入・挿入」という意味を持ちます。
SQLインジェクションはWebアプリケーションの設計上の欠陥・脆弱性を悪用して行われる比較的容易な攻撃手法です。
また、そのような攻撃を許してしまう脆弱性そのものを指します。
多くのWebアプリケーションはSQLという言語を使い、ユーザからの各種情報入力を受けてサーバ側で処理し、結果をユーザに返しています。また、処理の中には、サーバやデータベースにアクセスし、情報参照・更新することも多いです。
このような処理の過程では、Webアプリケーションは、ユーザから想定外の情報が入力されてもそのまま処理せず、正しくエラー処理を実施する必要があります。

しかし、Webアプリケーションに脆弱性が存在すると、データベースの情報を勝手に削除したり、情報を抜き出すことができてしまいます。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インジェクションの対策方法とは?

QLインジェクションの対策としては、Webアプリケーションがユーザから想定外の情報が入力されてもそのまま処理せず、正しくエラー処理を実施することが最重要事項となります。
Webアプリケーションの開発時から脆弱性を生み出さないように、慎重に構築することが大事です。コーディング時に穴がないように適正な処理が行えるようにしておきましょう。
また、サーバやアプリケーションのアップデートや、パッチ適用を定期的に行い、最新の状態を保ちましょう。
さらにWAF(Web Application Firewall)を導入することで、さらにWebアプリケーションを安全に保つことができます。

いかがでしたでしょうか。
今回のサイバー攻撃は開発側、運営側の人たちが気をつけるべきものでした。
ですが、この攻撃によって私たちの個人情報が漏えいしてしまう可能性は非常に高いものです。自分には関係ないと考えずに、SQLインジェクションについて覚えておきましょう。

Writer:SecurityTIMES編集部