웹에 존재하는 빈틈 및 원리 분석, 예방 방법(파일 이름 검출 빈틈)

우리는 전편: <웹 저장 빈틈 및 원리 분석, 예방 방법 (보안 파일 저장 방법)>을 통해 백엔드에서 서버 변수를 가져오고 클라이언트에서 들어오는 것을 이미 알고 있습니다.일반적인 get,post와 다를 것이 없습니다.다음은 흔히 볼 수 있는 빈틈 코드를 살펴보자.1. 파일 형식을 검사하고 사용자 저장 파일 이름으로 저장

if(isset($_FILES['img']))
{
    $file = save_file($_FILES['img']);
 if($file===false) exit(' !');

 echo " !",$file;
}
function check_file($img)
{
 ///
 if($img['error']>0) return false;

 $tmpfile = $img['tmp_name'];
 $filename = $img['name'];

 
 ///
 $len=strrpos($filename,".");
 if($len===false) return false;

 //
 $ext = strtolower(substr($filename,$len+1));
 if(!in_array($ext,array('jpg','jpeg','png'))) return false;
 return true;
}
function save_file($img)
{
 if(!check_file($img)) return false;

 // ok,
 $filename = $img['name'];
 $newfile = "upload/" .$filename;
 if(!move_uploaded_file($img["tmp_name"],$newfile)) return false;

 return $newfile;
}
?>
이상의 코드를 입력하여 입력 유형도 판단하여 보았으나 문제가 없다.그러나 문제는 얻은 사용자 이름 변수에 대한 검측에 확실히 나타난다.전송된 사용자 이름을 직접 가져와서 파일로 저장합니다.어떤 친구는 이 파일 이름들은 모두 내 컴퓨터에 존재하는 것이고 파일 이름 형식은 모두 운영체제가 파일 이름에 대한 정의에 제한을 받는다고 말할 것이다.단, 주의해야 할 것은 $_FILES에서 변수를 가져옵니다. http request 요청에서 직접 가져옵니다.보통 get,post 변수를 가져오는 것과 같습니다.따라서 다른 꿍꿍이가 있는 사람들은 종종 스스로 브라우저를 모의하여 서버에 특수한 파일 이름을 보낸다.그리고 파일을 저장할 때 정상적으로 자신의 형식으로 저장할 수 있도록 합니다."""\0""은(는) 문자열에 파일로 저장되어 다음 내용이 자동으로 잘립니다.예: $filename 구조는 다음과 같습니다. "a.php\0.jpg', 어떻게 될지 생각해 봅시다.newfile = "upload/a.php\0.jpg"확장자 검증, 맨 오른쪽이기 때문입니다.다음 문자는 jpg입니다. 그림 형식을 허용합니다.하지만, 우리는 이 파일 이름으로 저장한다.디스크가 upload 디렉터리 아래에 a.php,\0 뒤에 있는 모든 문자를 생성하고 자동으로 차단됩니다.이 빈틈은 한 시대를 풍미했다.당시 거의 대부분의 상존 사이트에 빈틈이 있었다.한때 많은 플랫폼이 메모리를 닫았다.사실 근본적인 원인은 여기에 있다.우리는 파일 이름을 받아서 최종 생성 파일 이름으로 저장했다.좋은 방법은 파일 이름과 확장자를 무작위로 만드는 것입니다.이렇게 하면 특수 문자를 조직하여 입력할 수 있으며, 파일 저장을 할 때 버림받거나 절단될 수 있다.php4 시대의 이 빈틈은 php5 시대에 이르러 생성된 변수 파일 이름 값에서'\0'을 자동으로 필터링하여 사용자 구조가 어떤 특수하든'\0'사용자를 차단하는 데 사용할 수 있다.그러나 현재 이런 빈틈은 asp, jsp 등 사이트에서 있다.자주 나타나요.오래된 버전의 php 사이트도 자주 나타난다.자, 오늘은 여기까지 하고 뒤에 두 가지 다른 흔한 방법이 있습니다. 뒤에 드리겠습니다!교류를 환영합니다!

좋은 웹페이지 즐겨찾기