Level 12 → Level 13
Web/Natas

Level 12 → Level 13

반응형


이번에는 지난번과는 달리 이미지 파일만을 받아들인다고 하는군요.

소스를 보도록 합시다.

<? 

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"]);
    
    $err=$_FILES['uploadedfile']['error'];
    if($err){
        if($err === 2){
            echo "The uploaded file exceeds MAX_FILE_SIZE";
        } else{
            echo "Something went wrong :/";
        }
    } else 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 {
?>

<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000" />
<input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" />
Choose a JPEG to upload (max 1KB):<br/>
<input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
<? } ?>

이번에도 '웹 쉘'을 이용해야 하는 건 분명한데

php 함수인 'exif_imagetype'으로 이미지 타입만을 통과시키고 있습니다.

 

이미지 파일은 그럼 어떻게 구성되어 있을까요?

바로 Header와 Footer 시그니처로 구분되게 됩니다.

그렇다면 저희는 텍스트 파일을 하나 만들고 그 안에 이미지 파일의 Header 시그니처를 아무거나 하나 집어넣은 뒤,

php 코드를 이용해서 이전 문제처럼 풀도록 만들었습니다.

bypass.txt

 

이걸 제출하고 다시 html의 확장자명을 바꿔 준 다음에 Upload File을 누르고 링크가 생성되었다면

해당 링크로 들어가봅시다.

앞에 두 BM은 BMP 이미지 파일의 Header이기 때문에 제외하고 뒤의 문자열이 바로 우리가 원하는 패스워드입니다.

 

Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

반응형