Mở đầu
Bài hôm nay hơi khác các bài mình từng làm đó là ta sẽ đi reivew source code để tìm ra lỗ hổng và tiến hành khai thác. Ngôn ngữ được dùng ở đây là PHP, mình chưa từng code qua PHP bao giờ nên lúc làm bài gặp khá nhiều khó khăn vì mình khá là thích C nhưng nó lại thiếu các thư việc hỗ trợ nên mình tìm đến Golang một ngôn ngữ mình mới học gần đây là mình khá là thích vì nó là sự kết hợp của C và Python. Lan man đủ rồi vào việc thôi
Write-up
Vì mình biết bài này là reivew source code nên mình đã chạy gobuster với option -x với các file extension là .zip, .rar, .bak và mình tìm được source code là source_code.zip.
Chức năng đầu tiên mình kiểm tra là login
Phân tích một chút thì hàm sqli_real_escape_string() dùng để lọc tất cả các kí tự như ' " \n \r %00
mà username lại được bao quanh bởi dấu ' thì khả năng bypass gần như không có. Tiếp đến là hàm hash md5() chỉ trả lại kết quả chứ kí từ từ a-z, A-Z và 0-9 nên có thể kết luận là chức năng Login không tồn tại lỗ hổng
Mình để ý hầu hết tất cả các file có chứa dòng include '../include/isAuthenticated.php';
File này kiểm tra trong session có chứa id_level =1 hay không nếu không sẽ chuyển hướng đến login.php. Vì kiểm tra biến trong session nên khả năng cao chúng ta sẽ không khai thác được gì thêm ở đây
Như mình đã nói chỉ hầu hết các file có chứa file isAuthenticated.php nên ta còn các file resetPassword.php, doResetPassword.php, doChangePassword.php, viewItem.php. Sau khi nhìn qua các file trên thì ta rút ra được các điều như sau:
- Token dùng để reset password có độ dài là 15 và bao gồm các kí tự từ a-z, A-Z và 0-9
- File viewItem.php có chứa lỗ hổng Sqli Bool-base mặc dù đã dùng hàm sqli_real_escape_string() nhưng vì không để tham số trong dấu ' nên ta dễ dàng chèn thêm tùy ý
Thoạt nhìn qua ta tưởng file viewItem.php là an toàn vì nó cách nó kiểm tra người dùng có phải là admin không tương tự như file isAuthenticated.php, nó sẽ chuyển hướng về login nếu người dùng không phải là admin. Mình mất khá nhiều thời gian ở đây vì mình cũng nghĩ cách nó hoạt động như file isAuthenticated.php, nhưng không nếu người dùng không phải là admin thì nó sẽ vẫn tiếp tục thực hiện các dòng ở dưới mà không chuyển hướng luôn như mình nghĩ. Đến đây ta có thể lấy được token và chiếm được quyền của admin và phần phía ta chỉ cần bypass upload shell một chút là xong nên mình sẽ không trình bày nữa
Mình cũng có viết 1 đoạn code bằng go để khai thác tự động link ở đây
Cách dùng
- Đầu tiên bạn cần vào link reset password và nhập admin rồi gửi để tạo lại token
- Vào file thay đổi password và địa chỉ máy cùng với cổng
- Chạy lệnh nc -lnvp + số cổng bạn chọn
- Chạy file và hưởng thụ
Kết lại
Đây là bài khá là hay đối với mình và mình cũng tập viết được mã khai thác bằng ngôn ngữ yêu thích mới của mình là Go. Tuy nhiên code mình viết vẫn chưa tận dụng hết được sức mạnh của Go là currency để tăng tốc độ khai thác khi ta phải dùng Sqli Bool-base