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

※動作テストは自己責任で必ず自分の環境で確認すること。

ディレクトリ・トラバーサルとは

ディレクトリ・トラバーサルとは、ネットワーク上の脆弱性を利用した攻撃手法の一種で、「../」を利用してディレクトリを遡り、本来はアクセスが禁止されているディレクトリにアクセスする手法のことである。
または、そのような脆弱性のことである。
ネットワーク上でのディレクトリのパスを指定する際、「1つ上の階層へ上る」ことを指示する「../」のパスを組み合わせて指定することで、公開されているディレクトリの上階層から、その併置されている非公開のディレクトリへアクセスできてしまう場合がある。
このような操作によって、個人情報や機密情報を盗まれたり、悪意のあるコードを書き込まれたりといった被害を被る可能性が生じる。
ディレクトリ・トラバーサルは、パスの指定を制御するための処理の仕方に不備があって万全ではない場合に問題となる。
「../」の文字列を無効にするように設定しても、エンコード後に「../」の文字列と等価になるもj列が適切に処理されていなければ、ディレクトリ・トラバーサルの標的になる危険性がある。
ディレクトリ・トラバーサルへ対応するためには、そういった処理に万全を期することが重要とされる。

ディレクトリを遡って、任意のファイルにアクセスする攻撃

■攻撃先

制御構造:includeinclude_onecerequirerequire_once
ファイルシステム系関数:fopen()file()copy()unlink()等
プログラム実行系関数:system()exec()passthru()

■被害

想定外のファイルの中身を覗かれたり、削除・編集が行われる。(ファイルシステム系関数やinclude、requireの場合)
任意のコマンドがリモートから実行可能となる。(プログラム実行関数の場合)

Case 1

<?php
readfile('/home/myhome/data/'.$_GET['file']);
?>
リクエスト変数に「../../」を踏める事によって、上位ディレクトリに遡る。

対策方法

・ホワイトリスト法

開いて良いファイルをあらかじめ配列に用意しておき、その配列になければ処理中断
<?php
if(!in_array($_GET['file'], (許可ファイルの配列)))
{
  exit;
}
readfile('/home/myhome/data/'.basename($_GET['file']));
?>

・ブラックリスト法

ファイル名に「..」があった辞典で処理を中断する。
※ルートからの指定を許してしまう可能性がある。遡りのない不正ファイル指定には無効。
<?php
if(strstr($_GET['file'], '..'))
{
  exit;
}
readfile('/home/myhome/data/'.basename($_GET['file']));
?>

・サニタイズ法

ファイル名にbasename()をかけてから渡す。
※ファイル名に改造構造を含められない。遡りのない不正ファイル指定には無効。

・open_basedir制限

PHPスクリプトが開く可能性のあるディレクトを抽出し、php.iniまたはhttpd.confでopen_basedir制限をかける。

・php.iniへ記述

<?php
open_basedir = /home/myhome/:/tmp/:usr/loacal/lib/php/
?>

・httpd.confへ記述

<Directory /home/myhome/>
php_admin_value open_basedir /home/myhome/:/tmp/:usr/local/lib/php/
</Directory>

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/10/3 19:55時点)

Previous Post

Next Post

Comments are closed.