R's Hacking Daily Log

File Upload - Lab (4) 본문

Port Swigger/File Upload

File Upload - Lab (4)

hanhxx 2023. 6. 25. 13:17

Lab - Web shell upload via obfuscated file extension 

이번 Lab에서는 파일 확장자와 관련된 파일 업로드 공격을 살펴볼 것이다.

 

이전에 살펴본 Lab은 

:) 파일 업로드가 제한되는 장소(= directory)를 우회하는 directory traversal 

:) file type 제한을 우회하는 Content-type header 

등을 활용해 공격했다면 이번 Lab에서는 파일 확장자에 대해 다뤄볼 예정!

 

** 파일 확장자란, 

파일명 뒤에 명시되는 값으로 파일이 어떤 종류의 파일인지를 나타내주는 역할을 한다.

흔히 텍스트 파일은 txt, 사진은 png & jpg, 그밖에 html, css, js, php, c, exe 등 ".file_extension"과 같은

형태로 작성된다. 

 

 

이번 Lab의 목표를 먼저 정리해보자면 

1) /home/carlos/secret file 내용을 조회하고자 한다.

2) 파일 업로드 취약점이 존재하는 서버

3) 하지만 blacklist에 해당하는 파일 확장자는 업로드할 수 없다.

 

공격자 입장에서 파일 확장자가 제한되는 기능을 우회해 web shell을 업로드하는 것이 주 목표이다.

 

 

wiener:peter 계정으로 로그인한 후, 이전 Lab에서 사용했던 webshell.php file을 업로드해봤더니 

JPG or PNG file만 업로드할 수 있다고 한다.

 

 

php file을 업로드하기 위해 jpg or png file 확장자로 인식되도록 할 수 있는 방법을 찾아보자!

POST FORM 내용을 보면 content-disposition header에 filename 값이 들어있는 걸 볼 수 있다.

이 값을 변경하면서 response를 확인해보면 

 

 

1) filename = "webshell.php.jpg"

2) filename = "webshell.php;.jpg"

 

 

3) filename = "webshell.php%00.jpg"

3가지 경우 모두 업로드에 성공한 걸 볼 수 있다.

다만 파일을 업로드한 경우, 서버에서 php file을 실행시켜 /home/carlos/secret file 내용을 응답으로 보내주는 데

 

 

 

어떤 경우는 shell 내용이 cleartext 상으로 응답이 오거나 

 

 

애초에 /files/avatars/FILENAME에 대한 get request 기록을 찾아볼 수 없었다. 

하. 지. 만.

 

 

file은 정상적으로 업로드되었다고 했기 때문에 파일 경로를 아는 입장으로서 직접 get request를 보내면 된다!

/files/avatars/webshell.php file을 달라는 요청 메세지를 서버로 보내면 

 

 

성공적으로 /home/carlos/secret file 내용을 얻을 수 있다.

 

 

(+) 위에서 시도했던 filename 값들을 살펴보면 뒤에 .jpg가 그대로 남아있는 경우에

response로 cleartext 상태의 file 내용이 제공되었다.

 

이미지로 판단을 했기 때문에 이미지 파일의 내용을 읽어서 보내주는 형태로 동작을 한 것이다.

하지만 공격자 입장에서는 파일이 실행되어야 하기 때문에 확장자가 .php만 남도록 파일 확장자를 조작해야 하고

그에 알맞은 filename은 "webshell.php%00.jpg"이다.

 

%00은 null byte를 의미한다. 이 값이 filename으로 들어가면 서버에서는 맨 뒤에 있는 .jpg를 보고 이미지로

판단하여 파일 업로드에 성공하게 되고

 

파일이 실행이 될 때는 파일명을 앞에서부터 읽어 %00 이전의 값까지 인식한다. 

.jpg 부분을 무시하도록 %00(= null byte)를 넣어 사실상 실행되는 파일의 이름은 webshell.php가 되는 것이다.

 

그러므로 shell 내용을 얻기 위해 request로 보내는 파일명이 webshell.php가 된다. 

 

'Port Swigger > File Upload' 카테고리의 다른 글

File Upload - Lab (5)  (0) 2023.06.25
File Upload - Lab (3)  (0) 2023.06.21
File Upload - Lab (2)  (0) 2023.06.21
File Upload (1) & Lab (1)  (0) 2023.06.20
Comments