# ACCESS CONTROL WRITE UP --- ###### tags: `PortSwigger` `Writeup` ## 1. Lab: Unprotected admin functionality ![](https://hackmd.io/_uploads/rJYcYTm5n.png) - Trang web này không bảo vệ trang admin panel, để solve được lab em cần phải xóa user carlos - Đầu tiên em thử vào trỏ đến trang admin, nhưng kết quả không như mong đợi ![](https://hackmd.io/_uploads/rk3B967c2.png) - Sau đó em thử trỏ đến trang robots.txt, nó cho trình thu thập dữ liệu của công cụ tìm kiếm biết có thể truy cập vào những URL nào trên trang web, khi tiến vào em đã thấy một điều thú vị: ![](https://hackmd.io/_uploads/BJMGo6mqh.png) - Trang web disallow trang này để công cụ tìm kiếm không coi nó là một trang công khai, khi em trỏ đến đó thì em đã vào được admin panel: ![](https://hackmd.io/_uploads/B1hBjTXch.png) - Giờ chỉ cần xóa carlos là em đã solve được lab ![](https://hackmd.io/_uploads/S1WvjpX9n.png) ## 2. Lab: Unprotected admin functionality with unpredictable URL ![](https://hackmd.io/_uploads/BkkAjpQq3.png) - Lab này có trang admin panel không được bảo vệ kĩ càng, nó nằm ở một địa chỉ không thể đoán được, nhưng địa chỉ lại được tiết lộ ở đâu đó trong trang web - Để solve được lab em cần vào trang admin panel, và dùng nó để xóa user carlos. - Em đã thử vào phần login và F12 để xem source, thì bất ngờ là nó có chứa đoạn code kiểm tra admin: ![](https://hackmd.io/_uploads/S1tj2am9h.png) ```js!= var isAdmin = false; if (isAdmin) { var topLinksTag = document.getElementsByClassName("top-links")[0]; var adminPanelTag = document.createElement('a'); adminPanelTag.setAttribute('href', '/admin-7xjte3'); adminPanelTag.innerText = 'Admin panel'; topLinksTag.append(adminPanelTag); var pTag = document.createElement('p'); pTag.innerText = '|'; topLinksTag.appendChild(pTag); } ``` - Hàm này sẽ check xem em có phải admin không, nếu có thì sẽ chuyển hướng đến '/admin-7xjte3', và hiện ra là 'Admin panel', nên em đã biết được đường dẫn đến với admin panel là /admin-7xjte3 ![](https://hackmd.io/_uploads/SypG6TQ53.png) - Vào được trang admin, em xóa user carlos và hoàn thành lab ![](https://hackmd.io/_uploads/H1EV66Xcn.png) ## 3. Lab: User role controlled by request parameter ![](https://hackmd.io/_uploads/SyxE0pXqh.png) - Lab này có chứa trang admin panel ở địa chỉ `/admin`, nó sẽ quyết định ai là administrator thông qua 1 cái cookie có thể chỉnh sửa được, solve lab bằng cách xóa user carlos - Em được cấp tài khoản của mình là wiener:peter - Sau khi đăng nhập vào tài khoản của mình, em F12 lên để xem cookie của bản thân và thấy thuộc tính admin có value là false, nên em đã nghĩ đến việc chỉnh nó về là true để trở thành admin: ![](https://hackmd.io/_uploads/HJsayAQq3.png) - Quả đúng như vậy, sau khi chỉnh thành "true" thì trang web đã có ngay phần admin panel cho em chọn: ![](https://hackmd.io/_uploads/S1RWgRX93.png) - Xóa carlos và em đã hoàn thành lab ![](https://hackmd.io/_uploads/SkcXeRQ92.png) ## 4. Lab: User role can be modified in user profile ![](https://hackmd.io/_uploads/HJSqgAQ9h.png) - Lab này có chứa admin panel ở địa chỉ `/admin`, nó chỉ có thể truy cập được nếu user có `roleid` là 2, solve lab bằng cách truy cập vào được admin panel và xóa user carlos. Em được cấp tài khoản của bản thân là wiener:peter - Đầu tiên em đã thử thay đổi ở phần login là gửi thêm `&roleid=2`, phần home là thêm biến `?roleid=2` nhưng không được gì cả - Nhưng khi em đổi thử email thì có chuyện rất hay xảy ra: ![](https://hackmd.io/_uploads/HJFQN07cn.png) - Khi update email server trả về file JSON có chứa roleid cùng với username, email và apikey - Giờ em cần phải làm sao để thay đổi được roleid ở file này là được, vì em gửi email lên cũng theo file JSON nên em đã nghĩ ra mình sẽ thêm thằng roleid vào file JSON gửi đi để thay đổi kết quả trả về: ![](https://hackmd.io/_uploads/ryI6NR7c2.png) - Em đã đoán đúng, việc gửi thêm "roleid":2 đã thay đổi kết quả trả về, giờ em sẽ vào trang web và vào admin panel để xóa user carlos ![](https://hackmd.io/_uploads/HkigH0Xch.png) - Xóa carlos, em đã solve được lab ![](https://hackmd.io/_uploads/r1RZrRXch.png) ## 5. Lab: URL-based access control can be circumvented ![](https://hackmd.io/_uploads/ByF6HR7q2.png) - Trang web này có chứa trang admin chưa được xác thực ở địa chỉ `/admin`, nhưng phần font-end đã được cấu hình để chặn những cách tiếp cận đến đường dẫn đó. Nhưng phần back-end đã sử dụng framework mà hỗ trợ tính năng `X-Original-URL`, để solve lab thì em cần phải xóa user carlos. - Đầu tiên, em đi tìm hiểu và biết được X-Original-URL là một tính năng dùng để ghi đè đường dẫn URL nhằm qua mặt các giới hạn truy cập và khiến hệ thống mục tiêu hiển thị một URL khác. Mình sẽ sử dụng nó vào phần header để thay đổi giá trị URL - Vừa vào thì em thấy ngay admin panel ở trang chủ nên đã ấn vào thử, nhưng mà kết quả không giòn vì nó đã bị chặn: ![](https://hackmd.io/_uploads/Sk0J_Am93.png) - Sử dụng tính năng trên, em đã đưa trang web vào BurpSuite để chỉnh sửa header của request: ![](https://hackmd.io/_uploads/rJIowAmc3.png) - Bằng cách thêm vào header thuộc tính: `X-Original-Url: /admin`, em đã thành công bypass được vào trang admin panel mà không bị denied - Sau đó tiếp tục sử dụng tính năng trên, xóa user carlos bằng thuộc tính: `X-Original-Url: /admin/delete?username=carlos` ![](https://hackmd.io/_uploads/rkB-tCX93.png) - Tuy nhiên nó đã không thành công, trang web báo về em thiếu tham số 'username', nên em đã thử đưa tham số này lên URL gốc và hoàn thành được lab ![](https://hackmd.io/_uploads/r10CuAmqn.png) ![](https://hackmd.io/_uploads/HyzwKAQcn.png) ## 6. Lab: Method-based access control can be circumvented ![](https://hackmd.io/_uploads/BJA3K07qh.png) - Lab này thực thi quyền access control dựa một phần vào phương thức HTTP của requests. Ta có thể làm quen với admin panel bằng tài khoản `administrator:admin`. Để solve lab, em cần đăng nhập vào tài khoản `wiener:peter` và khai thác lỗ hổng access control để thăng cấp tài khoản này thành một administrator. - Nói sơ qua về chức năng của thằng administrator này, khi đăng nhập vào sẽ có trang admin panel, và trong đó ta có chức năng thăng cấp(upgrade) và giáng cấp(downgrade) cho user ![](https://hackmd.io/_uploads/rJorwZHqn.png) ![](https://hackmd.io/_uploads/SkrkuWr92.png) - Đây là http request cho việc thăng cấp tài khoản carlos lên làm admin, giờ em phải làm sao để sử dụng tài khoản wiener để tự thăng cấp cho mình lên làm admin - Đầu tiên em đã thử sử dụng chức năng `X-Original-URL:` để chèn thêm nhằm bypass URL nhưng không thành công ![](https://hackmd.io/_uploads/B1-eF-Sq2.png) - Sau đó với em đã thử dùng request lúc upgrade user ở admin, nhưng em thay session của tài khoản em vào: ![](https://hackmd.io/_uploads/BJU8F-rcn.png) - Vẫn không giòn, trang web trả về kết quả chưa được xác thực, nên em nghĩ em cần một HTTP Method khác, và trong quá trình tìm hiểu, em đã tìm được link này: [Bypass Access Control](https://github.com/Tikam02/Security-Guide/blob/master/WebDev-Sec/access-controls.md), có một đoạn làm em chú ý: ![](https://hackmd.io/_uploads/By3nYZr53.png) - Em đã thử làm theo trang web và đúng như trang web nói, response trả về là "Missing parameter 'username'" ![](https://hackmd.io/_uploads/HJhJ9brq2.png) - Vì báo là thiếu tham số, nên em đã chuột phải vào request, chọn `Change request method` để đưa request về một HTTP GET request: ![](https://hackmd.io/_uploads/Hk-z5ZHc2.png) - Kết quả là 302 FOUND, chứng tỏ em đã upgrade user wiener thành công: ![](https://hackmd.io/_uploads/B1tv9bBq3.png) - Vào lại trang admin thì em thấy tài khoản wiener đã được lên làm admin và em đã solve được lab: ![](https://hackmd.io/_uploads/HkMi5ZSqh.png) ## 7. Lab: User ID controlled by request parameter ![](https://hackmd.io/_uploads/SyJnhbS9h.png) - Lab này có chứa lỗ hổng leo quyền ngang hàng dựa vào trang user account, để solve lab này em cần phải lấy được API key từ user carlos và nộp nó. - Em được cấp tài khoản của chính mình là `wiener:peter` - Sau khi truy cập vào trang web, ở trang account hiện API key của bản thân em: ![](https://hackmd.io/_uploads/rkxH0bHc2.png) - Để ý thì em thấy URL phân loại id theo tên là `id=wiener`, nên em đã thử thay bằng `carlos` xem sao, và woa la nó thành công ![](https://hackmd.io/_uploads/SkXu0-r92.png) - Vậy API key của carlos là: 6IVtQDK4Mt19P7zerjoMzexZwIOcN3vU, nộp nó và em đã solve được lab ![](https://hackmd.io/_uploads/ByNcAZHq3.png) ## 8. Lab: User ID controlled by request parameter, with unpredictable user IDs ![](https://hackmd.io/_uploads/BJaw1MS93.png) - Lab này có chứa lỗ hông leo thang đặc quyền ngang hàng ở trang user account, nhưng trang web nhận dạng user bằng GUIDs. Để solve lab em cần tìm GUID của user `carlos`, và submit API của carlos - Em được cấp tài khoản của bản thân là: `wiener:peter` - Sau khi đăng nhập vào, em đã để ý rằng id của bản thân giờ không đơn giản là 1,2 hay là tên nữa, mà nó là 1 loạt kí tự mà mình không đoán được ![](https://hackmd.io/_uploads/S1LJzfr52.png) - Em đưa trang web vào BurpSuite để xem xét kĩ hơn, và tính năng xem bài viết khá hay, em đã ấn vào bài viết thứ 2 và nó là bài của carlos viết ![](https://hackmd.io/_uploads/Hkb4fMB52.png) - Em để ý carlos có thể click vào được và em đã tìm được GUID của carlos vì nó đã lộ ở trên URL: ![](https://hackmd.io/_uploads/S1qLGMrc2.png) - Sử dụng userID đó, em đã vào được trang account của carlos ![](https://hackmd.io/_uploads/SymqfGBc3.png) - Mọi thứ đã xong xuôi, nộp API key là `NjLAhR0xPdemWtfNtP5MItf03HvvpcJe` và em đã hoàn thành được lab này: ![](https://hackmd.io/_uploads/rJwJ7GBch.png) ## 9. Lab: User ID controlled by request parameter with data leakage in redirect ![](https://hackmd.io/_uploads/By477fB9n.png) - Lab này có chứa lỗ hổng access control khi mà nhưng thông tin nhạy cảm bị lộ ở phần body của một redirect response. Để solve lab này em cần lấy được API key của user `carlos` - Em được cấp tài khoản của bản thân là `wiener:peter` ![](https://hackmd.io/_uploads/rJOl_GSqh.png) - Quan sát thấy id=wiener, em đã sửa thành carlos xem có lấy được luôn API Key không, nhưng quá buồn là enter phát nó bay cho em một phát về tragn login, nên em đã đưa vào BurpSuite để sửa request xem sao - Quá bất ngờ, em sửa phát ăn ngay và có được API Key của carlos, trang web đã sai khi để lộ thông tin trong quá trình redirect. ![](https://hackmd.io/_uploads/SJCD_MB92.png) - Trang web đã thực hiện URL trên rồi mới chuyển sang trang login nên em mới lấy được API key như thế này, nộp solution `e6BnKfpsx1ycplahih1ZznadFu2AlIur` và em đã hoàn thành lab: ![](https://hackmd.io/_uploads/rkkn_GHc2.png) ## 10. Lab: User ID controlled by request parameter with password disclosure ![](https://hackmd.io/_uploads/r1keRDUq2.png) - Lab này có chứa trang user account có chứa mật khẩu của người dùng hiện tại, và đã được quy định khuôn đã được điền trước, để solve lab thì em cần lấy được mật khẩu của administrator, và dùng nó để xóa tài khoản carlos - Em được cấp tài khoản của bản thân là `wiener:peter` - Sau khi đăng nhập vào tài khoản, em để ý rằng mật khẩu đã để ở dạng `...` để mình không nhìn thấy được, nên em đã bật F12 lên và trong thẻ HTML đã có ngay giá trị của password ![](https://hackmd.io/_uploads/r1jNgOUq3.png) - Ở đây ta có thể nhìn rõ thấy giá trị của mật khẩu là peter, nghi ngờ trang web administrator cũng hoạt động tương tự, em đổi giá trị của tham số `id` trên URL thành `id=administrator` ![](https://hackmd.io/_uploads/H1BtguUch.png) - Quá hay, em đã có được mật khẩu của administrator là `na36vris9r1l4k785awb` bằng nút F12=)), giờ chỉ cần đăng nhập vào xóa cho carlos bay màu thôi. ![](https://hackmd.io/_uploads/Hkh6e_L9h.png) ## 11. Lab: Insecure direct object references ![](https://hackmd.io/_uploads/ryceG_U5h.png) - Lab này trữ log chat của người dùng ở trong file hệ thống, và lấy nó bằng cách đường URL tĩnh. Để solve lab em cần tìm password của user `carlos` và đăng nhập vào nick họ - Đầu tiên em đã vào và thử chức năng, chức năng view script cho ta tải về đoạn hội thoại và nếu họ nhập thêm 1 tin nhắn thì số thứ tự file sẽ tăng lên, vì khi lần đầu em ấn tải nó bắt đầu bằng 2.txt ![](https://hackmd.io/_uploads/B14NrdIqh.png) - Nên em đưa vào BurpSuite để xem, đồng thời em đã tải về 1 transcript chat log(lúc này là 6.txt) để quan sát Http History: ![](https://hackmd.io/_uploads/Bk6wS_Ich.png) - Sau khi download thành công thì trang web đã hiện ra request GET thằng 6.txt này, chứng tỏ trang web lưu thứ này ở trong thư mục `/download-transcript`, em đưa tab này sang Repeater nhằm sửa request thành 1.txt (vì lần đầu em tải bắt đầu từ 2.txt) để xem và nó hiện ra cuộc hội thoại chứa mật khẩu của người dùng: ![](https://hackmd.io/_uploads/ByZ0ruU5h.png) - Như vậy, mật khẩu của `carlos` là `ax3dhxmns5o0687syuap`, đăng nhập vào và em đã hoàn thành lab này. ![](https://hackmd.io/_uploads/rJF-UOLq2.png) ## 12. Lab: Multi-step process with no access control on one step ![](https://hackmd.io/_uploads/rkTPUu8c2.png) - Lab này có chứa một admin panel và ta có thể thay đổi vai trò của người dùng bằng một chuỗi hành động, ta có thể làm quen với admin panel bằng tài khoản `administrator:admin`. Để solve lab, đăng nhập với tài khoản `wiener:peter` và khai thác lỗ hổng access control để thăng cấp chính mình lên làm administrator - Đầu tiên, khi vào trang admin panel, nó sẽ cho phép mình upgrade(thăng cấp) hoặc downgrade(giáng cấp) người dùng, và khi em bấm vào nó sẽ hiện ra em có chắc chắn hay không ![](https://hackmd.io/_uploads/HkTz1tI5n.png) - Nếu em ấn yes thì nó sẽ forward về trang admin panel cùng với kết quả, còn nếu chọn No, take me back thì nó sẽ đưa em về trang cũ - Vậy là một quy trình thay đổi vai trò của người dùng bao gồm: + Vào trang admin + Thay đổi + Đồng ý thay đổi - Thay vì làm ở 2 bước đầu, em đã nghĩ là mình sẽ làm từ bước thứ 3, khi đó server sẽ không phát hiện ra và nghĩ rằng em là admin thì mới đến được bước `Are you sure` này - Em đưa trang web vào repeater để xem được request ở bước 3 này trông như thế nào ![](https://hackmd.io/_uploads/ryJExYIqn.png) ![](https://hackmd.io/_uploads/BJ21lKL9h.png) - Như mọi người có thể thấy, có tận 2 lần POST cho 1 lần thay đổi role cho user, nên ở bước 3 này họ thêm phần **confirmed=true** ở body, nên em đưa tab này sang Repeater để thay đổi request. - Tiếp đến là em sẽ vào bằng tài khoản wiener để lấy session sau đó ốp session vào tab thay đổi role cho người dùng, đồng thời chỉnh lại action và username sao cho đúng: ![](https://hackmd.io/_uploads/HJePeKLqn.png) - Kết quả trả về là 302, chứng tỏ em đã đưa bản thân lên làm admin thành công, vào lại trang để check: ![](https://hackmd.io/_uploads/B112xKL92.png) - Vậy là em đã solve được lab này :heavy_check_mark: :heavy_check_mark: ## 13. Lab: Referer-based access control ![](https://hackmd.io/_uploads/SyKNbtIqh.png) - Lab trên kiểm soát cách truy cập đến admin dựa theo chức năng Referer của header. Em có thể làm quen với thằng admin panel này bằng tài khoản `administrator:admin`. Để solve lab thì em cần đăng nhập vào với tài khoản `wiener:peter` và khai thác lỗ hổng access control để đưa bản thân lên làm một administrator - Đầu tiên em sẽ vào trang web và sử dụng chức năng upgrade để xem xét việc thăng cấp vào giáng cấp user hoạt động như thế nào - Sau khi đưa vào BurpSuite em nhận thấy trang web không sử dụng POST nữa, mà sử dụng GET đồng thời đưa tham số lên URL để gửi, kèm với cả chức năng Referer đến trang admin: ![](https://hackmd.io/_uploads/Syvnfcv5n.png) - Chức năng này làm em nghĩ đến việc trang web có thể chỉ quan tâm đến chức năng Referer của header có admin hay không chứ không hề check ai có khả năng vào được đường link này, nên em đã vào bằng tài khoản wiener của chính mình để lấy session: ![](https://hackmd.io/_uploads/BJKMQ5v5n.png) - Với session của user hiện tại là: `hXJzmOTOTdjXl6LYXwCy1h5X0CnakgCc`, em đưa tab upgrade user role vào Repeater, rồi thay session của user em vào, đồng thời chỉnh sửa lại username: ![](https://hackmd.io/_uploads/HJBUQqvq3.png) - Status 302 nghĩa là em đã thăng cấp thành công cho user `wiener` lên làm administrator, đồng thời em đã solve được lab trên: ![](https://hackmd.io/_uploads/S1NY7cDqn.png)