13. PHP 로 작성된 게시판의 소스코드이다. 해당 게시판의 취약점명, 업로드 로직을 우회하는 기법, 공격이 성공하기 위한 조건을 설명하시오.
[게시판 소스 코드]
<?
// 파일 확장자 중 업로드를 허용할 확장자를 정의함
$full_filename = explode(".", $_FILES['userfile']['name']);
$extension = $full_filename[sizeof($full_filename)-1];
if (!( ereg($extension","hwp") || ereg($extension","pdf") || ereg($extension","jpg")) )
print "업로드 금지 파일 입니다";
exit;
If (($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") ||
($_FILES["file"]["type"] == "image/JPG") || ($_FILES["file"]["type"] == "text/plain"))
{
echo "파일 업로드 성공"
}
else
{
echo "파일 업로드 실패. 허용된 파일의 형식이 아닙니다."
}
?>
| 정답 확인 | 맞췄어요 O | 틀렸어요 X |
2) 우회 기법
- 파일 타입 변조 : Proxy 툴을 이용하여 Request Message 헤더내에 파일 유형을 알려주는 Content-Type 속성을 image/jpeg 으로 변경
- 파일 확장자 변조 : 파일 확장자를 대소문자를 섞거나(test.PhP), 이중 확장자(test.php.jpeg or test.jpeg.php) 사용
- Null 바이트 삽입 : Null바이트(%00)와 .jpeg 확장자를 함께 접목하여 업로드(예: test.php%00.jpeg)하면 파일 확장자 검증 로직은 통과되고, 서버에 저장시에는 Null바이트를 문자의 끝으로 해석하여 test.php로 저장됨.
3) 공격 성공 조건
- 파일 타입 또는 확장자 변조가 서버의 필터링 로직을 통과해야 함
- 업로드 하는 파일이 서버에 설정된 업로드 제한 조건(예: 사이즈 제한(LimitRequestBody)에 걸리지 않아야 함
- 업로드 된 파일이 서버에 설정된 아래와 같은 실행 제한 조건에 걸리지 않아야 함
. AddType 지시자에 따라 MIME type 이 text/html로 재조정(실행불가)
. FileMatch 지시자에 따라 직접 URL 호출 금지