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

# File Upload Vulnerability \[4]

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

이번엔 볼 LAB에서는 파일 업로드 취약점 뿐만 아니라 <mark style="color:blue;">**path traversal vulnerability**</mark>도 존재하며

파일 업로드 공격을 예방하기 위해서 사용자가 제출한 파일은 실행 되지 못하도록 설정되어 있다고 한다.



<details>

<summary>Path Traversal Vulnerability</summary>

path traversal 취약점은 다른 말로 directory traversal 라고도 한다.

이름에서 유추할 수 있듯이 서버 관리자 의도한 경로가 아닌 다른 경로(directory)로

이동할 수 있는 취약점을 의미한다.&#x20;

</details>



서버에서는 사용자가 업로드한 파일을 설정된 경로로 올리게 되는 데

이때 경로에 따라 실행할 수 있는 유형의 파일이 있더라도 실행하지 못하게 설정할 수가 있다.



그렇게 되면 사용자가 악의적인 목적을 가지고 web shell과 같은 파일을 올려도

서버에서는 이 파일이 올라간 directory 내의 파일은 실행시키지 않기 때문에&#x20;

원하는 결과를 얻을 수 없게 된다.



이런 상황에서 또 다른 취약점, Path traversal 공격을 이용해 원하는 파일을 실행시키는 거 까지!

어떻게 성공할 수 있을 지 LAB을 통해 확인해보자. :smile:

***

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



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FE54JUM1zBWKGPCEPvJcc%2Fimage.png?alt=media&#x26;token=3d52b534-f4b8-4df3-aa71-d1813bf85983" alt=""><figcaption></figcaption></figure>

LAB으로 들어가면 여느 때와 마찬가지로 My account 버튼을 통해 login 페이지를 가져올 수 있다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FWoZIsZEkZG2cvCuxjxsY%2Fimage.png?alt=media&#x26;token=20460142-c134-44d7-8879-c25d72ad0919" alt=""><figcaption></figcaption></figure>

wiener:peter 계정으로 로그인을 해주고



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FRvs6fWqujeE9hrtEQwdH%2Fimage.png?alt=media&#x26;token=8fd3c0d2-6c99-469e-83f2-cf9e49b44342" alt=""><figcaption></figcaption></figure>

이전 LAB에서도 사용한 webshell.php file을 업로드해준다.&#x20;



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FNBcPjw7xLdkOPrLhKrPr%2Fimage.png?alt=media&#x26;token=6c606614-5def-47e4-81d0-1a2859e7fbfb" alt=""><figcaption></figcaption></figure>

성공적으로 업로드 되었다는 문구를 확인한 후&#x20;



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2F1fC1dgpRntRtctcjklWp%2Fimage.png?alt=media&#x26;token=6ab6b1c5-74d2-4ff9-9285-0b737aba247e" alt=""><figcaption></figcaption></figure>

해당 경로를 URL 바에 입력해주면..!



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2Ftc9bdBkQMyqXDTCLbHOF%2Fimage.png?alt=media&#x26;token=1ee18e07-2985-41ad-a312-559b22f2b54d" alt=""><figcaption></figcaption></figure>

엥? <mark style="background-color:blue;">**PHP code가 실행된 결과가 아닌 PHP code 그 자체의 내용을 보여주고 있다.**</mark>



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2Fd9C9iOVNDMSLOOT7vAcO%2Fimage.png?alt=media&#x26;token=a020bd10-dd48-46fb-8617-57fcc0bd8834" alt=""><figcaption></figcaption></figure>

packet을 확인해보면 /files/avatars/webshell.php를 실행하는 request를 보냈고

이에 webshell.php 내용이 그대-로 적힌 response를 받았다는 걸 알 수 있다.



위에서도 말했듯이 서버에서는 지금 파일 업로드 공격을 막기 위해&#x20;

사용자가 업로드한 파일이 들어있는 경로에서는 <mark style="color:blue;">**(/files/avatars)**</mark>

PHP와 같이 실행 가능한 파일이라도 실행시키지 않고 있다.&#x20;



따라서 우리는 파일을 작성해서 업로드 할 수는 있지만&#x20;

지금 상태로는 request를 보내도 파일 실행까지는 무리라는 것..! :anguished:



이런 상황에서 사용할 수 있는 다른 공격 방법이 바로, <mark style="color:blue;">**path traversal attack!**</mark>

현재 사용자가 파일을 업로드하면 서버에 있는 **/files/avatars directory**로 파일이 올라가고 있다.



우리는 <mark style="color:blue;">**path traversal sequence**</mark><mark style="color:blue;">를 사용해 다른 directory로 파일이 업로드 되도록 할 것이다!!</mark> :bulb:

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FY5BsoPVk4kGJzmQLszKZ%2Fimage.png?alt=media&#x26;token=a54d8a99-48f0-48d7-b451-0ae324eeb45b" alt=""><figcaption></figcaption></figure>

업로드 할 경로를 바꿔주기 위해 packet을 잡아보자 \~\_\~

Intercept ON!!



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FEEGJsPUfzxIGi9VpqBPN%2Fimage.png?alt=media&#x26;token=a48025d7-ad59-49ea-b5ca-d9a1c085840e" alt=""><figcaption></figcaption></figure>

파일을 업로드 하는 순간의 packet을 잡아보면&#x20;

업로드 할 파일에 대해 <mark style="color:blue;">**filename="webshell.php"**</mark>인 상태를 볼 수 있을 것이다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FgeGB32hvvjZCFiaPoYfS%2Fimage.png?alt=media&#x26;token=6f967090-f7a8-4813-b3c9-ce19a0924562" alt=""><figcaption></figcaption></figure>

파일 이름 앞에 path traversal sequence인 <mark style="color:blue;">**../**</mark> 를 붙여 packet을 보내보자.&#x20;



결과를 보면

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2F4dbrt1IgASWp14q4OYQK%2Fimage.png?alt=media&#x26;token=d615efb4-286d-4443-9d40-6770c3ec5516" alt=""><figcaption></figcaption></figure>

흠.. sequence를 제거하는 기능이 있는 지 아까랑 동일한 경로로 파일이 업로드 되었다고 한다.

그렇다면 Encode를 하면 어떨까??



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FieCmwdwWmLNvABRqIXg1%2Fimage.png?alt=media&#x26;token=457852b9-90ee-49fd-8fce-edb6bbcc810b" alt=""><figcaption></figcaption></figure>

Burp suite - Decode Tab으로 가서 ../을 입력한 뒤 URL encode를 하면



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FnyziJ4hvgJkI1rQSG1eZ%2Fimage.png?alt=media&#x26;token=cac71510-eae4-4d99-a972-1a4fc9605a2d" alt=""><figcaption></figcaption></figure>

쉽게 encode한 값을 얻을 수 있다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FLQUhMYSHujE6vBZxzH3h%2Fimage.png?alt=media&#x26;token=13887839-29a6-4cb2-a60e-a2f7b2ac076e" alt=""><figcaption></figcaption></figure>

다시 돌아와 이번에는 encode한 sequence 값을 파일 이름 앞에 붙여 보내봤다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FvJEKea3dBvL1R2AggNfn%2Fimage.png?alt=media&#x26;token=3c8f0fef-f710-4b64-ae8c-4216f6bf7a32" alt=""><figcaption></figcaption></figure>

결과 문구를 보면 이번엔 성공적으로 sequence가 사용된 듯하다!



지금 path traversal sequence로 사용하고 있는 값은&#x20;

<mark style="color:blue;">**현재 directory에서 상위인 directory로 한 번 빠져나가라는 의미이다.**</mark>



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2Fo0kH6pYkkwWK5yxsgia0%2Fimage.png?alt=media&#x26;token=c1e4d748-aedc-4e1a-808c-5032792e5f64" alt=""><figcaption></figcaption></figure>

따라서 원래 업로드 경로인 /files/avatars directory에서 한 번 빠져 나온&#x20;

<mark style="color:blue;">**/files directory에 파일이 업로드**</mark> 되고 해당 경로를 URL 바에 입력하면&#x20;



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FbpJBLT9MP70yBADWPAdP%2Fimage.png?alt=media&#x26;token=c713fc3c-9522-4019-b525-366c9b773498" alt=""><figcaption></figcaption></figure>

이번엔 PHP code 내용이 아닌 PHP code가 실행된 결과 값을 얻을 수 있게 된다!! :clap:

(이 flag도 submit해주면 LAB 해결 완료!)
