안녕하세요 Retain0입니다. 이번 시간에는 " DVWA "라는 취약한 웹 애플리케이션을 통한 File Upload 공격을 해보도록 하겠습니다.
File Upload Vulnerability 이란
- 파일 업로드 기능이 존재하는 페이지 즉 " 게시판의 첨부파일, 프로필 사진 등 과 같이 이미지 파일인지 아닌지를 제대로 검증하지 않는 것을 말합니다. 악성 스크립트 파일(웹쉘) 이 대상 서버에 업로드가 성공할 경우 해당 시스템을 제어할 수 있는 명령어를 실행하거나 다양한 디렉토리들을 열거할 수 있고 변조하여 웹페이지 자체를 변조시키는 Deface 또한 가능합니다.
① LOW
(사진 1) 을 보시면 파일을 업로드할 수 있는 버튼이 보입니다. 사전에 준비해둔 webshell 파일을 이용하여 업로드를 해보도록 하겠습니다.
※ webshell 파일은 구글링을 통해 쉽게 얻을 수 있으며 weevely 도구를 통해서 제작도 가능
사전에 준비해둔 webshell 을 업로드해본 결과../../hackable/uploads/라는 위치에 mr_clay(webshell). php 파일이 성공적으로 저장된 것을 확인할 수가 있습니다.
저장된 경로를 활용하여 URL 에 입력해본 결과 webshell 이 실행된 것을 확인할 수가 있습니다. 대상 시스템에 있는 다양한 디렉토리의 경로 및 권한을 확인하고 수정 또한 가능하기 때문에 다양한 악의적인 행위를 할 수가 있습니다.
(사진 4) 처럼 단순한 방식의 웹쉘도 있습니다. 업로드가 성공할 경우 사진처럼 작은 입력 폼이 생기며 여기에 원하는 시스템 명령어를 입려 하여 정보를 획득할 수가 있습니다.
※ 커맨드식 웹쉘은 사용자의 입력값을 받기위해 폼을 표시하는 html을 표시해야 합니다. 또한 그 밑에는 cmd라는 값이 파라미터에 설정되어있으면 이것을 system이라는 함수로 출력하게 됩니다.
② Medium
(사진 5) 전단계처럼 똑같이 webshell 파일을 업로드해본 결과 " Your image was not Uploaded. We can only JPEG or PNG images. "라는 문구와 함께 실패하는 것을 확인해볼 수가 있습니다.
(사진 6) 을 보시면 uploaded_type에 jpeg 또는 png 확장자를 가진 파일만 허용하고 있습니다. 그럼 웹프록시 도구인 burp suite를 통해 조작을 해보도록 하겠습니다.
웹쉘 업로드시 burp suite 도구로 잡아본 결과 검정 박스에 Content_Type: application/x-php 가 보입니다. 우리는 방금 전에. php 확장자를 가진 웹쉘을 업로드 시도하였기 때문에 php라고 나온 것입니다. 그럼 이것을 php 가 아닌 image 나 png로 변경해서 보내보도록 하겠습니다.
Content-Type 부분에 image/jpeg 를 입력하고 요청(Request) 즉 Forward 해보도록 하겠습니다. 아니면 burp suite의 " reapter "기능을 사용하여 요청한 결과를 쉽게 확인할 수가 있습니다.
(사진 9,10) Contetn-Type 을 허용하는 확장자로 변경하고 요쳥해본결과 검증 코드를 우회하고 성공적으로 업로드된 것을 확인할 수가 있습니다. 웹쉘 실행방법은 LOW 방법과 동일하여 이번에는 ifconfig 명령을 통해 네트워크 인터페이스 정보를 출력하도록 하였습니다.
③ High
(사진 11) High 레벨의 소스코드를 확인해본결과 업로드되는 파일의 확장자가 jpg, jpeg, pnp 인지 검사를 하고 " getimagesize "를 통해 실제 이미지 인지 아닌지도 검증을 하고 있는 것을 볼 수 있습니다.
(사진 12) webshell 업로드 시 프록시도구로 잡은 모습입니다. 이번에는 Medium 레벨과 다르게 업로드되는 파일이 이미지 파일이라고 제대로 속여야 업로드를 할 수가 있습니다.
(1) 업로드 되는 파일 이름이. jpg,. jpeg,. png 중 하나로 속임
(2) <? php 파일 도입 부분에 --> 이미지(jpg, jpeg, png) 파일이라고 재선 언
(사진 13)을 보시면 업로드되는 filename 끝에 허용하는 확장자를 추가해 2중 파라미터 기법을 사용하고 getimagesize를 우회하기 위해 하단에 </php라는 우리가 업로드한 웹쉘 도입 부분에 " GIF89 a 입력해주면 됩니다.
※ 2중 파라미터 외에 " 대소문자 치환 " / " Null Byte " / " 실행 가능한 타 확장자 "를 사용하여 우회 가능
(1)대소문자 치환 : jsp →. Jsp /. jSp /. jsP /. JsP 등
(2)Null Byte : webshell.php%00.jpg 또는 %zz.jpg라고 입력하면 php 뒤쪽 문자는 null로 처리하여 무시
(3)확장자 대체 :
ASP-> cer, cdx, asa
JSP-> war, jspx jsv jsw
PHP-> php3,htm,html
※ GIF89a 란 GIF 이미지 파일에 표준화된 값으로 이것을 파일내용 제일 앞에 입력하면 마치 이것이 이미지 파일인 것처럼 속일 수가 있음
(사진 14) 우회하여 업로드를 성공하였습니다. 하지만 우리는 burp suite에서 마지막 확장자를 jpg 이름으로 바꾸어서 저장했기 때문에 webshell 이 실행되지 않습니다. 전 시간에 배웠던 " File Inclusion " 취약점이 존재할 경우 jpg 확장자 일지라도 File Include를 하면 실행할 수가 있습니다.
File Inclusion의 HIGH 레벨에서 웹쉘이 저장된 경로 & cmd 호출 명령어를 입력해본 결과 성공적으로 커맨드형 웹쉘이 실행된 것을 확인할 수가 있습니다.
(사진 16) mr_clay 웹쉘도 성공적으로 실행 가능합니다. webshell을 사용하기 싫다면 간단한. txt 파일로 만든 후 확장자만. php로 변경해서 테스트해보셔도 상관없습니다. 다만 실행차단 정책을 적용했는지는 소스를 보고 확인해야 하죠.
◆ 대응방안
소스코드를 확인해본 결과 두 번의 검증을 거치는 것을 확인할 수가 있습니다. 상단의 첫 번째 검정 박스에서 업로드되는 파일의 확장자가 jpg / jpeg / png 인지 검사를 하며 두 번째 검정 박스에서 최종 업로드된 파일이 image/jpeg 가 맞는지 한 번 더 확인함으로써 File Upload 취약점을 막을 수가 있습니다.
이 외에도
(1) 해당 서버에 파일이 업로드될 시 파일 이름을 랜덤 하게 생성해서 공격자가 자기가 업로드시킨 webshell에 접근하지 못하도록 할 수도 있습니다.
(2) 업로드된 파일의 실행 권한을 제거하거나 저장되는 웹서버의 위치를 별도의 물리적 위치에 분리하여 저장하여 경로를 알 수 없도록 하는 것도 하나의 방법이라고 볼 수 있습니다.
(3) 업로드되는 확장자명을 검증할 때는 블랙리스트 방식이 아닌 " 화이트리스트 " 방식으로 해야 합니다.
'IT Security > DVWA(Damn Vulnerable Web App)' 카테고리의 다른 글
[DVWA] SQL injection (0) | 2020.05.10 |
---|---|
[DVWA] insecure CAPTCHA (0) | 2020.04.23 |
[DVWA] File inclusion (0) | 2020.04.20 |
[DVWA] CSRF(Cross Site Request Forgery) (0) | 2020.04.19 |
[DVWA] Command Injection (0) | 2020.04.18 |