# Lỗ hổng phía máy chủ: Phần 2: Kiểm soát truy nhập ## 1. Kiểm soát truy cập là gì? Kiểm soát truy cập là việc áp dụng các ràng buộc đối với người hoặc cái gì được phép thực hiện hành động truy cập tài nguyên. Trong bối cảnh của các ứng dụng web, kiểm soát truy nhập phụ thuộc vào xác thực và quản lí phiên: - Xác thực (Authentication) xác thực người dùng chính là người mà họ khai báo. - Quản lí phiên (Session management) xác định những yêu cầu HTTP tiếp theo nào đang thực hiện bởi cùng một người dùng. - Kiểm soát truy nhập (Access control) xác định liệu người dùng có được phép thực hiện hành động mà họ đang cố gắng thực hiện hay không. Kiểm soát truy nhập bị hỏng khá phổ biến và thường gây ra lỗ hổng bảo mật nghiêm trọng. Thiết kế và quản lý kiểm soát truy nhập là một vấn đề phức tạp, áp dụng các ràng buộc về mặt kinh doanh, tổ chức và pháp lý vào việc triển khai kỹ thuật. Các quyết định thiết kế kiểm soát truy cập phải do con người đưa ra nên khả năng xảy ra lỗi là rất cao. ## 2. Leo thang đặc quyền theo chiều dọc Nếu người dùng có thể truy cập vào chức năng mà họ không được phép truy cập thì đây là leo thang đặc quyền theo chiều dọc. Ví dụ, nếu người dùng không phải là quản trị viên có thể truy cập vào trang quản trị nơi họ có thể xóa tài khoản người dùng thì đây là leo thang đặc quyền theo chiều dọc. ## 3. Chức năng không được bảo vệ - Phần 1 Về cơ bản, leo thang đặc quyền theo chiều dọc phát sinh khi một ứng dụng không thực thi bất kỳ biện pháp bảo vệ nào cho chức năng nhạy cảm. Ví dụ: các chức năng admin có thể được liên kết từ trang welcome của admin, không phải từ trang welcome của user. Tuy nhiên, user có thể truy cập các chức năng admin bằng cách duyệt đến URL admin có liên quan. Ví dụ: một trang web có thể lưu trữ chức năng nhạy tại URL sau: ``` https://insecure-website.com/admin ``` Điều này có thể được truy cập bởi bất kỳ user nào, không chỉ những admin có liên kết đến chức năng trong giao diện user của họ. Trong một số trường hợp, URL quản trị có thể được tiết lộ ở các vị trí khác, chẳng hạn như tệp `robots.txt`: ``` https://insecure-website.com/robots.txt ``` Ngay cả khi URL không được tiết lộ ở bất kỳ đâu, kẻ tấn công vẫn có thể sử dụng danh sách từ để tìm ra vị trí của chức năng nhạy cảm. ## Lab: Chức năng không được bảo vệ Bài Lab này có bảng quản trị không được bảo vệ. Giải quyết bài Lab bằng cách xóa người dùng `carlos`. https://0aa700ed0425d0d88534c22f000f0089.web-security-academy.net/ Bước 1: Mở Burp Suite -> Proxy -> Open browser. ![Screenshot 2024-11-07 155037](https://hackmd.io/_uploads/S1g_kbcZ1g.png) Dán link bài Lab vào trình duyệt. Bước 2: Bật Intercept sau đó reload trình duyệt, mình thu được Request. Chuột phải vào Request -> Send to Repeater Bước 3: Vào Repeater -> Send, mình sẽ được Respond như này: ![Screenshot 2024-11-07 165650](https://hackmd.io/_uploads/HkLZyfcZyl.png) Bước 4: Truy cập vào /admin ![Screenshot 2024-11-07 165838](https://hackmd.io/_uploads/ByXF1GqZkx.png) Không thành công. Bước 5: Truy cập vào /robots.txt ![Screenshot 2024-11-07 170030](https://hackmd.io/_uploads/SybyxM5b1x.png) Mình thấy một đường dẫn Disallow: `/administrator-panel` Bước 6: Truy cập đến `/administrator-panel` ![Screenshot 2024-11-07 170804](https://hackmd.io/_uploads/B1c9WM9bye.png) Sửa link trên trình duyệt thành https://0aa700ed0425d0d88534c22f000f0089.web-security-academy.net/administrator-panel ![Screenshot 2024-11-07 170910](https://hackmd.io/_uploads/BJ3CWfq-Jl.png) Bước 7: Xóa người dùng `carlos` ![Screenshot 2024-11-07 171134](https://hackmd.io/_uploads/H1RwMf9-Je.png) ## 4. Chức năng không được bảo vệ - Phần 2 Trong một số trường hợp, chức năng nhạy cảm được che giấu bằng cách cung cấp cho nó một URL ít dự đoán hơn. Đây là một ví dụ về cái gọi là "bảo mật bằng sự mơ hồ". Tuy nhiên, việc ẩn chức năng nhạy cảm không cung cấp khả năng kiểm soát truy cập hiệu quả vì người dùng có thể phát hiện ra URL bị che giấu theo một số cách. Giả sử một ứng dụng lưu trữ các chức năng quản trị tại URL sau: ``` https://insecure-website.com/administrator-panel-yb556 ``` Kẻ tấn công có thể không đoán được trực tiếp điều này. Tuy nhiên, ứng dụng vẫn có thể rò rỉ URL cho người dùng. URL có thể được tiết lộ trong JavaScript xây dựng giao diện người dùng dựa trên vai trò của người dùng: ``` <script> var isAdmin = false; if (isAdmin) { ... var adminPanelTag = document.createElement('a'); adminPanelTag.setAttribute('href', 'https://insecure-website.com/administrator-panel-yb556'); adminPanelTag.innerText = 'Admin panel'; ... } </script> ``` Tập lệnh này thêm liên kết đến UI của người dùng nếu họ là admin. Tuy nhiên, tập lệnh chứa URL sẽ hiển thị cho tất cả người dùng bất kể vai trò của họ. ## Lab: Chức năng không được bảo vệ với URL không thể đoán trước Bài Lab này có bảng quản trị không được bảo vệ. Nó nằm ở một vị trí không thể đoán trước, nhưng vị trí đó được tiết lộ ở đâu đó trong ứng dụng. Giải quyết bài Lab bằng cách truy cập bảng quản trị và sử dụng bảng này để xóa người dùng `carlos`. https://0adb00e3033dc2cb8056d5ef00f200cf.web-security-academy.net/ Bước 1: Mở Burp Suite -> Proxy -> Open browser. Dán link bài Lab vào trình duyệt. Bước 2: Bật Intercept sau đó reload trình duyệt, thu được Request. Chuột phải vào Request -> Send to Repeater Bước 3: Vào Repeater -> Send, có được Respond. Bước 4: Tìm trong Respond, mình thấy một đoạn script ![Screenshot 2024-11-07 172710](https://hackmd.io/_uploads/BJ__LMc-1x.png) Mình tìm thấy đường dẫn: `/admin-wus1jw` Bước 5: Truy cập vào `/admin-wus1jw` ![Screenshot 2024-11-07 172954](https://hackmd.io/_uploads/B141wfqZJl.png) Tắt Intercept, sửa link trên trình duyệt thành: https://0adb00e3033dc2cb8056d5ef00f200cf.web-security-academy.net/admin-wus1jw ![Screenshot 2024-11-07 173231](https://hackmd.io/_uploads/SJE8vMc-Jg.png) Bước 6: Xóa người dùng `carlos` ![Screenshot 2024-11-07 173331](https://hackmd.io/_uploads/S1Wqvfc-Jx.png) ## 5. Kiểm soát truy nhập dựa trên tham số Một số ứng dụng xác định quyền truy cập hoặc vai trò của người dùng khi đăng nhập, sau đó lưu trữ thông tin này ở vị trí do người dùng kiểm soát. Có thể là: - Một field ẩn. - Một cookie. - Một tham số chuỗi truy vấn được cài đặt sẵn. Ứng dụng đưa ra quyết định kiểm soát truy cập dựa trên giá trị được gửi. Ví dụ: ``` https://insecure-website.com/login/home.jsp?admin=true https://insecure-website.com/login/home.jsp?role=1 ``` Cách tiếp cận này không an toàn vì người dùng có thể sửa đổi giá trị và truy cập vào chức năng mà họ không được phép, chẳng hạn như chức năng quản trị. ## Lab: Vai trò người dùng được kiểm soát bởi tham số yêu cầu Phòng thí nghiệm này có bảng điều khiển quản trị tại `/admin`, dùng để xác định người quản trị bằng cookie có thể làm giả. Giải quyết bài toán bằng cách truy cập bảng quản trị và sử dụng bảng này để xóa người dùng `carlos`. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau: `wiener:peter` https://0a7100c2040ed4d7be7ca48c000800dd.web-security-academy.net/ Bước 1: Vào My account -> Đăng nhập vào tài khoản được cấp. Bước 2: Kiểm tra trang web -> Application ![Screenshot 2024-11-07 204247](https://hackmd.io/_uploads/BkSQ4Hcbyx.png) Bước 3: Cookie Admin đang có giá trị false, chuột phải chọn Edit "Value" ![Screenshot 2024-11-07 204442](https://hackmd.io/_uploads/SJJs4Sq-yx.png) Sửa giá trị của cookie thành true rồi reload web. Bước 4: Lúc này chúng ta sẽ thấy hiện link truy cập vào Admin panel ![Screenshot 2024-11-07 205224](https://hackmd.io/_uploads/BkSVIHc-yg.png) Truy cập vào Admin panel rồi xóa người dùng `carlos` ![Screenshot 2024-11-07 205443](https://hackmd.io/_uploads/HyPnLBqW1g.png) ## 6. Leo thang đặc quyền theo chiều ngang Sự leo thang đặc quyền theo chiều ngang xảy ra nếu người dùng có thể truy cập vào các tài nguyên thuộc về người dùng khác, thay vì tài nguyên của riêng họ cùng loại. Ví dụ, nếu một nhân viên có thể truy cập vào hồ sơ của các nhân viên khác cũng như của riêng họ, thì đây là sự leo thang đặc quyền theo chiều ngang. Các cuộc tấn công leo thang đặc quyền theo chiều ngang có thể sử dụng các loại phương pháp khai thác tương tự như leo thang đặc quyền theo chiều dọc. Ví dụ, người dùng có thể truy cập trang tài khoản của riêng họ bằng URL sau: ``` https://insecure-website.com/myaccount?id=123 ``` Nếu kẻ tấn công sửa đổi giá trị tham số `id` thành giá trị của người dùng khác, chúng có thể truy cập vào trang tài khoản của người dùng đó cũng như dữ liệu và chức năng liên quan. Đây là ví dụ về lỗ hổng tham chiếu đối tượng trực tiếp không an toàn (IDOR). Loại lỗ hổng này phát sinh khi các giá trị tham số của bộ điều khiển người dùng được sử dụng để truy cập trực tiếp vào tài nguyên hoặc chức năng. Trong một số ứng dụng, tham số có thể khai thác không có giá trị dự đoán được. Ví dụ, thay vì một số tăng dần, một ứng dụng có thể sử dụng mã định danh duy nhất globally (GUID) để xác định người dùng. Điều này có thể ngăn chặn kẻ tấn công đoán hoặc dự đoán mã định danh của người dùng khác. Tuy nhiên, các GUID thuộc về những người dùng khác có thể được tiết lộ ở nơi khác trong ứng dụng nơi người dùng được tham chiếu, chẳng hạn như tin nhắn hoặc đánh giá của người dùng. ## Lab: ID người dùng được kiểm soát bởi tham số yêu cầu, với ID người dùng không thể đoán trước Bài Lab này có lỗ hổng leo thang đặc quyền theo chiều ngang trên trang tài khoản người dùng, nhưng xác định người dùng bằng GUID. Để giải bài lab, hãy tìm GUID cho `carlos`, sau đó gửi khóa API của anh ấy làm giải pháp. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau: `wiener:peter` Bước 1: Vào My account -> Đăng nhập vào tài khoản được cấp. ![Screenshot 2024-11-07 210432](https://hackmd.io/_uploads/HJNVFScWke.png) Có thể thấy link sau khi đăng nhập có đuôi id=..., mình sẽ tấn công vào vị trí này https://0aec00f503a6c20881e489a6001200f1.web-security-academy.net/my-account?id=fff6bb99-663e-49b9-8bf0-a6fb27a75b40 Bước 2: Tìm tài khoản `carlos` Quay trở về Home và xem các bài đăng. Mình tìm được 1 bài đăng được đăng bởi tài khoản `carlos`. ![Screenshot 2024-11-07 210833](https://hackmd.io/_uploads/r1tzqScZyx.png) Bước 3: Bấm vào `carlos`, mình đến được link https://0aec00f503a6c20881e489a6001200f1.web-security-academy.net/blogs?userId=cb969e69-5959-4cef-8b76-b74bdafeec09 ![image](https://hackmd.io/_uploads/rJxq9H5Wye.png) Vậy là đã có được ID của `carlos`. Bước 4: Quay trở về My account, sửa ID của `wiener` thành ID của `carlos` ![Screenshot 2024-11-07 211407](https://hackmd.io/_uploads/SkiSjBqWkg.png) Thành công. Bước 5: Copy API Key của `carlos` rồi Submit solution. ![Screenshot 2024-11-07 211521](https://hackmd.io/_uploads/HJ9ajr9bJl.png) ## 7. Leo thang đặc quyền từ chiều ngang sang chiều dọc Thông thường, một cuộc tấn công leo thang đặc quyền theo chiều ngang có thể biến thành một cuộc leo thang đặc quyền theo chiều dọc, bằng cách xâm phạm một người dùng có đặc quyền cao hơn. Ví dụ, một cuộc leo thang theo chiều ngang có thể cho phép kẻ tấn công đặt lại hoặc lấy được mật khẩu của một người dùng khác. Nếu kẻ tấn công nhắm vào một người dùng quản trị và xâm phạm tài khoản của họ, thì họ có thể giành được quyền truy cập quản trị và do đó thực hiện leo thang đặc quyền theo chiều dọc. Kẻ tấn công có thể truy cập vào trang tài khoản của người dùng khác bằng cách sử dụng kỹ thuật can thiệp tham số đã được mô tả để leo thang đặc quyền theo chiều ngang: ``` https://insecure-website.com/myaccount?id=456 ``` Nếu người dùng mục tiêu là quản trị viên ứng dụng, thì kẻ tấn công sẽ có quyền truy cập vào trang tài khoản quản trị. Trang này có thể tiết lộ mật khẩu của quản trị viên hoặc cung cấp phương tiện để thay đổi mật khẩu hoặc có thể cung cấp quyền truy cập trực tiếp vào chức năng đặc quyền. ## Lab: ID người dùng được kiểm soát bởi tham số yêu cầu với việc tiết lộ mật khẩu Bài lab này có trang tài khoản người dùng chứa mật khẩu hiện tại của người dùng, được điền sẵn theo dạng dữ liệu ẩn. Để giải bài lab, hãy lấy mật khẩu của quản trị viên, sau đó sử dụng mật khẩu đó để xóa người dùng `carlos`. Bạn có thể đăng nhập vào tài khoản của mình bằng thông tin đăng nhập sau: `wiener:peter` Bước 1: Vào My account -> Đăng nhập vào tài khoản được cấp. ![Screenshot 2024-11-07 213041](https://hackmd.io/_uploads/Byr7yLcbJe.png) Bước 2: Có thể thấy mật khẩu bị ẩn đi. Xem nguồn trang. Ctrl + F, tìm password. ![Screenshot 2024-11-07 213443](https://hackmd.io/_uploads/rkkQeUcZ1e.png) Mật khẩu hiển thị trên web bị ẩn nhưng lại được hiện trong source. Bước 3: Leo thang đặc quyền theo chiều ngang Có thể thấy link trang đăng nhập có đuôi `id = wiener`: https://0a920073038d408b81cd4864003900ec.web-security-academy.net/my-account?id=wiener Mình sẽ tấn công vào đây. Đổi id thành carlos, sau đó xem nguồn trang. ![Screenshot 2024-11-07 213724](https://hackmd.io/_uploads/S1eplI9Zke.png) Leo thang đặc quyền theo chiều ngang thành công, đăng nhập vào tài khoản `carlos` và lấy được mật khẩu của `carlos` Bước 4: Leo thang đặc quyền theo chiều dọc Đổi id thành admin ![Screenshot 2024-11-07 214055](https://hackmd.io/_uploads/Bkg9WU9bye.png) Quay trở lại trang login, không thành công Đổi id thành administrator ![Screenshot 2024-11-07 214231](https://hackmd.io/_uploads/Bk_ZfLq-kg.png) ![Screenshot 2024-11-07 214257](https://hackmd.io/_uploads/SklGzUc-kg.png) Đăng nhập thành công và lấy được mật khẩu Bước 5: Đăng nhập vào tài khoản admin với username: `administrator` và mật khẩu: `61caoaz84wjm06d323xn` ![Screenshot 2024-11-07 214438](https://hackmd.io/_uploads/BJH47UqWyx.png) Bước 6: Vào Admin panel và xóa người dùng `carlos`