Level 11 → Level 12
Web/Natas

Level 11 → Level 12

반응형


<? 

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(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>
<? } ?>

코드를 바로 살펴봅시다.

음 조금 복잡하군요.

하지만 위의 코드와는 거의 상관없이 이 문제의 의도는 "파일 업로드의 취약점"을 이용하는 것입니다.

 

그러기 위해서는 일단 html 혹은 php로 작성된 파일이 필요합니다.

먼저 작성해봅시다.

이렇게 작성한 다음에

확장자명을 php로 바꿔줍니다.

이제 업로드 한 뒤에 결과를 살펴봅시다.

하지만 이런 식으로 아무것도 나타나지 않고 jpg 확장자로 인식되어 저희가 원하는 결과가 나오지 않았습니다.

그렇다면 저희는 이걸 php로 확장자를 바꿔줘야만 합니다.

 

방법은 2가지입니다.

1. Burp Suite 같은 우회 툴로 확장자를 바꿔준다.

2. (Chrome 기준) F12를 눌러 미리 정해진 .jpg 확장자를 .php로 바꿔준다.

저 같은 경우는 2번을 선택하여 간단하게 처리했습니다.

빨간 줄을 친 곳과 같이 바꿔준 뒤에 Upload File 버튼을 클릭해봅시다.

확장자명이 바뀜

얻었습니다. 다음으로 가보죠.

 

jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

반응형