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

# File Upload Vulnerability \[7]

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

지금까지 살펴본 파일 업로드 LAB은 Content-Type이나 file extension 등을 조작하는&#x20;

방법을 통해 PHP shell을 서버에서 실행시킬 수 있었다.&#x20;



하지만 이번에는 조금 다르게 업로드 된 파일이 <mark style="color:blue;">**진짜 이미지**</mark>인지 확인하는 과정을 거친다고 한다.&#x20;

그렇다면 말은 PHP file을 올리면서 <mark style="color:blue;">**image file인 척**</mark> 할 수 없게 되었다는 의미이다.&#x20;



이런 상황에서 우리는 크게 두 가지 문제를 해결해야 한다!!

**(1)** PHP file Upload : PHP를 차단하는 서버에 PHP 파일 업로드하기&#x20;

**(2)** execute PHP file : 이미지인 척 올린 파일을 PHP로 실행하기&#x20;



***

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



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2F1ImeRoCesR5E50pnp9tn%2Fphishing%20target%20list_1.png?alt=media&#x26;token=251f3646-e937-46d4-b78d-fc37dd60f6ab" alt=""><figcaption></figcaption></figure>

LAB으로 들어가 여느 때 처럼&#x20;



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FjWjBdbp0Ykww01ZFL2HM%2Fphishing%20target%20list_2.png?alt=media&#x26;token=bb2ef4c1-6502-4cf6-ad0b-828742bfafe5" 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%2F00PAgOxu96mmPQjemeEP%2Fphishing%20target%20list_3.png?alt=media&#x26;token=d4d784f9-4a7c-42f0-8c67-bcc527b53ab1" alt=""><figcaption></figcaption></figure>

로그인한 사용자에게 제공되는 form으로 PHP file을 제출해보았다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FkCzSRvbApU1Q4aCk0sNW%2Fphishing%20target%20list_4.png?alt=media&#x26;token=f765e24f-62ec-4645-b0a6-16d9b786ffdc" alt=""><figcaption></figcaption></figure>

진짜 이미지 파일인지 확인한다고 했으니 나름대로 위장을 해보지만..!



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FAoHyUS5eWWYJptf0IcAF%2Fphishing%20target%20list_5.png?alt=media&#x26;token=0d110df4-3299-4b83-83bd-db57c4bd370b" alt=""><figcaption></figcaption></figure>

유효한 이미지가 아니라서 업로드할 수 없다고 한다.

역시.. 이번엔 허술한 위장으로 LAB을 해결할 수 없을 듯하다..! :flushed:



그 밖에도 확장자, signature, Content-Type 등 이것 저것 조작해봤지만&#x20;

모두 실패했다..!&#x20;



아무래도 서버에서 원하는 진짜 이미지가 필요할 듯하다.&#x20;

이때 사용할 수 있는 대표적인 Tool, <mark style="color:blue;">**exiftool**</mark>을 사용해볼 것이다.

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FLmlbXkzEIiYUmysgh6FM%2Fphishing%20target%20list_6.png?alt=media&#x26;token=b120e25d-1b45-4c59-83ee-4d1c1a03b492" alt=""><figcaption></figcaption></figure>

자세한 사용법은 man exiftool을 입력하면 볼 수 있다.



기본적으로 "exiftool FILENAME"을 입력하면 파일에 대한 정보를 출력해준다.&#x20;

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2F99a8aXpj5B80K1HZonng%2Fphishing%20target%20list_8.png?alt=media&#x26;token=04224e2c-c2f7-4b24-896f-a4ffa9e1da1b" alt=""><figcaption></figcaption></figure>



우리는 이 도구를 이용해 이미지 파일에 PHP code를 삽입할 것이다.

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FDrXE38HlP8BjdHcg4Jh4%2Fphishing%20target%20list_9.png?alt=media&#x26;token=5259480d-73d2-4343-9526-a1a20d89c9bf" alt=""><figcaption></figcaption></figure>

Screenshot.png에다가 -Comment를 넣어 webshell.php로 생성한다.



확장자 이름은 PHP이지만 file command로 확인해보면&#x20;

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FKsrGNP7eV0nfOYgQjQPG%2Fphishing%20target%20list_10.png?alt=media&#x26;token=29971059-e68c-4425-a64e-27140fdda770" alt=""><figcaption></figcaption></figure>

PNG image data라고 나온다.&#x20;



즉 PHP 확장자인 image file을 생성한 것이다. exiftool로 확인해보면&#x20;

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FfAWWPGktH7ITDLfj53jw%2Fphishing%20target%20list_11.png?alt=media&#x26;token=98ef3d58-594f-452e-8d14-ef7723c910cf" alt=""><figcaption></figcaption></figure>

Comment : \<?php echo "hello"; ?> 가 추가된 걸 볼 수 있다.



이 방법을 사용하게 되면 <mark style="color:blue;">**(1) 파일 내용을 읽는 경우 이미지 파일임을 알 수 있어**</mark>&#x20;

<mark style="color:blue;">**image 파일만 업로드할 수 있는 서버의 검증 체제를 피할 수 있다.**</mark>



이후에는 <mark style="color:blue;">**(2)확장자가 PHP이기 때문에 서버가 이 파일을 실행**</mark>시킬 건데&#x20;

이때 /home/carlos/secret file 내용을 출력하라는 PHP code가 실행되게 할 수 있다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FKOTgtGc4chP6llCHih1u%2Fphishing%20target%20list_13.png?alt=media&#x26;token=22bc3d88-a787-481a-bb79-ea1d2eff47fa" alt=""><figcaption></figcaption></figure>

위의 사진처럼 /home/carlos/secret 파일을 읽는 코드를 jpg file 내부에 넣어 PHP 파일로 만들었다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2Fk4qdls1EZUdVXEFRyA8P%2Fphishing%20target%20list_14.png?alt=media&#x26;token=dbf53c88-77b0-418f-a5bf-2d83fbf96c43" 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%2FrtAcuHVszVmaxHVUT9mf%2Fphishing%20target%20list_15.png?alt=media&#x26;token=18774af4-33a4-4a92-9e98-b8f20c7a5eea" alt=""><figcaption></figcaption></figure>

이번엔 성공이다! 확장자는 PHP일지라도 <mark style="color:blue;">**파일 내용이 실제 jpg**</mark>이기 때문에 업로드할 수 있었다.



서버에 올렸으니 이젠 파일을 실행시켜야 한다. URL 바에 /files/avatars/webshell2.php를 입력하면

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FECCXZUAeGy7Mix3vejUj%2Fphishing%20target%20list_17.png?alt=media&#x26;token=76150cb9-bd58-46b7-b64e-0cf035661665" alt=""><figcaption></figcaption></figure>

:flushed::flushed::flushed::flushed::flushed: ... 엥? 이게 뭐야 싶을 것이다.&#x20;

우리가 올린 PHP file은 사실 jpg 파일이기 때문에 PHP file을 실행시키라고 하면&#x20;

서버는 실제 파일의 내용을 읽어다 보여준다.&#x20;



따라서 저 내용은 PHP로 위장한 jpg 파일의 내용이다. <mark style="color:blue;">**다.만**</mark>

jpg file 중간에 Comment로 PHP code를 삽입했기 때문에 저 내용 속에

/home/carlos/secret 파일 내용이 숨어있을 것이다.



packet 내용을 확인해보기 위해&#x20;

<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FKXiR7M9GfkkePWue81fg%2Fphishing%20target%20list_19.png?alt=media&#x26;token=1a6bde52-e3ac-40e1-853b-0dd40a3f0913" alt=""><figcaption></figcaption></figure>

file\_get\_contents() 앞뒤에 표시해둔문구를 검색해보면 (FIRST \~ LAST)



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FyFSVZ3ArhNWuMrMA2xxN%2Fphishing%20target%20list_16.png?alt=media&#x26;token=545571b7-9cfb-441d-a765-1d21d2b90700" alt=""><figcaption></figcaption></figure>

쉽게 /home/carlos/secret 값을 찾을 수 있다.



<figure><img src="https://2050385856-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnJpS96NZbYerJIEOTo8i%2Fuploads%2FNMud7dkZCUttDiSN0O2o%2Fphishing%20target%20list_18.png?alt=media&#x26;token=f910857e-5e81-4963-baaf-c6f9c9ab477a" alt=""><figcaption></figcaption></figure>

찾은 flag를 제출하면 끝! :clap::clap::clap:



***

이번 LAB에서는 진짜 이미지를 필요로 했기 때문에&#x20;

<mark style="color:blue;">**실제 jpg file에 PHP code를 삽입**</mark>하는 방법으로 파일 업로드 공격을 성공할 수 있었다.



PHP file을 올려오다가 image file에 PHP code를 주입한다는 방법은 꽤 색다른 방식이었다.

그렇다 보니 시간이 오래 걸리기는 했지만,&#x20;

사실 <mark style="color:blue;">**업로드한 파일의 확장자를 확인**</mark>하는 과정이 포함되었다면 못 풀었을 것 같다..



이번 LAB에서  구현한 파일 검증 체제는 우회 하는 게 좀 어렵긴 했지만&#x20;

취약한 부분이 없는 건 아니었다 보니 추가적인 부분을 구현했다면 좀 더 안전하지 않았을까 싶다!
