初心者データサイエンティストの備忘録

調べたことは全部ここに書いて自分の辞書を作る

OSコマンド・インジェクションとセッション・ハイジャック

OSコマンド・インジェクションとセッション・ハイジャックについて勉強しました。本記事はこれらの攻撃についてまとめています。なお、私はセキュリティに関してはずぶの素人で本記事にも誤りが含まれているかもしれません。その際はコメントでご指摘いただけると幸いです。

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

どんな攻撃?

脆弱性のあるWEBサイトの入力値に、悪意あるOSコマンドを入力することでWEBサーバに不正な動作を引き起こす攻撃です。

ファイル名を変更をする機能を持ったWEBサイトがあるとします。図1のようなイメージです。

図1:ファイル名を変更するWEBサイト

このとき、WEBサーバ上の次のようなコマンドに脆弱性が含まれます。

exec("rename " . $oldFileName . " " . $newFileName)

なお、$oldFileNameは変更前のファイルの名前、$newFileNameには変更後のファイルの名前が入ります。このとき、
$oldFileName = old.txt
$newFileName = new.txt & dir
などの値が入力されると

exec("rename old.txt new.txt & dir")

と構成されてしまいます。このとき、本当はrenameだけを実行したかったのに、renameとdirの両方が実行されてしまうという問題があります。 このように入力値にOSコマンドを入力することでWEBサーバに不正な挙動させる攻撃をOSコマンド・インジェクションと呼びます。

どんな影響があるの?

脆弱性体験学習ツール AppGoat:IPA 独立行政法人 情報処理推進機構によれば、次のような影響があるそうです。

  • サーバ内のファイルが不正に操作される
  • 不正にシステムを操作される
  • 不正なプログラムがダウンロードされ、実行される
  • 他システムへの攻撃の踏み台にされる

対策

対策方法は2つあります。1つ目は、PHPが提供している関数を使うことでOSコマンドをそもそも構成しない方法です。2つ目は、エスケープ処理を行い&のような特殊文字を単なる文字列'&'にしてしまうことです。

まずは、PHPが提供している関数を使う方法です。 脆弱性が含まれているコードを修正します。

# 脆弱性が含まれているコード
exec("rename " . $oldFileName . " " . $newFileName)

# 修正したコード(代替の関数を使う)
rename($oldFileName , $newFileName)

このように、OSコマンドでrenameをしていた箇所をPHPが提供しているrenameを使うことでOSコマンド・インジェクションを防ぐことができます。

次に、エスケープ処理を行う方法です。

# 脆弱性が含まれているコード
exec("rename " . $oldFileName . " " . $newFileName)

# 修正したコード(エスケープ処理を使う)
exec("rename " . escapeshellarg($oldFileName). " " . escapeshellarg($newFileName))

以上のようにすることで、OSコマンド・インジェクションを防ぐことができます。

セッション・ハイジャック

どんな攻撃?

セッションIDを固定化したり、盗み出して悪用することで不正に認証を通過する攻撃です。

悪意ある者がクロスサイト・スクリプティングXSS)などを用いて被害者のセッションIDを固定化します。その後、被害者が固定化されたセッションIDを使って何らかのサービスにログインすると、ログインされたサービスはセッションIDを記憶し、それ以降はパスワード等を入力せずにログインできるようになります。これを利用すると、悪意ある者が被害者になりすましてログインできるようになります。これがセッション・ハイジャックです(図2)。

図2:セッション・ハイジャック

どんな影響があるの?

AppGoatによれば下記のような影響があるようです。

  • ログイン後の利用者のみが利用可能なサービスの悪用
  • ログイン後の利用者のみが編集可能な情報の改ざん
  • ログイン後の利用者のみが閲覧可能な情報の閲覧

対策

ログイン前後でセッションIDを変えることが対策になります。

ログイン前後でセッションIDを変えることで、悪意ある者が設定したセッションIDは無効となり、セッション・ハイジャックを防ぐことができます(図3)。

図3:セッション・ハイジャックを防ぐ方法

まとめ

今回はOSコマンド・インジェクションとセッション・ハイジャックについて説明しました。OSコマンド・インジェクションは、SQLインジェクションなどと同様に入力値を介した攻撃でした。一方でセッション・ハイジャックはセッションIDの仕組みを利用した攻撃でした。どちらの攻撃も攻撃が行われる仕組みを知ることで防御手法についても学びやすくなると思いました。