前回は、メール送信、ファイルアクセス、OSコマンド呼び出しによる脆弱性対策についてまとめた。ここでは、ファイルアップロード、インクルード、eval、共有資源による問題についてまとめる。
1 ファイルアップロードによる問題
ファイルアップロードの問題の概要
アップローダとは、画像やPDFなどのファイルをアップロードして公開する機能のこと。アップローダに対する攻撃には、以下の4つがある。
- アップロード機能に対するDoS攻撃(Denial of Service Attack):巨大なファイルを連続して送信することにより、Webサイトに過大な負荷をかけるサービス妨害攻撃。容量制限が有効(php.ini設定など)
- サーバー上のファイルをスクリプトとして実行する攻撃(後述)
- 仕掛けを含むファイルを利用者にダウンロードさせる攻撃(マルウェア対策)
- ファイルの権限を越えたダウンロード(認可)
アップロードファイルによるサーバー側スクリプト実行
概要
1)利用者がアップロードしたファイルがWebサーバーの公開ディレクトリに保存され、2)ファイル名の拡張子として、php、asp、aspx、jspなどスクリプト言語のスクリプトを示す拡張子が指定できると、アップロードしたファイルをスクリプトとしてWebサーバー上で実行できる。このことを悪用することで脆弱性が発生する。
- 発生箇所:ファイルのアップロード機能を提供するページ
- 影響箇所:すべてのページ
- 影響の種類:秘密情報の漏洩、データの改ざん・削除、外部へのDoS攻撃、システムの停止など
- 影響の度合い:大
- 利用者関与の度合い:不要
- 対策の概要:以下のいずれかあるいは両方を行う。利用者がアップロードしたファイルは公開ディレクトリに置かず、スクリプト経由で閲覧させる。ファイルの拡張子をスクリプト実行の可能性のないものに制限する
攻撃手法と影響
system関数によりcatコマンドを呼び出し、/etc/passwdの内容を表示するなど。PHPスクリプトが動作するOSアカウントで実行可能な機能は、すべて悪用可能である。
脆弱性が生まれる原因
以下の両方に該当すること。
- アップロードしたファイルが公開ディレクトリに保存される
- アップロード後のファイル名として「.php」、「.asp」などスクリプトを示す拡張子が指定できる
対策
ファイルを公開ディレクトリに保存しないこと(より確実)。
ファイルダウンロードによるクロスサイト・スクリプティング
概要
ブラウザの誤認を利用する攻撃のこと。例えば、PNG画像を想定しているにもかかわらず画像のデータ中にHTMLタグが含まれていることにより、利用者のブラウザがHTMLファイルとして認識し、画像ファイルに埋め込まれたJavaScriptを実行することである。
- 発生箇所:ファイルのアップロード機能、ダウンロード機能
- 影響箇所:アプリケーション全体。特にセッション管理や認証のあるページは影響が大きい
- 影響の種類:なりすまし
- 影響の度合い:中〜大
- 利用者関与の度合い:必要。リンクのクリックなど
- 対策の概要:ファイルのContent-Typeを正しく設定する。画像の場合、拡張子と画像の中身(マジックバイト)が対応していることを確認する。ダウンロードを想定したファイルには、レスポンスヘッダとして「Content-Disposition:attachment」を指定する
攻撃手法と影響
以下の2つの手法は、Internet Explorer(IE)で再現可能である。
- 画像ファイルによるXSS
- PDFダウンロードが画面によるXSS
脆弱性が生まれる原因
Internet Explorer特有の仕様が影響している。コンテンツが画像の場合とそれ以外の場合で仕様が異なる。
対策
ファイルアップロード時とダウンロード時の対策に、以下のことを実施する。他にヤフーやYouTubeなど、画像を別ドメインで配信するなどで対策している。
- ファイルアップロード時:拡張子が許可されたものかをチェックする。画像の場合はマジックバイトも確認する。
- ファイルダウンロード時:Content-Typeを正しく設定する。画像の場合はマジックバイトを確認する。必要に応じてContent-Dispositionヘッダを設定する
2 インクルードによる問題
ファイルインクルード攻撃
概要
インクルードとは、外部からスクリプトの一部を読み込むことである。
- 発生箇所:includeなどによりスクリプトを読み込んでいるページ
- 影響箇所:すべてのページ
- 影響の種類:情報漏洩、サイト改ざん、不正な機能実行、他サイトへの攻撃(踏み台)
- 影響の度合い:大
- 利用者関与の度合い:不要
- 対策の概要:以下のいずれかを行う。インクルードするパス名に外部からのパラメータを含めない。含める場合は英数字に限定する
攻撃手法と影響
- ファイルインクルードによる情報漏洩:ヌルバイト攻撃
- スクリプトの実行1:リモート・ファイルインクルード攻撃(RFI)
- スクリプトの実行2:セッション保存ファイルの悪用
脆弱性が生まれる原因
- インクルードファイル名を外部から指定することができる
- インクルードすべきファイル名かどうかの妥当性チェックをしていない
対策
ディレクトリ・トラバーサル脆弱性の場合と同様。保険的対策は、RFI設定を禁止すること。
- 外部からファイル名を指定する仕様を避ける
- ファイル名にディレクトリ名が含まれないようにする
- ファイル名を英数字に限定する
3 evalによる問題
evalインジェクション
概要
eval(evaluate)関数とは、与えられた文字列をスクリプトのソースとして解釈して実行する機能のこと。
- 発生箇所:evalのようにスクリプトを解釈して実行できる機能を利用しているページ
- 影響箇所:すべてのページ
- 影響の種類:情報漏洩、サイト改ざん、不正な機能実行、他サイトへの攻撃(踏み台)
- 影響の度合い:大
- 利用者関与の度合い:不要
- 対策の概要:以下のいずれかを行う。evalに相当する機能を使わない。evalの引数には外部からのパラメータを含めない。evalの与える外部からのパラメータを英数字に制限する
攻撃手法と影響
「$a = 式; 任意の文;」を追加すること。
脆弱性が生まれる原因
- evalを用いることがそもそも危険
- evalに与えるパラメータのチェックがされていない
対策
- eval(同等機能含む)以外の関数を使う:implode/explode、serialize/unserializeなど
- evalの引数にセッション変数などを使う(外部からのパラメータを指定しない)
- evalの与える外部からのパラメータを英数字に制限する
4 共有資源による問題
競合状態の脆弱性
概要
共有資源とは、複数のプロセスやスレッドから同時に利用している変数、共有メモリ、ファイル、データベースなどのこと。共有資源に対する排他制御が不十分な場合、競合状態(Race Condition)の脆弱性の原因となる場合がある。
- 発生箇所:共有資源を利用している箇所
- 影響箇所:アプリケーション全体が多い
- 影響の種類:別人の個人情報の表示、データベースの不整合、ファイルの内容破壊、その他様々
- 影響の度合い:中
- 利用者関与の度合い:要・不要とも
- 対策の概要:以下のいずれかを行う。可能であれば共有資源の利用を避ける。共有資源に対する適切な排他制御を行う
攻撃手法と影響
別人問題という現象を利用(Tomcatなどサーブレットコンテナで実験可能)。
脆弱性が生まれる原因
- 変数nameは共有変数である
- 共有変数nameの排他制御をしていない
対策
以下のいずれかを実施する。
- 可能であれば共有資源を使用しない:ローカル変数にする
- 共有資源に対して排他制御を行う:synchronized文やsynchronizedメソッド(Java)
最後に
ファイルアップロードにおいては、Content-Typeと拡張子を正しく設定すること。インクルードにおいては、外部からファイル名を指定する仕様を避けるなど、ディレクトリ・トラバーサル脆弱性対策と同じ。evalにおいては、極力evalを使わない実装を行うこと。共有資源においては、それをできるだけ使わず、使う場合でもsynchronized文などで排他処理の時間を短時間で終わらせる設計にすることが重要である。
ブラウザの仕様によって脆弱性に違いが出るものもある。例えば、ファイルダウンロードによるクロスサイト・スクリプティングは、IE特有で発生する。自身の使用しているブラウザ以外でのチェックも可能な限り行うことで、より安全性の高いアプリケーションが作成できるだろう。
次回は、代表的なセキュリティ機能のうち、認証についてまとめる。
![]() |