小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

WEB脆弱性のディレクトリ・トラバーサル(Directory Traversal)とは?

「../../」のような相対パスを使用し、システム内の任意ファイルへアクセスする攻撃手法をディレクトリ・トラバーサルと言います。
システム内のディレクトリ間を自由に横断(トラバース)できることが攻撃名称の由来で、パス・トラバーサルとも呼ばれます。


対策は、CGIでは、GET(引数)とPOST(hidden)で、ファイル名のみで、ファイルパスを指定しないように設計します。
また、万が一、ファイル名にファイルパスを付加された場合を想定して、そのようなパスを削除するように設計します。

◆ ディレクトリ・トラバーサル対応のサンプルプログラム

#!c:/perl/bin/perl.exe
use strict;
use File::Basename;
use CGI;

my $form = new CGI;
my $file_name = $form->param('file_name');
local $/;

my $dir = 'c:/wk/';                # パス情報をプログラム内で持つ
$file_name = basename($file_name); # パスを指定されてもファイル名だけにする
                                   # openは、パス名とファイル名で連結する
open(my $fh, '<', $dir . $file_name) or die "$file_name, open err ($!)";

my $wk = <$fh>;
print <<"HERE1";
Content-type: text/plain; charset=Shift_JIS;

<html>
<body>
<h1>test</h1>
<p>$wk</p>
</body>
</html>
HERE1


尚、上記は、XSS対応にはなっていませんので、ご注意を!
XSSに関しては、後日まとめる予定です。

◆ 補足

『./』は自ディレクトリです。
『../』は、親ディレクトリです。
たとえば、bbbディレクトリにtest.txtがあったとします。
すると、

cat /aaa/bbb/test.txt

cat /aaa/bbb/ccc/ddd/../../test.txt

は、同じになるのです。


また、本記事は、以下のURL先を大変参考にさせて頂きました。問題があればコメント欄でご指摘ください。