[ Natas 13 -> Natas 14 파일 시그니처 ( File Signature ) ]

2017. 9. 25. 20:23WebHacking/[OverTheWire]Natas



1> 초기 페이지


2> 페이지 소스


3> PHP코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?  
 
function genRandomString() { 
    $length = 10
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz"
    $string = "";     
 
    for ($p = 0$p < $length$p++) { 
        $string .= $characters[mt_rand(0, strlen($characters)-1)]; 
    } 
 
    return $string
 
function makeRandomPath($dir$ext) { 
    do { 
    $path = $dir."/".genRandomString().".".$ext
    } while(file_exists($path)); 
    return $path
 
function makeRandomPathFromFilename($dir$fn) { 
    $ext = pathinfo($fn, PATHINFO_EXTENSION); 
    return makeRandomPath($dir$ext); 
 
if(array_key_exists("filename"$_POST)) { 
    $target_path = makeRandomPathFromFilename("upload"$_POST["filename"]); 
 
 
        if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) { 
        echo "File is too big"
    } else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {     // 업로드한 파일이 이미지 파일인지 확인하는 
        echo "File is not an image"
    } else { 
        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
            echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded"
        } else
            echo "There was an error uploading the file, please try again!"
        } 
    } 
else { 
?> 
cs


* exif_imagetype( 파일 )

exif_imagetype() reads the first bytes of an image and checks its signature. 출처 : php.net )

파일의 1byte를 읽어들여서 이미지파일인지 확인한다 ( 파일시그니처를 확인한다 )



4> HxD 프로그램을 이용

이전 문제에서 사용한 webshell.txt 파일의 파일 시그니쳐를 조작한다


" FF D8 FF E0 "은 이미지파일의 파일시그니쳐이다

 

5> 조작한 파일 업로드


6> 파일의 확장자를 조작해서 패킷 전송


7> 이미지 파일로 위장했으며, 확장자는 php로 된 파일을 업로드 하였다


8> 업로드한 파일의 경로로 접속하면서 GET방식으로 cmd변수에 사용할 명령어 입력 


9> cmd=/cat%20/etc/natas_webpass/natas14 

URL입력창에서 %20 은 스페이스바의 아스키코드값이다




natas14 : Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1