File Upload Vulnerability [7]
DATE : 2023/9/24
Last updated
DATE : 2023/9/24
Last updated
지금까지 살펴본 파일 업로드 LAB은 Content-Type이나 file extension 등을 조작하는
방법을 통해 PHP shell을 서버에서 실행시킬 수 있었다.
하지만 이번에는 조금 다르게 업로드 된 파일이 진짜 이미지인지 확인하는 과정을 거친다고 한다.
그렇다면 말은 PHP file을 올리면서 image file인 척 할 수 없게 되었다는 의미이다.
이런 상황에서 우리는 크게 두 가지 문제를 해결해야 한다!!
(1) PHP file Upload : PHP를 차단하는 서버에 PHP 파일 업로드하기
(2) execute PHP file : 이미지인 척 올린 파일을 PHP로 실행하기
LAB으로 들어가 여느 때 처럼
wiener:peter로 로그인을 해준다.
로그인한 사용자에게 제공되는 form으로 PHP file을 제출해보았다.
진짜 이미지 파일인지 확인한다고 했으니 나름대로 위장을 해보지만..!
유효한 이미지가 아니라서 업로드할 수 없다고 한다.
그 밖에도 확장자, 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 값을 찾을 수 있다.
이번 LAB에서는 진짜 이미지를 필요로 했기 때문에
실제 jpg file에 PHP code를 삽입하는 방법으로 파일 업로드 공격을 성공할 수 있었다.
PHP file을 올려오다가 image file에 PHP code를 주입한다는 방법은 꽤 색다른 방식이었다.
그렇다 보니 시간이 오래 걸리기는 했지만,
사실 업로드한 파일의 확장자를 확인하는 과정이 포함되었다면 못 풀었을 것 같다..
이번 LAB에서 구현한 파일 검증 체제는 우회 하는 게 좀 어렵긴 했지만
취약한 부분이 없는 건 아니었다 보니 추가적인 부분을 구현했다면 좀 더 안전하지 않았을까 싶다!
역시.. 이번엔 허술한 위장으로 LAB을 해결할 수 없을 듯하다..!
... 엥? 이게 뭐야 싶을 것이다.
찾은 flag를 제출하면 끝!