質問があります。以下のスクリプトにセキュリティホールがあるといわれました。構造は
@./のディレクトリに.cgiのファイルがあるかないかチェック
Aファイルがあれば、ファイル名.cgiを呼び出す
ですが、$_GET['file']に%00を付加されれば、チェックを擦り抜けられました。
<?php
$file = $_GET['file'];
echo "file test<br>";
echo "How do it?<br>";
if(!file_exists($file.".cgi")) { echo "file not found<br>"; } else { echo "file found<br>"; }
$x = file_get_contents('./'.$file.'.cgi');
echo $x; ?>
上の場合、チェック機構を擦り抜けられてしまったので、下のように書き加えました。
<?php
function check($arr){ if (is_array($arr)){ return array_map('check',$arr );} return str_replace("\0","",$arr );}
$_GET = check($_GET);
$file = $_GET['file'];
echo "read test<br>"; if(!file_exists($file.".cgi")){ echo "file not found<br>"; }else{ echo "file found<br>"; }
$x = file_get_contents('./'.$file.'.cgi');
echo $x;
?>
しかし、まだセキュリティホールがあると、指摘され、詳細がわからずに困っています。誰か教えてください