
この記事は会社の経営層の代表取締役社長や役員向けの記事となっております。
会社を経営し、Webサイトをお持ちの経営層の皆さんならどこかで耳にしたことのある「SQLインジェクション」という言葉。令和の時代になってこんな言葉を知らないなんて・・・と思われたくないので誰にも聞けないと思っている経営層の皆さん向けにどこよりも簡単により具体的な内容で解説させていただきます。
まず、どこかで耳にしたことのある言葉の「SQLインジェクション」とは何なのかを簡単にご紹介します。
SQLインジェクションとは、Webアプリケーションのセキュリティ上の中で最も脅威と言われる脆弱性の一つであり、昔から情報漏えいやサイトの乗っ取りなどで悪用されている脆弱性となっています。
現在でも多くの団体がこの脆弱性を対策するように指導を続けています。
官公庁名 | 対象業界・企業 |
文部科学省 | 地方公共団体が設置する学校(小学校、中学校、義務教育学校、高等学校、中等教育学校及び特別支援学校 |
厚生労働省 | 病院、医院、医療情報保持者 |
国土交通省 | 鉄道、バス、バスターミナル、タクシー、宿泊施設、フェリー・旅客船、空港・空港ビル |
経済産業省 | 民間企業全般 |
農林水産省 | 農業、畜産業、林業、水産業 |
防衛省 | 防衛産業企業 |
デジタル庁 | 全官公庁、政府情報システム |
情報マネジメントシステム認定センター | 上場企業 |
独立行政法人情報処理推進機構 | 中小企業全般 |
日本クレジット協会 | クレジットカード加盟店(小売店舗、EC事業者)クレジットカード会社、決済代行会社 |
ではSQLインジェクションがなぜ起きるのか、放置するとどうなるのかなどをわかりやすく解説していきます。
目次
SQLインジェクションがなぜ発生するのか
SQLインジェクションは、Webアプリケーションのセキュリティ上の脆弱性に起因しています。主に、SQLクエリを構築する際に不十分な処理や検証が行われた場合に発生します。
簡単に言うと「Webサイトを制作した人がミスをしていると発生する」というものです。
以下のようなミスがSQLインジェクションを引き起こす可能性があります。
- ユーザー入力の不十分なエスケープ処理
- ユーザー入力の不十分な検証
例えば、以下のようなPHPコードがあるとします。
“`
<?php
// フォームからの入力を取得
$username = $_POST[‘username’];
$password = $_POST[‘password’];
// SQLクエリを構築
$sql = “SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password'”;
// SQLクエリを実行
$result = mysqli_query($connection, $sql);
// 結果を表示
while ($row = mysqli_fetch_assoc($result)) {
echo $row[‘username’] . “<br>”;
}
?>
“`
このコードは、ユーザーが入力したユーザー名とパスワードを使用して、データベースからユーザー情報を取得するためのSQLクエリを構築しています。しかし、このコードにはSQLインジェクションの脆弱性が存在します。例えば、以下のような入力を送信することで、攻撃者はSQLクエリに悪意のあるコードを挿入することができます。
SQLインジェクションはどんなサイトに発生するのか
SQLインジェクションは、ほとんどのWebアプリケーションに潜在的に存在しています。
特に、ユーザーがデータを入力するフォームや検索機能、ログイン機能などがある場合に発生しやすく、特に動的なWebサイトやWebアプリケーションにおいてよく見られます。
なぜなら、攻撃者が不正なSQLクエリを実行するために、フォームに入力されたデータを利用するためです。
例えば、ログインフォームに入力されたユーザー名とパスワードを使用してデータベースからユーザー情報を取得するためのSQLクエリを実行する場合、以下のようなコードを使用することがあります。
“`
$login_query = “SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password'”;
“`
この場合、フォームに入力されたユーザー名とパスワードが直接SQLクエリに埋め込まれています。しかし、攻撃者はフォームに悪意のあるコードを入力し、SQLクエリを改竄することができます。例えば、以下のようなコードを入力することで、攻撃者は任意のユーザー名でログインすることができます。
“`
‘ OR 1=1 —
“`
このコードを含めたSQLクエリは以下のようになります。
“`
SELECT * FROM users WHERE username = ” OR 1=1 –‘ AND password = ”
“`
このSQLクエリは、常に真となる条件を含むため、攻撃者は任意のユーザー名でログインすることができます。
同様に、検索機能やフォームに入力されたデータを使用してSQLクエリを構築する場合でも、同様の攻撃が可能です。攻撃者はフォームに悪意のあるコードを入力し、SQLクエリを改竄することで、データベースから機密情報を盗み出すことができます。
SQLインジェクションを放置すると発生する事例
SQLインジェクションが放置されると、悪意のある攻撃者はサイトのデータベースにアクセスし、機密情報を盗み出したり、データを改ざんしたり、削除したりすることができます。また、Webアプリケーション全体を制御することができ、さらにはWebサイト全体をダウンさせることもあります。これらのトラブルは、企業や個人にとって大きな損失をもたらすことがあります。
SQLインジェクションを悪用されると以下のような被害に合う可能性がありますので要注意です。
-
データ漏洩
SQLインジェクション攻撃によって、データベース内の機密情報が外部に流出することがある。例えば、クレジットカード情報、個人情報、企業の内部情報などが含まれることがある。
関連記事:【最新版】2022年9月発表、クレジットカード漏えい事件による不正利用被害が過去最高額を記録。漏えい事件の本音を大公開。
-
端末やシステムの乗っ取り
SQLインジェクション攻撃によって、悪意のあるユーザーが端末やシステムを完全に乗っ取ることができる。これにより、攻撃者がシステムやネットワークにアクセスできたり、システム上で任意の操作を実行できるようになる。
-
サービスの停止
SQLインジェクション攻撃によって、システムやアプリケーションが停止することがある。攻撃者がシステムに膨大なリクエストを送信することで、サービスがクラッシュしたり、過負荷になって稼働しなくなることがある。
-
フィッシング詐欺
SQLインジェクション攻撃によって、攻撃者が偽のウェブサイトを作成し、詐欺的な手段でユーザーにログイン情報や個人情報を入力させ、それを盗むことができる。例えば、銀行のログインページやオンラインストアのログインページなどが偽造されることがある。
-
マルウェア感染
SQLインジェクション攻撃によって、マルウェアがシステムに侵入することがある。攻撃者が悪意のあるSQLコードを挿入することで、マルウェアがシステムにダウンロードされ、実行されることがある。
SQLインジェクションに関連するトラブルを起こさないための方法
SQLインジェクションを防ぐためには、Webサイトを作成時に適切なエスケープ処理や検証を行うことが必要です。具体的には、入力データのバリデーションを行い、特殊文字やSQLコマンドをフィルタリングすることが重要です。また、プレースホルダを使用することで、ユーザー入力を直接SQLクエリに埋め込むことを回避することができます。
そして、忘れてはいけないのは納品時や定期的な脆弱性診断やセキュリティアップデートを行うことも重要です。これらの対策を講じることで、SQLインジェクションに関連するトラブルを未然に防ぐことができます。
いつ起きるかわからないリスクに迅速に対応するためには、毎日診断をして万が一リスクが発生した場合にはすぐに検知しトラブルになる前に対策することで安心・安全なサイトの運営を実現してください。
関連記事:Webサイトの脆弱性ってどれぐらいの頻度でやればいいの?間違った認識を改める秘密を大公開