## File Upload 취약점
* 일반적으로 업로드가 허용되는 이미지 파일등 외에 허용되지 않은 (웹쉘같은) 악의적인 파일을 올려서 서버를 장악할 수 있는 취약점이다.
jsp, php, asp 등의 파일을 업로드하여 악성행위를 하게 된다.
## File Upload 취약점 원인
* 해당 페이지에서 허용하는 파일만 업로드 할 수 있게 해놓아야 하는데, 업로드 파일에 대한 검증 부분이 취약하여 해커가 악성코드를 서버에 심을 수 있게 된다.
## Upload File 확장자 필터링 방식
* 클라이언트가 업로드하는 파일의 확장자를 검사하여 파일을 필터링 하게 된다.
#### 확장자 필터링 우회 방식 예시
* 확장자의 대소문자를 바꿔가며 시도해 본다. ex) a.php -> a.pHp
* 확장자만 바꿔서 올린다 ex) a.php -> a.jpg
* a.php -> a.php.kr
* a.php -> a.php.
* a.php -> a.php;.jpg (세미콜론 사용)
* a.php -> a.php%00.jpg (NULL Byte 사용)
#### 파일 업로드 후 파일의 절대경로가 바로 나오는 경우도 있으나 그렇지 않을 경우 디렉토리 구조를 파악한 후 업로드 된 파일의 절대경로를 찾아야 한다.
## File Upload 취약점 대응 방식
#### 서버에서 대응 방식
* 파일이 업로드 되는 디렉토리의 실행 권한을 제거 한다.
* 업로드 된 파일의 이름을 무작위로 변경한다.
* 너무 작거나 큰 파일을 처리하는 로직을 포함해야 한다.
* 임시 디렉토리에서 업로드된 파일을 지우거나 다른곳으로 이동시킨다.
* 폼에서 어떠한 파일도 선택되지 않았다면 파일 업로드에 사용되는 변수를 초기화 시킨다.
* Content-Type 이나 File Signature를 확인하여 허용하는 파일 형식만 업로드할 수 있게끔 한다.
#### 확장자 필터링 우회 대응 방식 예시
* Server Side에서 구현한다.
* 확장자 부분의 문자를 모두 upper case로 바꾼 뒤 검사한다.
#### 아파치 서버 설정 변경
* http.conf에서 해당 디렉토리
<Directory "/usr/local/apache">
AllowOverride FileInfo
....
</Directory>
* 파일 업로드 디렉토리에 .htaccess 파일 생성한 후 Server Side 에서 Script가 실행되지 않도록 설정
<.htaccess>
<FileMatch "\.(ph|inc|lib)">
order allow,deny
deny from all
</FileMatch>
AddType text/html .html .htm .php .php3 .php4 .phtml .phps .in .cgi .pl .shtml .jsp
#### IIS 설정
* 시작 -> 제어판 -. 관리도구 -> 인터넷 서비스 관리자
* 해당 업로드 폴더를 선택하여 실행 권한을 "없음"으로 설정한다.
## 실습