Web Directory
웹 디렉터리는 웹 사이트의 온라인 카테고리입니다 웹 검색 엔진과 다른 역할을 가지는데 웹 검색 엔진은 사용자가 특정 키워드로 정보를 검색할 때 관련된 웹 페이지를 찾는 반면 웹 디렉터리는 특정한 주제나 카테고리에 관련된 웹 사이트를 정리하여 보여주는 역할을 합니다
File Upload Vulnerability
파일 업로드 취약점은 게시판 등에서 파일의 업로드에 대한 규제가 없을 경우 해커가 악성 스크립트 파일(asp, jsp, php 등)을 업로드하고 파일을 실행시켜 시스템 권한을 획득하거나 사용자의 정보를 탈취할 수 있습니다
파일 업로드 취약점의 동작 원리를 이해하기 앞서 일반적으로 웹 애플리케이션에서 파일 업로드가 어떻게 처리되는지 알아야 합니다 보통 사용자가 파일을 업로드하면 서버의 웹 루트 디렉터리 내 하위 디렉터리로 파일이 저장됩니다
PHP : Personal Hypertext Preprocessor를 의미하고 서버 쪽에서 실행되는 프로그래밍 언어이다
웹 루트 디렉터리 : 애플리케이션에 최상위 디렉터리를 의미함
사용자가 URL을 통해 웹 루트(www.example.com)의 접속을 하면 이 웹 루트 디렉터리 내 하위 디렉터리에 있는 index.php 덕분에 페이지에 방문할 수 있습니다
결국 사용자가 파일을 업로드하면 /var/www/html/uploaded 위치에 파일이 저장되고 URL이 www.example.com/uploaded/image.jpg 형태로 적용되어 업로드된 파일에 접근할 수 있습니다
사용자가 프로필 사진을 업로드한다 가정해 보면 웹 루트 디렉터리 내 하위 디렉터리에 profile 위치에 프로필 사진이 저장됩니다 즉 위 사진과 같이 업로드된 파일은 URL을 통해 접근할 수 있습니다 이 점을 이용하여 공격자는 파일 업로드 취약점을 악용할 수 있습니다
(파일 위치는 해당 웹 페이지 소스 코드를 살펴보면 img 태그의 속성값으로 알아낼 수 있습니다)
공격자가 프로필 사진이 아닌 php 형식에 WebShell 파일을 업로드하고 업로드된 shell.php 위치에 방문하면 서버 내에서 악성 스크립트가 작동되어 시스템을 장악하거나 피해자의 정보를 탈취할 수 있습니다
지난 시간에 배운 파일 다운로드 취약점을 연계해 디렉터리 파일 구조를 분석할 수 있습니다
업로드한 파일의 경로가 웹 디렉터리 내.외부에 있는 경우 파일 다운로드 링크 또는 이미지 링크 속성을 통해 경로를 확인하고 프록시 툴을 이용해서 분석할 수 있습니다
즉 파일 다운로드가 가능하다 > 업로드 기능 있을 가능성이 높다
WebShell이란?
앞서 공격자가 파일 업로드 취약점을 이용하여 php 형식에 WebShell을 업로드하였는데 이 WebShell은 웹 애플리케이션의 악성코드로 서버 측에서 작동되는 서버 사이드 언어의 소스 코드 형태로 작성되어 있습니다
<?php eval($_GET['cmd'])?>
위 소스 코드처럼 간단한 php 형식에 WebShell로 웹 페이지를 통해 시스템 명령을 내려 서버를 장악할 수 있습니다
이처럼 WebShell은 서버 내 시스템 권한을 획득하거나 백도어 프로그램 설치 등 다양한 공격이 가능합니다
WebShell 실행을 위한 전제 조건
이 WebShell 공격이 작동하기 위해서는 전제 조건이 필요합니다
- 웹 서버의 파일 시스템이 웹 디렉터리 내에 WebShell이 존재해야 함
- 웹 서버의 사용 언어와 동일한 언어로 제작해야 함
- 웹 서버의 적용된 보안 및 처리를 우회해야 함
WebShell은 웹 서버에서 작동되므로 서버 사이드 언어의 형태로 WebShell을 제작해야 합니다
또한 업로드에 성공하더라도 웹 서버의 보안으로 인해 파일이 차단될 수 있기 때문에 보안 처리를 우회해야 합니다
블랙 리스트 방식과 화이트 리스트 방식
1. 블랙 리스트 방식 (BlackList)
블랙 리스트 방식은 사용자의 위험한 활동을 차단하기 위해 블랙 리스트에 등록된 항목들을 차단하는 방식입니다
예를 들어 파일 업로드가 불가능한 (asp, php, jsp) 등의 확장자를 확정하지 않을 때 해당 확장자 이외에 다른 확장자 파일은 업로드할 수 있기 때문에 우회가 쉽고, 보안성이 화이트 리스트 방식에 비해 떨어집니다
2. 화이트 리스트 방식 (WhiteList)
화이트 리스트 방식은 특정한 항목만 명시적으로 허용하는 방식입니다
예를 들어 파일 업로드 부분에서 특정한 파일 확장자 (asp, php, jsp) 등을 확정하면 이 확장자 이외에 다른 확장자 파일은 업로드할 수 없기 때문에 우회가 어렵고, 보안성이 블랙 리스트 방식에 비해 강합니다
파일 업로드 필터링 우회 방법
파일 업로드 취약점 발견 시 파일을 업로드할 때 파일 확장자를 필터링하는 경우가 많은데 블랙 리스트 방식일 경우 이를 우회할 수 있습니다
언어 | 우회패턴 | 처리패턴 |
php | test.php%00.png | test.php |
asp | test.asp%00.png | test.asp |
jsp | test.jsp%00.png | test.jsp |
널(%00) 문자가 문자의 끝을 의미하기 때문에 특정 확장자를 숨기는 용도로 사용될 수 있습니다
즉 널문자와 .png 확장자를 함께 결합하여 업로드하면 널문자 다음 .png 확장자가 무시됩니다
두 번째로 대소문자를 치환하는 방식이 있습니다 .asp > .Asp / .aSp / .asP / .AsP 등
언어 | 확장자 |
asp, aspx | asp, aspx, asa, htm, html |
php | phtml, php, php3, php4, php5, inc, html |
jsp, java | jsp, jspx, jsw, jsv, jspf, htm ,html |
perl | pl, pm, cgi, lib, htm, html |
coldfusion | cfm, cfml, cfc, dbm, htm, html |
세 번째로 실행 가능한 타 확장자를 사용할 수 있습니다 EX) .asp > .aspx / .asa 사용 가능
다양한 파일 업로드 공격 방법
우선 파일 업로드 공격은 확장자 제한이 없는지 확인하고 업로드된 파일이 실행 가능한지 파악해야 합니다 만약 공격이 가능하다면 아래와 같은 공격 방법을 사용할 수 있습니다
- 위에서 다룬 널(%00) 문자를 사용해 WebShell을 실행시켜 서버를 장악할 수 있습니다
- 서버에 랜섬웨어 파일을 업로드하여 서버 관리자가 이를 실행시키도록 유도하여 서버 파일을 암호화 시킬 수 있습니다
- 웹 서버에 index 메인 페이지를 해커가 만든 악성 index 메인 페이지로 변조시킬 수 있습니다 이를 Deface 공격이라고 합니다
파일 업로드 공격 대응 방안
파일 업로드 공격에 대한 대응 방안으로는 아래와 같이 기초적인 방어를 할 수 있습니다
- 서버에서 실행 가능한 타 확장자나 웹 서버의 사용 언어와 동일한 언어로 제작된 파일 업로드를 제한한다
- 특수문자가 포함된 파일의 업로드를 제한한다
- 업로드된 파일의 확장자를 인코딩한다
- 업로드된 파일의 URL를 직접적으로 접근할 수 없게 다른 위치로 저장하고 이를 노출하지 않는다
- 웹 서버와 업로드 서버를 분리시켜 운영한다
[ 참고 자료 ]