image-storage

DH Park·2024년 6월 28일

서론

파일 업로드 취약점은 웹 서비스를 통해 이용자의 파일을 서버의 파일 시스템에 업로드 하는 과정에서 발생할하는 보안 취약점으로, 이용자가 업로드 될 파일의 이름을 임의로 정할 수 있을 때 발생한다.

파일 이름에 이용자가 입력한 문자열을 그대로 사용하거나, 이용자의 이메일, 닉네임 등을 포함시키는 소스 코드 패턴이 이러한 취약점을 발생시킬 수 있다.

이러한 공격으로부터 서비스를 보호하려면 파일 업로드와 관련된 코드에 여러가지 검사 로직을 추가해야 하는데, 대표적인 방법 중 하나가 파일 확장자 제한이다.

웹 리소스는 크게 정적 리소스(Static Resource), 동적 리소스(Dynamic Resource)로 분류할 수 있다.

정적 리소스는 이미지(JPG,PNG,GIF)나 비디오(MP4, MOV)와 같이 서버에서 실행되지 않는 리소스, 동적 리소스는 PHP, JSP처럼 서버에서 실행되는 것들을 가리킨다.

동적 리소스의 확장자 제한 시 파일 업로드 취약점을 통한 RCE공격으로부터 서버를 보호할 수 있다.

또 다른 방법은 AWS, Azure, GCP 등의 정적 스토리지를 이용하는 것이다. 서버의 파일 시스템을 이용하지 않으므로 파일 업로드 취약점이 웹 서버 공격으로 이어지는 것을 예방할 수 있다.

문제 설명

index.php

index.php는 list.php와 upload.php로 이동하는 메뉴를 출력한다.

list.php

list.php는 $directory의 파일들 중 .. , . , index.html을 제외하고 모두 나열한다.

upload.php

upload.php는 이용자가 업로드한 파일을 uploads 폴더에 복사하며, 이용자는 http://host1.dreamhack.games:[PORT]/uploads/[FILENAME] URL을 통해 접근할 수 있다.

같은 이름의 파일이 있다면 "already exists" 라는 메시지를 반환한다.

업로드할 파일에 대해 어떠한 검사도 하지 않으므로 웹 셸 업로드 공격에 취약하다.

웹 셸을 표현하는 php 코드이다.

(웹 셸: 임의 시스템 명령어를 실행해주는 웹 리소스)

웹 셸을 업로드하고 방문한다.

그러면 서버의 셸을 획득할 수 있다.

flag는 flag.txt에 있으므로 파일 내용을 알 수 있는 리눅스 명령어인 cat을 통해 알아낼 수 있다.

flag가 잘 나오는 것을 볼 수 있다.

profile
Web Deveolper / Offensive Security Consultant (Prev)

0개의 댓글