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
◆ 補足
『./』は自ディレクトリです。
『../』は、親ディレクトリです。
たとえば、bbbディレクトリにtest.txtがあったとします。
すると、
cat /aaa/bbb/test.txt
と
cat /aaa/bbb/ccc/ddd/../../test.txt
は、同じになるのです。
また、本記事は、以下のURL先を大変参考にさせて頂きました。問題があればコメント欄でご指摘ください。