파일 업로드 취약점이란?
•
공격자가 실행 가능한 언어로 작성된 공격 프로그램을 업로드한 후 원격으로 해당 파일에 접근하여 실행 시키는 취약점
취약성 및 위험성
•
앱의 개발, 운영환경과 동일한 언어로 작성된 악성파일을 웹 서버 측에 업로드
•
원격으로 해당 파일에 접근하여 실행시키는 취약점
•
Webshell등의 파일을 이용한 시스템 장악 목적
원인 분석
악성 코드 업로드 허용
파일 업로드 어플리케이션의 문제
웬 서버로 위험한 파일 업로드
업로드 된 파일 실행
업로드 파일 관리 및 설정상의 문제
악의적인 페이지 실행
우회기법
•
대소문자 우회 공격
◦
확장자를 비교할 경우 대소문자를 무시한 문자열 비교를 해야 함
◦
대소문자 혼합도 시스템에서는 인식하기 때문에 모든 가능한 문자 조합에 대해 필터링 해야함
ex) .aSp, Jsp, phP, eXe 등
•
확장자 연장 우회 공격
◦
확장자 필터링을 조건문자 ’.’ 를 기준으로 앞쪽부터 유효한 파일인지 필터링 하게 되면 공격받을 수 있음
◦
확장자 필터링을 조건문자 기준으로 맨 마지막부터 해야함
•
특수문자 우회 공격
◦
종단문자를 이용한 우회 공격
▪
%00, %ZZ, %09, %13
▪
예시)
•
attack.asp → attack.asp%00.txt
필터링을 가장 마지막 (.) 기준으로 했을때 확장자가 txt 이므로 필터링 우회
시스템 실행 시 종단문자 기준으로 확장자 인식 (확장자 → asp)
◦
세미콜론을 이용한 우회공격
▪
세미콜론을 포함한 웹 페이지 요청 시 파싱 대상이 세미콜론 앞쪽만 인식해 발생하는 취약점
◦
PUT 메서드를 이용한 공격
▪
PUT 메서드를 이용해 서버에 파일을 직접 올릴 수 있음
업로드를 성공했다면, 어떻게 실행시켜야할까?
1) 업로드한 악성파일이 (웹 서버에서) 어떤 위치에 저장되어있는지 경로를 확인
⇒ Burp suite로 다운로드를 이용해서 해당 다운로드 로직을 분석
⇒ /demoshop/shop_board/shop_download.asp?strFileName=webshell.jpeg.asp&f_path=upload_file
•
strFileName = 파일명
•
f_path = 업로드 된 파일의 경로
2) 실제 경로를 유추
유추 불가
⇒ /demoshop/shop_board/~ ~ ~/upload_file/webshell.jpeg.asp
⇒ /demoshop/shop_board/upload_file/~ ~ ~/webshell.jpeg.asp
유추 가능
⇒ /demoshop/shop_board/upload_file/webshell.jpeg.asp
⇒ /demoshop/upload_file/webshell.jpeg.asp
⇒ /upload_file/webshell.jpeg.asp
유추 성공하여 해당 파일에 접근 성공
파일이 업로드 되는 위치를 알 수 없는 경우 or
파일의 이름을 임의로 변경하여 저장하는 경우
⇒ 보안 위협으로 보기 어렵다
test.txt ⇒ abc1231235.txt 이런 식으로 파일의 이름을 바꾸는 경우
1.
파일을 다시 다운로드 했을 때 임의로 변경한 파일 이름으로 다운로드 된다
2.
파일을 다시 다운로드 했을 때 원래 파일 명으로 다시 복원되어 다운로드 됨
⇒ 분명히 원본 파일 이름과 임의로 바꾼 파일의 이름을 맵핑해서 어딘가에 저장했을 것이다
⇒ 높은 확률로 DB 에 저장했을 것이다
⇒ SQLi 취약점을 확인하여 원본-변경 파일 확인 후 실행 시도
대응방안
•
파일 업로드 필드를 대상으로 특수문자 필터링 규칙 적용
◦
화이트리스트, 블랙리스트 활용
•
업로드 파일을 위한 디렉토리에는 실행설정을 제거(웹서버)
◦
업로드 파일을 위한 전용 디렉토리를 별도로 설정
◦
httpd.conf와 같은 웹서버 데몬 설정파일에서 리행설정을 제거하여 Server Side Script가 업로드가 되더라도 웹 애플리케이션에서 실행되지 않게 환경설정
•
첨부파일의 확장자 필터링 처리 (Server side script로 구현해야한다)