[OverTheWire] Natas – Level 12
http://natas12.natas.labs.overthewire.org/
Choose a JPEG to upload (max 1KB)…
Xem source:
[php]
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 $target_path has been uploaded”;
} else{
echo “There was an error uploading the file, please try again!”;
}
}
} else {
?>
[/php]
Đọ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:
[php]$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;
}[/php]
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:
[php] print genRandomString(); ?>.jpg)[/php]
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)
Tạo file 12.php có nội dung:
[php][/php]
Tại form upload, sửa thuộc tính filename thành *.php:
[html][/html]
Chọn file 12.php và tiến hành upload:
The file ... has been uploaded
Nhấn vào link:
jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
→ flag = jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY.
Recent comments