インジェクション攻撃 単語


ニコニコ動画でインジェクション攻撃の動画を見に行く

インジェクションコウゲキ

2.6千文字の記事
これはリビジョン 2919256 の記事です。
内容が古い・もしくは誤っている可能性があります。
最新版をみる

インジェクション攻撃とは、不正な入力によりサーバーを誤動作させる攻撃手法である。

概要

商用Webページなどには一般ユーザーからの入力を受け付けるものも多い。こういったページはユーザーからの入力をサーバーが受け取った後、入力情報を元に適切な処理が行われる仕組みになっている。

ところがサーバーに脆弱性があると、入力情報の中にコンピューターに対する命令と解釈される文字列を埋め込むこと(Code injection)によって意図しない動作を行わせることができる。これがインジェクション攻撃である。

イメージを掴みたい人は下記の9分40秒あたりから12分過ぎまでを参照のこと。

手口

SQLインジェクション

データベースサーバー用言語のデファクトスタンダードに近い存在であるSQLとして解釈される入力を用いてインジェクション攻撃を行う。一般ユーザーの入力は何らかの形でSQLの命令に組み込まれてデータベースサーバーに渡されることが多いので狙われやすい。

データベースサーバーには各ユーザーの個人情報や運営企業が他社との差別化のために苦労して集めたデータなど大事な情報が詰まっていることが多い。そこから任意の情報が読み出されたり、書き込まれたり、ひどい場合は全部抜き取られた上で消去されたりする危険もある。

実証コードについては末尾を参照

NoSQLのデータベースサーバーを標的にした攻撃も存在するので、SQLでなければ安心ということではなく、データベースサーバーは狙われやすいと考えておいた方が良い。

OSコマンドインジェクション

SQLではなく、OS用のコマンドを入力に埋め込む方法。ユーザーの入力がOSに渡される仕様のサーバーというのは少ないはずだが、もし実行されるとOSそのものが乗っ取られ、OS上で動くサーバープログラムに過ぎないデータベースサーバーが乗っ取られたときより被害は大きい。

HTTPヘッダインジェクション

攻撃者が直接入力を行わないケース。不正な入力データを送信するリンクを被害者にクリックさせて、HTTPヘッダに入力内容が反映されるサイトで不正な内容を表示させる。

ヘッダーにはCookieの扱いに関する命令を含めることが出来るため、被害者のCookieを変更することも可能。他にはヘッダーに続けて本文まで偽造することも可能である。

HTMLインジェクション

ユーザーの入力内容確認のためにユーザー入力全文を表示するサイトは多いが、ここにHTMLと解釈される文字列を埋め込むと、不正な入力確認画面を表示できる。

HTMLには<script>タグでJavaScriptを埋め込んだり<iframe>で別のサイトを表示できたりすることを考えると、様々な被害が考えられる。クロスサイトスクリプティング攻撃(XSS)などに使用される。

対策

一般ユーザーからの入力は疑ってかかるのが基本である。

入力制限

入力欄に、処理系で文法上の意味を持つ文字や記号の入力を禁止する。あるいは、サーバー側で想定している文字列の入力のみを許可する。

エスケープ処理

大抵の処理系は、文法上意味のある文字(記号)を、文字列内で文法上の意味を持たないただの文字として使用するためのエスケープという記法が用意されている。

ユーザーからの入力にインジェクション攻撃を意図した文字列があったとしても、処理系に渡す前にエスケープ処理すれば、文法上の解釈を受けることなくただの文字として仕様通り処理される。サニタイズとも呼ばれる。

エスケープ処理を1回余計にやってしまって、「>」が「&gt;」になるといったようにエスケープ処理が残ったまま表示されることがあるのはご愛嬌

コンパイル

スクリプト言語処理系だからユーザーの入力が命令として解釈される。コンパイルしてバイナリにしてしまえばユーザーが入力した文字列とコンピューターへの命令が混ざることはない、というコンセプト。

SQLではプリペアドステートメントと呼ばれる。

関連動画

関連リンク

関連項目

  • セキュリティ
  • クロスサイトスクリプティング(XSS)
  • HTML / Cookie
  • SQL / JavaScript / スクリプト言語
  • 任意コード実行
  • プログラミング関連用語の一覧

おまけ1: SQLインジェクションの実演

  1. Google Colaboratoryを開く
  2. 「ファイル」メニューの「ノートブックを新規作成」をクリック
  3. 「+ コード」ボタンをクリックしてセルを2つ用意
  4. 下記のコードを各セルにコピペ
    f = open("init.sql", 'w')
    f.write("""\
    -- -*- coding: utf-8; mode: sql; sql-product: sqlite; -*-
    
    DROP TABLE IF EXISTS emp;
    CREATE TABLE emp(eid INTEGER PRIMARY KEY, ename TEXT);
    INSERT INTO emp(ename) VALUES ('のぶお');
    INSERT INTO emp(ename) VALUES ('たけし');
    INSERT INTO emp(ename) VALUES ('ひろゆき');
    SELECT * FROM emp;
    """)
    f.close()
    !sudo apt-get install -y sqlite3
    !sqlite3 test.db < init.sql
    
    f = open("append.sql", 'w')
    f.write("""\
    -- -*- coding: utf-8; mode: sql; sql-product: sqlite; -*-
    
    INSERT INTO emp(ename) VALUES ('{}');
    SELECT * FROM emp;
    """.format(input("追加する名前: ")))
    f.close()    
    !sqlite3 test.db < append.sql
    
  5. 各セルを上から順次実行して行き、「追加する名前」の入力欄には
    しげたか'); DELETE FROM emp WHERE ename IN ('ひろゆき
    をコピペしてエンター

おわかりいただけただろうか

おまけ2

ニコニコ大百科:グラフ機能のダウンロード版(サポート終了済み)にはHTMLインジェクション攻撃が可能である。といってもダウンロード版なので、自分で自分にインジェクション攻撃できるだけであり、特にセキュリティ上の問題はない。ユーザーが色以外も指定できたら何か面白いことが出来ないかなと思っていたのでこれは仕様である

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
もっと見る

急上昇ワード改

最終更新:2025/12/09(火) 04:00

ほめられた記事

最終更新:2025/12/09(火) 04:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP