[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 |
|