My Photo

« PHPメモ036:グローバル変数のクリア | Main | 意図しないファイル公開 »

February 06, 2014

ディレクトリ・トラバーサル脆弱性

発生箇所 ファイル名を外部から指定できるページ
影響を受けるページ すべてのページが脆弱性の影響を受ける。
影響の種類 秘密情報の漏洩、データの改ざん・削除、任意のスクリプトの実行、アプリケーションの機能停止
利用者の関与の度合い 不要

概要

外部からパラメータでサーバ上のファイル名を指定できるWebアプリケーションでは、ファイル名に対するチェックが不十分であるとアプリケーションの意図しないファイルに対して閲覧や改ざん、削除ができる場合がある。これをディレクトリ・トラバーサル脆弱性と呼ぶ。
影響は以下。

  • Webサーバ内のファイルの閲覧
    →重要情報の漏洩
  • Webサーバ内のファイルの改ざん、削除
    →Webコンテンツ改ざん
    →マルウェアのサイトなどに誘導する仕組みの書き込み
    →スクリプトファイルや設定ファイルの削除による機能停止
    →スクリプトファイル改ざんによる任意のスクリプト実行

攻撃手法

以下は画面のテンプレートファイルを指定できるスクリプトである。

<?php
define('TMPLDIR', '/var/www/tmpl/');
$tmpl = $_GET['template'];
?>
<body>
<?php readfile(TMPLDIR . $tmpl . '.html'); ?>
以下略
</body>

このスクリプトの正常系の実行例を示す。

http://example.jp/sample.php?template=spring

上記のURLでは
/var/www/tmpl/spring.html
が表示される。

次は攻撃の例を示す。

http://example.jp/sample.php?template=../../../etx/hosts%00

この場合、ファイルパスは次のように組み立てられる。
/var/www/tmpl/../../../etc/hosts[NULL].html
"[NULL]"はヌルバイトを表す。ヌルバイトによりファイル名が終端され、正規化後のパスは
/etc/hosts
となり、hostsファイルが表示される。
このように、ディレクトリトラバーサル・トラバーサル脆弱性があるとWebサーバ上の任意のファイルにアクセスが可能となる。アプリケーションの実装によっては書き込みや削除が可能となる場合もある。
さらにディレクトリ・トラバーサルを用いてPHPなどのスクリプトファイルに書き込みができると、Webサーバ上で実行することにより任意のスクリプトを実行できる場合があります。この際の影響はOSコマンド・インジェクションと同じで、外部から不正プログラムをダウンロードされたりシステムに対する不正操作が可能となる。

脆弱性の原因

  • ファイル名を外部から指定することができる。
  • ファイル名として絶対パスや相対パスの形で異なるディレクトリを指定できる。
  • 組み立てたファイル名に対するアクセスの可否をチェックしていない。

上記3つをすべて満たす場合にディレクトリ・トラバーサル脆弱性が発生する。

対策

上記、であげた原因のうちいずれか1つでも対応すれば脆弱性は解消する。
以下、対策を説明する。

●外部からファイル名を指定できる仕様を避ける

ファイル名を外部から指定できなくすれば、ディレクトリ・トラバーサル脆弱性を根本的に解決できる。以下の方法で可能である。
・ファイル名を固定にする。
・ファイル名を直接指定するのではなく番号などで間接的に指定する。

●ファイル名にディレクトリが含まれないようにする

ファイル名にディレクトリ名が含まれないようにすれば、アプリケーションの想定したディレクトリのみにアクセスすることになりディレクトリ・トラバーサル脆弱性が解消する。
ディレクトリを示す文字記号はOSにより異なるので、OSによる違いを吸収できるライブラリを使用するべきである。PHPの場合はbasename()が使用できる。
basename()を用いた対策例を以下に示す。

<?php
define('TMPDIR', '/var/www/tmpl');
$tmpl = basename($_GET['template']);
?>
<body>
<?php readfile(TMPDIR . $tmpl . '.html'); ?>
</body>

basename() はヌルバイトがあっても削除しないので、basename() を使用しても拡張子を変更される場合があるので注意が必要である。
例えば外部から a.php%00 というファイル名(パーセントエンコーディングされている)が指定された場合、後にスクリプトで拡張子を付加してもヌルバイトで終端されて a.php というファイル名ができる。

●ファイル名を英数字に限定する

ファイル名の文字種の仕様を英数字に限定すればディレクトリ・トラバーサル脆弱性への攻撃に用いる記号文字が使えなくなる。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.10.1 ディレクトリ・トラバーサル脆弱性

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

« PHPメモ036:グローバル変数のクリア | Main | 意図しないファイル公開 »

PHP」カテゴリの記事

セキュリティ」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/59084123

Listed below are links to weblogs that reference ディレクトリ・トラバーサル脆弱性:

« PHPメモ036:グローバル変数のクリア | Main | 意図しないファイル公開 »

September 2017
Sun Mon Tue Wed Thu Fri Sat
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof