🗃️File Upload

DATE : 2024/2/8

What is File Upload Attack?

파일 업로드 공격이란, 공격자가 원하는 임의의 파일을 업로드 하는 공격을 말한다.

파일을 업로드 하는 과정에서 제대로 검사하지 않는 경우,

의도했던 형식의 파일이 아닌 서버 측에서 실행 가능한 파일을 업로드 할 수 있게 되는데

이는 공격자가 원하는 코드를 서버에서 실행시킬 수 있다는 의미이기도 하다.

파일 업로드를 통해 이루어질 수 있는 공격 형태를 나열해보면 다음과 같다.

(1) 서버 측 script 실행

(2) DoS 공격

(3) Defacement 공격

(4) HTML file -> Phishing

(5) Stored XSS

...

이보다 더 다양한 형태로 공격이 이루어질 수 있겠지만,

파일 업로드 공격이 어떤 영향력이 있는지 보이기엔 충분할 듯하다.

이 중에서도 (1)에 초점을 두고 보충 설명을 해보면,

"파일을 서버에 업로드한다"는 건 파일이 고유 경로를 가진 채로 서버 어딘가에 위치하게 된다는 뜻이다.

그.런.데

만약 서버에 올린 파일이 서버 측에서 실행할 수 있는 PHP, ASP, JSP 와 같은 코드라면??

PHP, ASP 등으로 작성된 코드를 보는 순간, 서버는 "이건 내가 처리해야겠군!" 하고

열심히 해당 코드를 실행해 그 결과를 페이지에 쏙 넣어준다.

즉, 우리가 업로드한 코드가 "서버"에서 실행된다는 얘기다.

따라서 우리가 아주 나쁜 서버 측 코드를 짜서 서버에 업로드할 수 있다면

내가 원하는 코드(=명령)를 서버가 실행하도록 만들 수 있다는 의미가 된다.

대표적인 예로 Web Shell에 대해 생각해보자!

Web Shell이란, Internet 상에서 서버에게 명령을 내릴 수 있도록 하는 Shell로

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

위와 같은 코드를 떠올릴 수 있을 것이다.

system() 함수는 명령어를 실행해주는 함수로 이 코드는

cmd parameter에 담긴 명령어를 서버에서 실행시키는 코드이다.

이와 같은 파일을 서버에 업로드 하고 나서, cmd parameter로 실행하고자 하는 명령어를 내리게 되면

우리는 웹 상에서 서버에 명령을 내릴 수 있게 되는 것이다.

즉, 내가 원하는 대로 서버를 조종할 수 있다는 것!!

WHERE

파일 업로드 취약점은 당연하겠지만, 파일을 업로드할 수 있는 곳에서 발견될 수 있다.

예를 들어, 프로필 사진을 바꾸거나 어떤 신청서를 제출하거나 등등

말 그대로 파일을 업로드하는 곳이 잠재적인 공격 포인트라 할 수 있다.

파일 업로드 공격에서 Web Shell을 주로 얘기해보자면 우리가 중요하게 고려할 부분,

첫 번째는 "파일을 업로드"하는 것이다.

방금 말했듯이 파일을 올릴 수 있는 곳이 잠재적인 공격 포인트인 건 맞지만

그렇다고 해서 공격자가 원하는 서버 측 코드를 어디든지 업로드할 수 있다는 건 아니다.

서버마다 실행시킬 수 있는 언어가 다르기 때문에

만약 PHP Engine이 없는 서버에 PHP 파일을 올려놓고 왜 실행이 안 되지? 이러고 있는 건... 바보다!

두 번째로 중요한 포인트는 바로 "파일을 실행"하는 것이다.

서버 측 코드를 올리고자 하는 건, 궁극적으로 우리가 원하는 명령을 서버가 수행하도록 하기 위함이다.

서버에 있는 파일을 실행시키기 위해서는 해당 파일을 요청해야 하기 때문에 파일의 경로

알아야 할 필요가 있다.

파일 경로를 알아내기 위해선 업로드한 파일이 출력 되는 위치를 먼저 파악하는 편이 좋다!

모든 경우 그런 건 아니지만, 파일이 출력 되는 위치를 기준으로

hanhxx.com/mypage.php => 프로필사진이 출력된다!
hanhxx.com/files/profile_img.png => hanhxx.com/ 경로로 파일 위치가 시작!

실제 파일이 위치한 경로가 시작되는 경우가 많기 때문에

일단은 업로드한 파일이 어디에서 나오는 지를 체크해보자!

File Upload - Web Shell

(1) 웹 서버 측 코드를 업로드할 수 있어야 한다!

(2) 업로드 한 파일의 경로를 알아야 한다! ➡️ 파일을 요청할 수 있다. ➡️ 파일이 서버에서 실행된다!

Last updated