File Upload
파일 업로드 취약점은 악성 코드가 담긴 파일을 서버의 웹 디렉토리 상에 업로드 함으로써
악성 파일을 통한 내부 정찰, 정보 수집, 리버스 쉘 연결 등의 행위를 가능케 하는 공격입니다.
전제 조건
파일 업로드 공격 프로세스에 대해서 다루기 이전에
파일 업로드 공격이 성공하기 위해서 반드시 충족되어야 하는 조건에 대해 알아보겠습니다.
즉 공격자는 웹쉘이나 리버스 쉘을 업로드 하는데 성공할 수는 있어도
아래 4가지 조건을 모두 충족하는 환경이 아니라면 그 파일을 악용할 수 없습니다.
공격자는 본인이 업로드한 파일이 어떤 이름으로 업로드 되었는지 알 수 있어야 한다.
공격자는 파일이 업로드 된 경로를 알아야 한다.
악성 파일이 업로드 된 경로가 웹 디렉토리 하위에 위치해야 한다.
악성 파일의 스크립트 실행 권한이 존재해야 한다.
가장 중요하다고 생각될 수 있는 서버 사이드 언어와 호환되는 확장자 (php, jsp 등)이
필수 조건에 포함되지 않는 이유는, LFI 취약점이 웹 서비스에 동시에 존재할 경우
png, jpg와 같은 사진 파일 확장자로도 소스코드 실행이 가능하기 때문입니다.
파일 이름 & 파일 경로
오늘날 대부분의 웹 서버들은 이용자들이 업로드한 파일의 이름을 그대로 업로드 하지 않습니다.
보편적인 방법으로는 파일 업로드 시각을 ms 단위로 변환하여 업로드 하거나
특정한 이름을 추가하는 등의 방식을 취합니다.
따라서 공격자는 웹쉘이나 리버스 쉘을 업로드 하는데 성공하더라도
실행하기 위해 그 경로와 파일 이름을 알지 못하면 악용할 수가 없습니다.
웹 디렉토리
업로드 경로가 웹 디렉토리가 아닌 경우, URL을 통해서 접근 가능한 최대 상위 경로는
웹 디렉토리 최상위 경로일 뿐이지, 다른 경로로 벗어나는 것은 기술적으로 어렵습니다.
예를 들어서 C 드라이브 하위에 있는 웹 디렉토리가 아닌 다른 디스크 하위에 업로드 파일을
저장하여 관리한다면 실행을 위해 접근하는 것이 불가능합니다.
스크립트 실행 권한
기본적으로 웹 서비스 내에서 LFI 취약점이 발견되지 않는다는 가정 하에
파일 업로드 공격을 성공하기 위해서는 스크립트 실행 권한이 있어야 합니다.
스크립트 실행 권한이 없다면 웹쉘에 접근하더라도 웹쉘 제작에 사용된
소스코드만 노출될 뿐 웹쉘 자체를 동적으로 사용하지 못합니다.
이렇게 소스 코드가 동작하지 않는 이유는 htaccess 파일의 설정에서
핸들러 속성이 text/html로만 설정되어 있기 때문입니다.
예외 사항
스크립트 실행 조건을 제외한 3가지 조건이 만족되는 환경에서도
웹쉘 혹은 리버스쉘을 실행시키는 방법이 존재합니다.
웹 서비스에 LFI 취약점이 동시에 존재한다면 스크립트 실행 권한이 없거나
혹은 확장 파일이 jpg와 같은 실행 권한이 없는 확장자일지라도 웹쉘의 실행이 가능합니다.
대응 방안
업로드 파일 이름 난독화
추측하기 어려운 디렉토리 이름 사용
웹 디렉토리가 아닌 경로로 업로드 디렉토리 지정
htaccess 등의 파일을 통한 스크립트 실행 권한 제거
이 외에도 근본적으로 파일 업로드 공격을 방어하기 위해서
파일 업로드를 처리하는 소스코드 내에서 화이트 리스트 방식을 통해 확장자 검증을 할 수 있습니다.
일부에서는 파일의 크기를 검사하는 방법을 대응 방안으로 제안하지만,
1줄짜리 코드로도 웹쉘을 실행할 수 있는 One-Line 웹쉘도 존재하므로 적절한 조치는 아닙니다.
Last updated
Was this helpful?