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

1件

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

5.1千文字の記事
  • twitter
  • facebook
  • はてな
  • LINE

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

概要

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

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

文字列に「文字列の終了を表す表現」を埋め込んだ後に、実行させたい命文につなげるというのが大まかな手口になる。もう少し具体的なイメージを掴みたい人は下記の9分40あたりから12分過ぎまでを参照のこと。

分類

SQLインジェクション

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

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

コードは末尾のおまけ1を参照

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

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

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

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

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

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

メールヘッダインジェクション

一般ユーザーから「問い合わせ」ページなどに入があると自動的にメールで管理者や担当者に通知する仕様になっているサーバーは多い。この際、「件名」の入メールの"Subject:"の行に使用されるといったように、入がそのままメールヘッダ領域に反映される場合に攻撃対になる。

メールヘッダインジェクションでは上記「件名」の欄に改行を入れ、その後にメールヘッダとして解釈される任意のコードを挿入する。たとえば"Bcc:"を挿入するとスパムメールの送信に用いることができる。

HTMLインジェクション

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

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

コードは末尾のおまけ2を参照

対策

一般ユーザーからの入は疑ってかかるのが基本である。クライアント側のコード改造なので原則としてサーバー側で対策を行う。

入力制限

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

エスケープ処理

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

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

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

コンパイル

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

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

関連動画

関連リンク

関連項目

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

  1. Google Colaboratoryexitを開く
  2. ファイルメニューの「ノートブック新規作成」をクリック
  3. 「+ コードボタンクリックしてセルを用意
  4. 下記のコードセルコピペ
    import textwrap
    f = open("init.sql", 'w')
    f.write(textwrap.dedent("""\
    -- -*- 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
    while True:
        f = open("append.sql", 'w')
        f.write(textwrap.dedent("""\
        -- -*- 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. 「▶」ボタンクリック
  6. 「追加する名前」の入欄に適当名前を入してエンター。この手順を何度か繰り返し、入した名前が名簿に追加されることを確認する
  7. 「追加する名前」の入欄に
    しげたか'); DELETE FROM emp WHERE ename IN ('ひろゆき
    
    コピペしてエンター

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

おまけ2: HTMLインジェクションの実演

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

手順

  1. スタンドアロン用のダウンロード版コピペしてテキスト形式で保存する。
  2. ウィルスチェック自己責任で。ソースコードから自分でビルドしてもいいのよ。
  3. 保存したファイルブラウザで開く。
  4. ダウンロード版は色定の文字列が無修正に反映されるようになっている。 ← ここが脆弱性
  5. データ欄」に後述のデータを入して「変換」ボタンを押す。
  6. なんということでしょう。直線しか描画できないはずのニコニコ大百科:グラフ機能で塗りつぶされた円が出されました。

入力

3行red(太字)は仕様通りの色定方法だが、その後にHTMLの<div>要素の一部として認識される不正なコード(字 + 赤字)が追加されている。

0.0, 0.0
170.0,0.0
300, 80.0,red; transform: rotate(44deg); margin: 54.0000px 0 0 262.0000px;"></div><div style="background: #fc9; border-radius: 40px; width: 80px; height: 80px
500.0, -110.0

出力

記事にある使用例べると、本来直線しか出する機がないのに、塗りつぶされた円が出されているのがわかる。

HTMLソースで見ると下記のようになっている。字 + 赤字が不正に追加された部分で、入の不正部分と完全に一致している。

<div><div style="border: 1px solid green; height: 150px; width: 500px;"></div><div style="border: 1px solid green; height: 150px; width: 500px;">
<div style="height: 1px; width:170.0000px; background-color: red; transform: rotate(0deg); margin: -1.0000px 0 0 0.0000px;"></div>
<div style="height: 1px; width:153.0000px; background-color: red; transform: rotate(-32deg); margin: -41.0000px 0 0 158.5000px;"></div>
<div style="height: 1px; width:276.0000px; background-color: red; transform: rotate(44deg); margin: 54.0000px 0 0 262.0000px;"></div><div style="background: #fc9; border-radius: 40px; width: 80px; height: 80px; transform: rotate(44deg); margin: 54.0000px 0 0 262.0000px;"></div>
</div></div>

解説

正規の出と不正な出べてみよう。

正規 <div style="height: 1px; width:276.0000px; background-color: red; transform: rotate(44deg); margin: 54.0000px 0 0 262.0000px;"></div>
不正 <div style="height: 1px; width:276.0000px; background-color: red; transform: rotate(44deg); margin: 54.0000px 0 0 262.0000px;"></div><div style="background: #fc9; border-radius: 40px; width: 80px; height: 80px; transform: rotate(44deg); margin: 54.0000px 0 0 262.0000px;"></div>

正規の入ではred(太字)で色定を受けた単一のdiv要素(字)であるが、前述の不正な入を受けると、

  1. 不正入の前半(字)により、正規のdiv要素が正常に終了する。
  2. 不正入の後半(赤字)により不正なdiv要素が開始される。
  3. 2.は、正規のdiv要素を終了するはずであった部分(後半の字)とつながり、不正なdiv要素が正常に終了する。

という手順を踏んで、不正なdiv要素(こちらを参考にした円を出するHTML)が追加されたのである。

対策例

ゲームアツマール版のニコニコ大百科:グラフ機能には対策が施されており、前述の入に対しては「不正な色文字列です。」と出される。

この記事を編集する

掲示板

おすすめトレンド

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

記事と一緒に動画もおすすめ!
ニコニ広告[単語]

提供: ****にゃぱちゃ?!?****

もっと見る

急上昇ワード改

最終更新:2024/04/25(木) 17:00

ほめられた記事

最終更新:2024/04/25(木) 17:00

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

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

OK

追加に失敗しました。

OK

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

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

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

OK

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

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

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

TOP