---
description: 'DATE : 2023/9/21'
---

# File Upload Vulnerability \[6]

## <mark style="color:blue;">File Upload Vulnerability</mark>

이전 LAB에서는 blacklist로 특정 파일 확장자를 차단하고 있었다.&#x20;

또한 blacklist를 피해 서버에 파일을 업로드 하더라도 그 파일을 실행할 대상으로 인식 시키기 위해

<mark style="color:blue;">**.htaccess**</mark> 파일을 작성해줄 필요가 있었다.



이번에 풀어볼 LAB에서도 Blacklist가 적용된다고 하는 데&#x20;

업로드할 수 있는 파일 확장자가 좀 더 제한적인 느낌이다...!



이번 LAB은 어떻게 해결할 수 있을 지 바-로 들어 가보자.

***

### <mark style="color:blue;">**\[ LAB#5 ]**</mark>

앞에서 살펴봤던 것처럼 LAB에 들어가 wiener:peter 계정으로 로그인해준다.&#x20;

로그인 후 제공되는 avatar form에 업로드 하고 싶은 file을 넣어 Upload 하면

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2F6CaOHhcb9xj9sAZO3bTz%2Fimage.png?alt=media&#x26;token=cfa48f1f-f987-44d7-9e8e-9ca07585d8fa" alt=""><figcaption></figcaption></figure>

오직 JPG & PNG file만 업로드할 수 있다고 한다.



그렇다면 우리가 업로드 하고 싶은 PHP file은 업로드를 할 수 없다..!

하지만 서버에 올라간 뒤에 PHP file로 실행될 수 있도록 해야 한다.. :head\_bandage:



그렇다면 우리가 올리는 파일은 PHP인데 이를 JPG or PNG로 인식하도록 만들어야 한다.

일단 제일 단순하게 <mark style="color:blue;">**파일 확장자를 이어 붙여보자.**</mark>



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FK9q3ZEwqKAudXeSltYzN%2Fimage.png?alt=media&#x26;token=4514b263-0b68-42d1-a521-1f07e2b07108" alt=""><figcaption></figcaption></figure>

원래 filename에 확장자 하나를 더 붙여서 보내봤다.&#x20;



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FdI1N9YuoOlujCjYQSJ8R%2Fimage.png?alt=media&#x26;token=abcc1ff7-4f3d-4ef8-b571-a9d9eba922f0" alt=""><figcaption></figcaption></figure>

response를 확인해보면 정상적으로 업로드 된 걸 확인할 수 있다.



<mark style="background-color:blue;">**즉, php.jpg 형태로 파일을 업로드 하면 PHP 확장자를 차단하는 blacklist를 우회할 수 있다는 것!**</mark> :bulb:

(.png로 실행해도 동일한 결과가 나온다.)



그렇다면 다음 문제는 blacklist를 회피해 올린 파일이 <mark style="color:blue;">**서버에서 실행되도록**</mark> 만드는 것이다.

jpg 상태로 서버에 올려지면 이 파일을 실행시킬 대상으로 인식하지 않는다.&#x20;



따라서 업로드할 때는 <mark style="color:blue;">**jpg를 보고 blacklist를 회피하고 이후에는 이 확장자가 인식되면 안된다.**</mark>

이를 실행할 수 있는 간단한 방법은

```
webshell.php.jpg -> webshell.php;.jpg 

or

webshell.php.jpg -> webshell.php%00.jpg
```

.jpg 앞에 <mark style="color:blue;">**세미콜론**</mark>을 붙이거나 <mark style="color:blue;">**null byte**</mark>를 붙이면 된다.&#x20;



<mark style="color:blue;">**파일 확장자를 검사할 때는 맨 뒤에 있는 jpg를 보고 이미지 파일이라 판단해 blacklist를 우회하고**</mark>

<mark style="color:blue;">**파일을 실행할 때는 파일 이름을 세미콜론 or Null byte 전까지만 인식하게 된다.**</mark>&#x20;



따라서 파일을 업로드 하고 나면 세미콜론 or Null Byte 뒤에 붙은 jpg or png 확장자는 무시되고&#x20;

php까지만 인식한 서버는 이 파일을 실행하게 되는 것이다.&#x20;



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FoBhydMIVgjJ8qAM4xmWX%2Fimage.png?alt=media&#x26;token=14b30623-5bdc-402a-bf97-17a508655269" alt=""><figcaption></figcaption></figure>

filename을 "webshell.php%00.png"로 조작해 packet을 보내면



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FbqZYt3ZnA0cYQl81PpVp%2Fimage.png?alt=media&#x26;token=72efec4b-346c-42f1-ac97-0c7d39462fc4" alt=""><figcaption></figcaption></figure>

성공적으로 파일을 업로드할 수 있고



URL 바에 /files/avatars/webshell.php를 입력해 실행도 시킬 수 있다.

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FoeD7HxdiEiPgBdoFeD6S%2Fimage.png?alt=media&#x26;token=7e4a1a2e-70c5-4dc7-a675-47411608a9cf" alt=""><figcaption></figcaption></figure>



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FLU5WLTvA5XvMRa3W2UCQ%2Fimage.png?alt=media&#x26;token=570c4a8f-efb3-400d-ba8a-415d82ed52e7" alt=""><figcaption></figcaption></figure>

secret file에서 찾은 flag를 제출해주면 끝!





위의 과정은 %00(null byte)가 아닌 세미콜론으로 해도 똑같은 결과를 얻을 수 있다.

![](https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FDHxLEcIEFFUVdhDz7lNA%2Fimage.png?alt=media\&token=b7678e52-c96b-45ad-b5e7-08920de46318)![](https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FHxoAk0NapZDP3W9h8N4T%2Fimage.png?alt=media\&token=edd050ea-89ea-493d-ab27-b6f751817ab9)



***

이번 LAB에서는 파일 업로드를 통과할 수 있는 특정 확장자로 인식되기 위한 우회 방법을 살펴보았다.



만약 filename 안에 포함된 확장자가 몇 개인지 확인하거나&#x20;

확장자와 content-type 또는 확장자와 파일 내용 등을 같이 검사하는 과정을 거쳤다면&#x20;

단순히 확장자 하나를 이어 붙이는 걸로는 우회할 수 없었을 것이다.&#x20;



그렇다 보니 <mark style="color:blue;">**defense in depth!!**</mark>

한 가지 방법으로 공격을 막는 것 보다는 발생할 수 있는 여러 경우에 맞설 수 있는&#x20;

검증 체제를 구현할 필요가 있다!! :thumbsup:
