홈페이지 취약점 분석 이야기 파일 지도 사진 깨알






>> 목록보이기
#조치방안 #파일업로드 취약점 #방어법 #파일업로드 방어 #웹쉘등록 방어 #확장자 검증 #확장자 제거 #A1-Injection

웹쉘/파일 업로드 방어방법

SmartEditor2의 이미지업로드 기능을 참조하여 안전한 첨부파일 업로드 기능을 구현해보았다. 이 방식에서는 확장자만 소문자로 변환시켜서 유지하고 파일이름은 관리가 편한 방식으로 변경한다.

<?php
	$tmp_name = $_FILES['Filedata']['tmp_name'];
	$filename = $_FILES['Filedata']['name'];
	$filename_ext = strtolower(array_pop(explode('.',$filename)));
	$allow_ext = array("jpg", "png", "hwp", "pptx", "docx", "xlsx", "pdf");
	if(!in_array($filename_ext, $allow_ext)) {
		echo "허용되지않는 확장자 파일입니다.";
		exit;
	}
	// 파일 이름의 예: "../upload/201611092314172063257683.hwp"
	$newPath = '../upload/'.date('YmdHis').mt_rand().'.'.$filename_ext;
	@move_uploaded_file($tmp_name, $newPath);
?>

첨부파일 처리 순서는 다음과 같다.

  • 가장 마지막(array_pop()) 마침표(.) 다음 문자열의 소문자(strtolower())를 파일의 확장자로 한다: array_pop(explode('.',$filename))
  • 허용된 확장자를 가지는 파일이 아니면 버린다: if(!in_array($filename_ext, $allow_ext)) exit;
  • 저장할 실제 파일이름은 내부적인 규칙에 따라 만들어서 공격의 여지를 차단한다: date('YmdHis').mt_rand()

위와 같은 방식으로 업로드된 파일은 "../upload/" 디렉토리 밑에 "20161110084417864888954.jpg"와 같은 이름을 가지게 된다.

일부 웹 어플리케이션에서는 아예 확장자를 붙이지 않고 파일이나 파일이름의 해쉬 값을 이용하여 -- 예를 들어 "../upload/f9869af5bb8e37fb456d13deb152319e")와 같이 -- 파일을 저장하기도 한다.

<?php
	$newPath = '../upload/'.md5_file($_FILES['Filedata']['tmp_name']);
	@move_uploaded_file($_FILES['Filedata']['tmp_name'];, $newPath);
?>

위와 같이 확장자를 제거하면 굳이 첨부파일의 확장자를 검증할 필요가 없는 장점이 있다. 메일 솔루션이나 그룹웨어 등에서 종종 채택하는 방식이다.

[처음 작성한 날: 2016.11.09]    [마지막으로 고친 날: 2016.11.10] 


< 이전 글 : HTTP 메소드 수동점검 방법 (2016.11.10)

> 다음 글 : 파일다운로드/경로조작 방어하기 (2016.11.09)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문