# Setup project ## Download project ```git # khởi tạo một Git repository git init # kích hoạt tính năng sparse-checkout git sparse-checkout init # Thêm đường dẫn của thư mục bạn muốn sao chép: git sparse-checkout set task_2 # Cuối cùng, sao chép (clone) repository từ GitHub: git remote add -f origin https://github.com/AT190510-Cuong/BlueCyber.git git pull origin main ``` ## Run project - bật Docker Desktop - vào thư mục có file **docker-compose.yml** ![image](https://hackmd.io/_uploads/B1HXQ1KQA.png) - Mở terminal chạy `docker-compose up` - đợi cho đến khi database báo **ready for connections** và **Server running on [http://0.0.0.0:8000].** ![image](https://hackmd.io/_uploads/SyHy7JtX0.png) - truy cập trang web tại `127.0.0.1:8000` - đã có 2 tài khoản được tạo sẵn là: - tài khoản giáo viên: `admin:123` - tài khoản học viên: `cuong:123` database gồm 5 table: ![image](https://hackmd.io/_uploads/Bk5gLEwX0.png) ![image](https://hackmd.io/_uploads/r1n6FNw7C.png) ### users ![image](https://hackmd.io/_uploads/H1cXE5uXA.png) ![image](https://hackmd.io/_uploads/SysrE9_7A.png) ### messages ![image](https://hackmd.io/_uploads/r1VM4cd7R.png) ### assignments ![image](https://hackmd.io/_uploads/SyU_m9uXC.png) ![image](https://hackmd.io/_uploads/Sk0FQc_QA.png) ### challenges ![image](https://hackmd.io/_uploads/HklT7q_m0.png) ![image](https://hackmd.io/_uploads/SkwxNcum0.png) ## Exploit ### IDOR - đoạn code lấy ```user_id``` trong session rồi chuyền vào truy vấn database ![image](https://hackmd.io/_uploads/HJesJROmC.png) ![image](https://hackmd.io/_uploads/S1DNeAdQC.png) - hiện tại có 3 user trong database ![image](https://hackmd.io/_uploads/HJP0y5u7R.png) - mình thay đổi parameter ```id``` và đọc được message của các user khác ![image](https://hackmd.io/_uploads/SyvEyc_70.png) ![image](https://hackmd.io/_uploads/Hk78y5d7R.png) ![image](https://hackmd.io/_uploads/H1DOk9OQC.png) ![image](https://hackmd.io/_uploads/HyRok9d7A.png) - để hạn chế lỗi này: - chúng ta có thể lấy trực tiếp ```user_id``` trong session mà không cần chuyền qua parameter trên url - kiểm tra kiểm soát quyền truy cập cho từng đối tượng mà người dùng cố gắng truy cập - user_id này nên được mã hóa và random ### File upload - đoạn code không chỉ định rõ định dạng file được phép tải lên - và lưu đường dẫn có chứa tên file do người dùng tải lên mà không mã hóa hay random tên file ![image](https://hackmd.io/_uploads/r14KHRdXC.png) - trang web bị lỗi file upload ở chức năng upload bài của giáo viên lẫn học viên - do tên file chúng ta upload được lưu không bị thay đổi nên chúng ta có thể ghi đè nội dung lên các file khác trùng tên như file ```.htaccess```và khi xóa file này thì file trùng tên cũng bị xóa theo #### Server side - mình upload file chứa webshell php đọc ```phpinfo()``` ![image](https://hackmd.io/_uploads/H1Rlb9um0.png) ![image](https://hackmd.io/_uploads/HyK0e9uQA.png) - upload thành công và trigger được lỗi ![image](https://hackmd.io/_uploads/HyGq-5dmR.png) - mình có thể thực hiện lệnh các lệnh system ![image](https://hackmd.io/_uploads/HyrfF9umR.png) ![image](https://hackmd.io/_uploads/H1Ipd5OQA.png) ![image](https://hackmd.io/_uploads/HyHZKcuQ0.png) ![image](https://hackmd.io/_uploads/S1BeY9umA.png) ![image](https://hackmd.io/_uploads/B1PFKc_70.png) ![image](https://hackmd.io/_uploads/B1LnY5dQA.png) ![image](https://hackmd.io/_uploads/ry0CUyK70.png) - có thể xem thêm RCE <a href='https://hackmd.io/@cuongnh/B1WSanCp6'>tại đây</a> - để hạn chế lỗi này: - xác thực ```file's type``` ví dụ với file ảnh ```'images.*' => 'required|image|mimes:png,jpg,jpeg,gif,svg|max:2048'``` để tránh attacker tải lên các file webshell - xác thực ```file's name```: để tránh kẻ tấn công có thể ghi đè lên các tệp quan trọng của hệ thống bằng cách tải lên các tệp cùng tên. Chúng ta có thể đặt tên file theo thời gian thực rồi lưu trên server```$filename = time()``` - xác thực ```file's size```: tránh kẻ tấn công có thể chiếm dụng hết disk space, từ đó tấn công Dos ví dụ với file ảnh ```'images.*' => 'required|image|mimes:png,jpg,jpeg,gif,svg|max:2048'``` #### Client side - khi giáo viên, học viên upload lên 1 file bài tập là html ![image](https://hackmd.io/_uploads/rJiMOzgVR.png) - và khi có user truy cập vào xem đề bài thì trang web sẽ thực thi được trang html này ![image](https://hackmd.io/_uploads/SJZRvGx4R.png) - trang web vẫn trả về ```Content-Type: text/html``` ![image](https://hackmd.io/_uploads/SkVaYQxVR.png) - từ đây có thể code ra trang html để phishing, CSRF - mình sẽ đánh cắp cookie của các user ![image](https://hackmd.io/_uploads/S10V2GlNC.png) - trang web sẽ load 1 ảnh bị lỗi và nó sẽ gửi 1 request đến webhook của mình kèm theo cookie ![image](https://hackmd.io/_uploads/rkpgnze4C.png) - trên webhook mình thấy được thông tin của cookie ![image](https://hackmd.io/_uploads/HJG73flNA.png) - vì khi gửi request upload file thành công thì chúng ta sẽ được setCookie ở trường ```XSRF-TOKEN``` và ```laravel_session``` trong đó thì ```laravel_session``` được set thêm trường httponly, thuộc tính HTTPOnly giúp bảo vệ cookie khỏi việc bị đánh cắp qua JavaScript nên trong cookie trả về cho chúng ta chỉ có ```XSRF-TOKEN``` ### Path traversal ![image](https://hackmd.io/_uploads/HJAyc1KmC.png) - file ```.htaccess``` nằm ở thư mục public cách thư mục chứa các file upload assignment 2 cấp - chúng ta có thể tận dụng path traversala đọc file này ![image](https://hackmd.io/_uploads/ryGRt1K70.png) ### Store XSS, SSTI - trang web không bị XSS và SSTI do đã được framework encode ký tự đặc biệt ![image](https://hackmd.io/_uploads/BJgTrJFXR.png) ![image](https://hackmd.io/_uploads/BJjKByK7A.png) ![image](https://hackmd.io/_uploads/H1OqrJtX0.png) ![image](https://hackmd.io/_uploads/B15KaJtmA.png) ![image](https://hackmd.io/_uploads/SJhI6kF7R.png) ![image](https://hackmd.io/_uploads/Byv86JFQA.png)