Pentest Playbook

파일 업로드

파일 업로드 취약점에서 기본으로 활용되는 방법과 클라이언트 측 검증을 우회하는 방법에 대해서 설명하고자 한다.

백엔드: PHP

1. 파일 업로드 취약점

해당 취약점은 서버에 파일을 업로드할 때 확장자 검증 미흡으로 인해, 서버의 환경에 맞는 확장자 파일이 업로드되면서 임의 코드를 삽입해서 원격에서 실행시킬 수 있는 취약점을 의미한다.

취약점을 이용해 시스템 내부에 접근할 수 있기 때문에, 영향력/파급력이 상당히 높은 취약점에 해당된다.

가볍에 시도해 볼 수 있는 확장자는 PHP, JSP, ASP가 있으며 예시를 기반으로 설명하고자 한다.

  1. JavaScript 코드 및 함수에 명시된 확장자 우회
  2. 확장자 검증 기능 일시적 비활성화 및 삭제(새로고침 및 재접근 전까지 유지)

2. 취약점 예시

웹 서비스에서 사용자 프로필을 업로드하는 기능이 있다. 이때 파일 확장자를 검증하지 않아서 웹쉘 파일 업로드를 이용한 원격 코드 실행 취약점이 발생한다.

2.1. 서비스 기능 탐색

웹 서비스에서 이미지 등 프로필을 업로드할 수 있는 기능을 우선적으로 탐색한다. 다음 기능을 확인해보면 이미지를 업로드해서 사용자의 프로필이 변경되는 것을 알 수 있다. 01

이미지를 업로드하면 업로드 경로를 확인할 수 있고 이미지에 직접 접근할 수 있다. 02

2.2. 서버 확장자로 WebShell 업로드

프로필 이미지를 업로드할 때, .png 파일이 아닌 .php 확장자로 업로드를 시도한다. - 이때, 클라이언트 또는 서버에서 확장자 검증을 수행한다면 우회를 시도해야 한다. 03

기본적으로 사용되는 PHP WebShell 코드는 다음과 같이 구성할 수 있다.

<?php system($_GET['cmd']); ?>

2.3. WebShell로 임의 명령어 실행

업로드한 웹쉘 파일을 이용해서 cmd 파라미터로 임의 명령어를 실행할 수 있다.

04


ESC

💡 검색 팁

  • #T1572 - 태그로 검색
  • persistence - 키워드로 검색