728x90

정의

파일 업로드 기능이 있는 웹 페이지(게시판, SNS 등)에 악성 파일(웹쉘) 업로드하여 웹쉘을 이용해 시스템 명령을 실행하는 공격

실습

Low 단계

https://raw.githubusercontent.com/SecuAcademy/webhacking/master/webshell.php

위의 링크를 wget 명령어를 이용해 webshell 파일을 다운로드 받는다.

File Upload 페이지에서 해당 파일을 업로드하면 업로드된 경로가 다음과 같이 나온다.

해당 경로로 접근하면 웹쉘이 등장한다. cat /etc/passwd을 입력하면 명령이 실행된다.

Medium 단계

소스코드를 보면 업로드 타입이 image/jpeg 또는 image/png인지 체크하고 있다.

Low 단계처럼 webshell.php를 업로드하는데 버프 스위트로 인터셉트한다.

블럭 처리한 부분을 image/jpeg로 바꾸어 forward 버튼을 누른다.

업로드를 성공하였다.

High 단계

uploaded_ext는 업로드되는 파일명이다. 파일명의 확장자가 jpg, jpeg 또는 png 이어야 하며 파일 크기는 100000 바이트 미만 이어야 하고 getimagesize 함수를 통해 실제 파일이 이미지인지 확인하고 있다.

파일명의 확장자 끝에 .jpg를 붙이고 파일 내용 앞에 GIF89a를 입력하면 파일이 이미지인 것처럼 속일 수 있다.

하지만 웹쉘을 실행할 수는 없다.

File Inclusion 공격을 이용하자. 파일 내용은 웹쉘 코드이기 때문에 웹 페이지에 띄울 수 있다.

File Inclusion 페이지에 접속하자. High 단계이기 때문에 file/../../ 방식을 이용하여 우회한다. file inclusion 글을 참고하자.

여기서 cat /etc/passwd를 입력하면 아래와 같이 에러가 뜬다.

High 단계의 File Inclusion에선 page 파라미터에 접근할 페이지를 전달해야 하는데 이를 설정하지 않았기 때문이다.

Medium 단계에서 웹쉘을 호출하는 URL을 그대로 입력하고 cmd 파라미터를 추가로 입력한다. cmd 파라미터는 웹쉘에서 요구하는 입력값이다.

Low 단계에서 첨부한 webshell.php 코드를 보면 알 수 있듯이 form 태그의 method 부분이 생략되어 있다. 생략하면 GET 방식으로 데이터를 전송한다. 따라서 웹쉘에서 입력창에 입력하는 것은 GET 방식으로 전달되기에 URL을 통해 전달하는 것과 동일하다.

공격이 성공했다.

대응 방안

Impossible 단계의 소스코드를 보면 처음 if문에서 이미지 파일인지 체크한 이후에 두 번째 if문에서 업로드된 내용으로 이미지 파일을 다시 생성하고 있다.

이외에도 다른 방법으로 업로드된 파일 이름을 랜덤으로 변경하여 해커가 업로드한 파일에 접근하지 못하게 하는 방법이 있다.

또한 파일이 업로드되는 서버를 웹 어플리케이션 서버와 분리하는 방법도 있다. 이 방법이 여의치 않은 경우엔 업로드 파일이 저장되는 업로드 디렉터리에 실행권한을 제거하고 File Inclusion 공격에도 완전히 대응하여 업로드된 파일이 웹 어플리케이션에서 실행되는 것을 차단할 수 있다.

728x90

'dvwa' 카테고리의 다른 글

Blind SQL Injection  (0) 2023.05.17
SQL Injection  (0) 2023.05.16
File Inclusion  (0) 2023.05.06
CSRF  (0) 2023.05.05
Command Injection  (0) 2023.05.02

+ Recent posts