File Upload Vulnerability [7]

DATE : 2023/9/24

File Upload Vulnerability

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

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

하지만 이번에는 조금 다르게 업로드 된 파일이 진짜 이미지인지 확인하는 과정을 거친다고 한다.

그렇다면 말은 PHP file을 올리면서 image file인 척 할 수 없게 되었다는 의미이다.

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

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

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


[ LAB#6 ]

LAB으로 들어가 여느 때 처럼

wiener:peter로 로그인을 해준다.

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

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

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

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

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

모두 실패했다..!

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

이때 사용할 수 있는 대표적인 Tool, exiftool을 사용해볼 것이다.

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

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

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

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

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

PNG image data라고 나온다.

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

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

이 방법을 사용하게 되면 (1) 파일 내용을 읽는 경우 이미지 파일임을 알 수 있어

image 파일만 업로드할 수 있는 서버의 검증 체제를 피할 수 있다.

이후에는 (2)확장자가 PHP이기 때문에 서버가 이 파일을 실행시킬 건데

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

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

만든 파일을 업로드 해보면

이번엔 성공이다! 확장자는 PHP일지라도 파일 내용이 실제 jpg이기 때문에 업로드할 수 있었다.

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

😳😳😳😳😳 ... 엥? 이게 뭐야 싶을 것이다.

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

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

따라서 저 내용은 PHP로 위장한 jpg 파일의 내용이다. 다.만

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

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

packet 내용을 확인해보기 위해

file_get_contents() 앞뒤에 표시해둔문구를 검색해보면 (FIRST ~ LAST)

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

찾은 flag를 제출하면 끝! 👏👏👏


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

실제 jpg file에 PHP code를 삽입하는 방법으로 파일 업로드 공격을 성공할 수 있었다.

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

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

사실 업로드한 파일의 확장자를 확인하는 과정이 포함되었다면 못 풀었을 것 같다..

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

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

Last updated