インジェクション攻撃とは、不正な入力によりサーバーを誤動作させる攻撃手法である。
商用Webページなどには一般ユーザーからの入力を受け付けるものも多い。こういったページはユーザーからの入力をサーバーが受け取った後、入力情報を元に適切な処理が行われる仕組みになっている。
ところがサーバーに脆弱性があると、入力情報の中にコンピューターに対する命令と解釈される文字列を埋め込むこと(Code injection)によって意図しない動作を行わせることができる。これがインジェクション攻撃である。
イメージを掴みたい人は下記の9分40秒あたりから12分過ぎまでを参照のこと。
データベースサーバー用言語のデファクトスタンダードに近い存在であるSQLとして解釈される入力を用いてインジェクション攻撃を行う。一般ユーザーの入力は何らかの形でSQLの命令に組み込まれてデータベースサーバーに渡されることが多いので狙われやすい。
データベースサーバーには各ユーザーの個人情報や運営企業が他社との差別化のために苦労して集めたデータなど大事な情報が詰まっていることが多い。そこから任意の情報が読み出されたり、書き込まれたり、ひどい場合は全部抜き取られた上で消去されたりする危険もある。
実証コードについては末尾を参照。
NoSQLのデータベースサーバーを標的にした攻撃も存在するので、SQLでなければ安心ということではなく、データベースサーバーは狙われやすいと考えておいた方が良い。
SQLではなく、OS用のコマンドを入力に埋め込む方法。ユーザーの入力がOSに渡される仕様のサーバーというのは少ないはずだが、もし実行されるとOSそのものが乗っ取られ、OS上で動くサーバープログラムに過ぎないデータベースサーバーが乗っ取られたときより被害は大きい。
攻撃者が直接入力を行わないケース。不正な入力データを送信するリンクを被害者にクリックさせて、HTTPヘッダに入力内容が反映されるサイトで不正な内容を表示させる。
ヘッダーにはCookieの扱いに関する命令を含めることが出来るため、被害者のCookieを変更することも可能。他にはヘッダーに続けて本文まで偽造することも可能である。
ユーザーの入力内容確認のためにユーザー入力全文を表示するサイトは多いが、ここにHTMLと解釈される文字列を埋め込むと、不正な入力確認画面を表示できる。
HTMLには<script>タグでJavaScriptを埋め込んだり<iframe>で別のサイトを表示できたりすることを考えると、様々な被害が考えられる。クロスサイトスクリプティング攻撃(XSS)などに使用される。
一般ユーザーからの入力は疑ってかかるのが基本である。
入力欄に、処理系で文法上の意味を持つ文字や記号の入力を禁止する。あるいは、サーバー側で想定している文字列の入力のみを許可する。
大抵の処理系は、文法上意味のある文字(記号)を、文字列内で文法上の意味を持たないただの文字として使用するためのエスケープという記法が用意されている。
ユーザーからの入力にインジェクション攻撃を意図した文字列があったとしても、処理系に渡す前にエスケープ処理すれば、文法上の解釈を受けることなくただの文字として仕様通り処理される。サニタイズとも呼ばれる。
エスケープ処理を1回余計にやってしまって、「>」が「>」になるといったようにエスケープ処理が残ったまま表示されることがあるのはご愛嬌。
スクリプト言語処理系だからユーザーの入力が命令として解釈される。コンパイルしてバイナリにしてしまえばユーザーが入力した文字列とコンピューターへの命令が混ざることはない、というコンセプト。
SQLではプリペアドステートメントと呼ばれる。
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
しげたか'); DELETE FROM emp WHERE ename IN ('ひろゆきをコピペしてエンター
おわかりいただけただろうか
ニコニコ大百科:グラフ機能のダウンロード版(サポート終了済み)にはHTMLインジェクション攻撃が可能である。といってもダウンロード版なので、自分で自分にインジェクション攻撃できるだけであり、特にセキュリティ上の問題はない。ユーザーが色以外も指定できたら何か面白いことが出来ないかなと思っていたのでこれは仕様である。
急上昇ワード改
最終更新:2025/12/09(火) 04:00
最終更新:2025/12/09(火) 04:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。