서버 측에서 실행될 수 있는 스크립트 파일(asp, jsp, php 파일 등)이 업로드가능하고, 이 파일을 공격자가 웹으로 직접 실행시킬 수 있는 경우, 시스템 내부명령어를 실행하거나 외부와 연결하여 시스템을 제어할 수 있는 보안약점이다.
비박스 Unrestricted File Upload
simple-backdoor.php 업로드, 브라우저에서 php 파일 읽기 가능
하지만 보안등급을 high로 설정하면 화이트리스트 정책이 적용되어 php 파일 업로드 불가
case "2" :
$file_error = file_upload_check_2($_FILES["file"], array("jpg","png"));
if(!$file_error)
{
//move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . $_FILES["file"]["name"]);
move_uploaded_file($_FILES["file"]["tmp_name"], "/data/images/" . $_FILES["file"]["name"]);
//외부에서 접근할 수 없는 경로에 파일을 저장하도록 수정
}
break;
/*생략*/
<?php
if(isset($_POST["form"]))
{
if(!$file_error)
{
//기존 코드
//echo "The image has been uploaded <a href=\"images/" . $_FILES["file"]["name"] . "\" target=\"_blank\">here</a>.";
echo "The image has been uploaded <a href=\"/data/images/" . $_FILES["file"]["name"] . "\" target=\"_blank\">here</a>.";
echo "<img src=\"/data/images/" . $_FILES["file"]["name"] . "\">";
/* 업로드된 파일에 대한 링크(<a>)와 출력(<img>)을 저장된 경로로 수정
주소를 통해서 접근할 수 없으므로 링크도 출력도 되지 않음*/
}
else
{
echo "<font color=\"red\">" . $file_error . "</font>";
}
}
?>
if(isset($_POST["form"]))
{
if(!$file_error)
{
/*
echo "The image has been uploaded <a href=\"/data/images/" . $_FILES["file"]["name"] . "\" target=\"_blank\">here</a>.";
echo "<img src=\"/data/images/" . $_FILES["file"]["name"] . "\">";
*/
echo "The image has been uploaded <a href=\"download.php?file=" . $_FILES["file"]["name"] . "\" target=\"_blank\">here</a>.";
echo "<img src=\"download.php?file=" . $_FILES["file"]["name"] . "\">";
//좌측하단 링크로 인한 웹 루트 경로 가리지
}
else
{
echo "<font color=\"red\">" . $file_error . "</font>";
}
}