[WebSec] Level 8
Information Gathering
Challenge này liên quan đến kiến thức Upload File và GIF.
GIF là gì?
GIF viết tắt của từ Graphics Interchange Format. Nôm na tiếng Việt gọi là ảnh động. Có đuôi file là .gif và phần signature của file là GIF89a. Trong đó: GIF8 là mã signature, còn 9a là version của file GIF đó.
Các bạn có thể tham khảo thêm GIF Signature Format tại đây.
Source code
1 | |
Đọc source code phía trên, ta thấy có 3 điều kiện để upload file thành công.
- Size file để upload không được quá 50kb (50000 bytes).
- File đó phải là file GIF.
- File đó không được rỗng.
Mình đã thử upload các file thông thường nhưng chưa vượt qua 3 điều kiện trên đó (có lẽ vì file GIF download từ Google về quá nặng).

Exploit
Trước khi đểể khai thác được bài này thì mình phải xác định là sẽ upload 1 file có chứa các dòng code PHP bên trong file đó (tạm gọi là shell PHP).
Để ý hàm getimagesize() nó sẽ trả về giá trị khác false thì mới được.
Cùng debug hàm getimagesize() này để xem cách hoạt động của nó ra sao?
Mình sẽ chuẩn bị 2 file trong cùng một thư mục có tên là 1.php và getimagesize.php với nội dung sau.

1 | |
1 | |
Sau khi run file getimagesize.php thì kết quả sẽ không ra gì cả.

Nhưng nếu mình thêm phần Signature của GIF vào file 1.php thì sao?
Mình có thể thêm trực tiếp Signature vào file. Hoặc dùng tool online
1 | |
Run lại file getimagesize.php, thì đã ra được kết quả. Mặc dù là file php nhưng mime-type là image/gif.

Mình có thể bypass qua vòng if thứ 2.
Tiếp theo mình upload file lên xem server có xử lí không?

Vậy là server có xử lí code trong file 1.php. Việc tiếp theo mình xem trong thư mục hiện tại có những file nào?
Mình đã thử các webshell PHP, tuy nhiên đã bị filter hay chặn gì đó nên không dùng được.
Thay vì sửa code lại trong file 1.php thì mình dùng Burp Suite để sửa code luôn cho nhanh.
1 | |

Đọc file flag.txt là xong.
1 | |
