2013-02-09 1 views
7

업로드 양식에서 널 바이트 주입 공격을 재현하려고합니다. 그렇게는 SUBSTR()를 무시하고 인 move_uploaded_file 이후 file.php로 업로드됩니다 file.php %의 00jpg (:이 같은 이름의 파일을 업로드하기 위해 노력하고있어업로드 양식에 널 바이트 삽입

<?php 
if(substr($_FILES['file']['name'], -3) != "php") { 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name'])) 
    echo '<b>File uploaded</b>'; 
    else 
    echo '<b>Can not upload</b>'; 
} 
else 
    echo '<b>This is not a valid file/b>'; 
?> 

:이 코드가)는 널 바이트 (% 00)에서 중지해야합니다.

문제는 업로드 된 파일이 file.php 서버하지만 file.php %가 00jpg (URL 표시 줄에 /file.php%2500jpg을 입력하여 액세스 할 수있는 명명되지 않는 것입니다).
move_uploaded_file()은 null 바이트를 신경 쓰지 않는 것 같습니다. 어떻게 작동합니까? 내 코드와 함께 .php 확장자를 가진 파일을 업로드 할 수 있습니까?

감사합니다. :).

+0

'.cgi' 또는'.asp '나'.phtml'와 같은 다른 "활성"확장자로 파일을 업로드 할 수 있습니다. – duskwuff

+2

PHP에서 NULL 바이트 중독이 수정되었습니다. 5.3. 4 '. –

+3

** 파일 업로드 **에 블랙리스트를 사용하지 마십시오. 화이트리스트를 사용하십시오. 또한, 나는 그 주위에 몇 가지 쉬운 방법을 생각할 수 있습니다. 당신은 위생해야합니다. – Amelia

답변

7

HTML 형식 urlencodes는 파일 이름을 % 2500으로 바꾸고 PHP는 % 00 (백분율 기호, 0, 0)으로 다시 디코딩합니다. 어디에서나 테스트에 null 바이트가 없기 때문에 HTML 폼 대신 HTTP 요청을 사용하여 파일을 실제 null 바이트 (불가능) 또는 바이올린으로 이름을 지정해야합니다. 여전히 현재의 PHP 버전은 이 공격에 취약한이 아니므로 PHP는 내부적으로 ZVal 컨테이너라는 변수에 상자를 넣고 아무런 효과없이 문자열 중간에 null 바이트를 허용합니다.