- 파일 업로드 공격은 웹 상에서 이미지, 동영상, 음악파일 등 여러 파일을 업로드하는데 있어 발생하는 취약점을 공격한다.
- 이번에는 웹 쉘의 기능을 하는 PHP파일을 생성하고 해당 파일을 업로드하여 웹 상에서 쉘 명령어를 실행하도록 한다.
- 업로드 시킬 웹 쉘 기능을 포함하는 PHP파일 작성
- HTTP form에서 입력된 값을 GET방식으로 전달받는다.
- isset을 통해 값이 세팅된 경우 system함수를 이용하여 쉘 명령어를 수행한다.
- 생성한 php파일을 /root 디렉토리에 위치시킨다.
- 파일 업로드 전
- 파일 업로드
- 하단에 파일이 업로드 된 경로를 확인한다.
- ../../ 두 번의 상위 디렉토리로 이동 후 hackable/uploads/에 업로드 되었다.
- 업로드 된 파일에 접근
- 최초 업로드 된 경로: localhost/dvwa/vulnerabilities/upload/#
- .. 한 번 : localhost/dvwa/vulnerabilities/
- .. 두 번 : localhost/dvwa/
- 따라서 접근 경로는 localhost/dvwa/hackable/uploads/webshell.php가 된다.
- 상위 디렉토리로 이동 후 저장된 경로로 접근하여 작성한 웹셀 php파일을 실행시켰다.
- 웹 쉘에서 명령어 실행
- 파일 업로드 시 아무런 대응책이 없기 때문에 아주 쉽게 업로드 된 파일을 실행시킬 수 있었다.
- 소스코드
- 업로드 되는 파일의 type과 size를 검사하여 업로드 되는 파일이 이미지가 맞는지 확인하고 있다.
- 여기서 type은 HTTP Header의 Content-Type에 해당한다.
- 업로드에 실패한 모습
- 우회방법
- BurpSuit를 이용하여 요청을 인터셉트하여 헤더의 Content-Type을 임의로 변경한다.
- 업로드 요청을 인터셉트한 결과이다.
- Content-Type이 application/x-php이다.
때문에 업로드에 실패한 것이다. 이를 변경해보자.- Content-Type을 변경하였다.
- 실제 파일은 php파일이지만 전송시 Content-Type만을 바꾸는 것이다. image/jpeg 타입으로 변경하였다.
- 변경 후 업로드에 성공한 모습이다.
- 업로드에 성공하였기 때문에 웹 쉘 또한 수행된다.
- Content-Type을 검사하는 것만으로는 부족하다. 요청이 인터셉트 되어 수정이 가능한 경우 얼마든지 헤더를 조작할 수 있다.
- 소스코드
- 이번에는 Content-Type이 아닌 파일의 확장자를 검사한다.
- '.'를 기준으로 파일명을 나누어 확장자명만을 추출하고, jpg, jpeg, png를 확장자로 가지는 파일만 업로드가 가능하도록 하였다.
- 추가로, getimageisze함수를 통해 업로드된 파일이 이미지인지 한 번 더 확인한다.
- Medium단계의 우회방법은 통하지 않는다.
- Content-Type은 검사하지 않기 때문에 굳이 해보지 않아도 안될 것을 알 수 있다.
- 첫 번째 우회방법
- 요청을 인터셉트하여 임의로 확장자를 바꿔보자
- 확장자를 .php.jpg로 변경하였고, getimagesize를 우회하기 위해 내용 앞에 'GIF89a'를 추가하였다.
- 일단 업로드에 성공하였다.
- 업로드에 성공하였지만..
- 현재 업로드된 파일명은 webshell.php.jpg이다.
- 확장자가 jpg이므로 정상적으로 웹 쉘을 실행할 수 없다.
- 두 번째 우회 방법 (File Inclusion + File Upload)
- 업로드된 파일을 파일 인클루전을 통해 파일의 내용을 직접 웹 페이지에 삽입하는 방식이다.
- 현재 DVWA는 High단계로 설정되어 있기 때문에 이전 파일 인클루전의 High단계도 우회해주어야 한다. 이전 File Inclusion 포스트를 참조!
- path traversal을 이용하여 업로드한 디렉토리로 접근하여 파일을 직접 삽입시킨다.
- 예제에서는 폼에서 직접 submit시 오류를 발생시킨다.
url의 Query Parameter로 쉘 명령어를 전달해보자.
- 정상적으로 쉘 명령어가 수행되었다.
- High단계를 우회하기 위해 File Inclusion Attack과 File Upload Attack 두 가지 방법을 혼합하였다.
- 특정 공격 기법만을 방어한다고 해서 해당하는 공격에 대해 완벽히 대응되는 것이 아니라는 것!
- 소스코드
- 1차적으로 업로드된 파일이 이미지인지 타입, 확장자명 등으로 확인한다.
- 이미지 파일로 판별된다면 해당 파일의 내용으로 이미지 파일을 다시 생성(re-encoding)한다.
- 이로써 껍데기만 이미지 파일이였던 파일은 본래 의도된 역할을 하지 못하게 된다.
- 또 다른 대응 방법
- 업로드 되는 파일의 파일명을 저장하는 시점에 랜덤화하여 해커가 업로드 되는 파일에 쉽게 접근하지 못하는 방법