# Setup môi trường - crAPI - Tải file `https://github.com/OWASP/crAPI/archive/refs/heads/develop.zip` về và giải nén - `cd crAPI-develop/deploy/docker` - `docker-compose pull` - `docker-compose -f docker-compose.yml --compatibility up -d` Access: http://localhost:8888 - Đối với các lỗ hổng IDOR hoặc Broken Access Control, cần tạo 2 tài khoản để test. # 1. Broken Object Level Authorization (BOLA) Vulnerabilities ## Challenge 1 - Access details of another user’s vehicle Khi Refresh Location, web lấy vị trí theo cardId, cardId này được truyền vào URL ![image](https://hackmd.io/_uploads/rk_WNxiYke.png) Ở Community chứa các bài đăng của user, khi GET thì ta có được cardId ![image](https://hackmd.io/_uploads/rJzQNgit1e.png) Thay đổi cardId, vậy là có thể xem được thông tin của user khác ![image](https://hackmd.io/_uploads/BkIVNxot1g.png) ## Challenge 2 - Access mechanic reports of other users Ở chức năng Contact Mechanic, khi gửi request đi ta nhận được reponse là 1 link report, link này chứa report_id trên URL ![image](https://hackmd.io/_uploads/ByZukxsKkl.png) Mỗi 1 report được gửi đi id sẽ tăng lên 1 ![image](https://hackmd.io/_uploads/S1ItJgiKyx.png) Chỉ cần thay đổi report_id là ta có thể truy cập vào báo cáo của người dùng khác ![image](https://hackmd.io/_uploads/S1JpygjF1e.png) ![image](https://hackmd.io/_uploads/HJhaJesKJx.png) # 2. Broken User Authentication ## Challenge 3 - Reset the password of a different user Chức năng reset password ![image](https://hackmd.io/_uploads/ByHehljKyl.png) Sau khi nhập email thì mã OTP sẽ được gửi về địa chỉ email đó, mã này gồm 4 chữ số ![image](https://hackmd.io/_uploads/Syc-3gjK1l.png) Mật khẩu mới sẽ được gửi đi kèm với OTP vừa nhận được. Vậy ta có thể brute force OTP này để reset password của user khác. ![image](https://hackmd.io/_uploads/HJ__hgsFJx.png) Request `Set Password` tương ứng ![image](https://hackmd.io/_uploads/Hk72hgsFke.png) Giờ thử với email của user khác ![image](https://hackmd.io/_uploads/Sy6z6esKkg.png) Ta sẽ brute force OTP ![image](https://hackmd.io/_uploads/S1B86eitJx.png) Tuy nhiên thì ở API đã bị rate limit ![image](https://hackmd.io/_uploads/H10-ReiYyx.png) Mà ở đề có nói > If you face any protection mechanisms, remember to leverage the predictable nature of REST APIs to find more similar API endpoints. Đổi thử sang v2 thì oke ![image](https://hackmd.io/_uploads/Bk9eSQntke.png) ![image](https://hackmd.io/_uploads/S1UDBXhFJl.png) # 3. Excessive Data Exposure ## Challenge 4 - Find an API endpoint that leaks sensitive information of other users Community ![image](https://hackmd.io/_uploads/SyWVPXnY1l.png) ## Challenge 5 - Find an API endpoint that leaks an internal property of a video Khi upload 1 video, các thuộc tính nội bộ của nó được hiển thị trong response ![image](https://hackmd.io/_uploads/Bk8lCX2YJx.png) ![image](https://hackmd.io/_uploads/rJJaa73t1g.png) # 4. Rate Limiting ## Challenge 6 - Perform a layer 7 DoS using 'contact mechanic' feature Request chức năng Contact Mechanic, ta thấy có 2 giá trị `"repeat_request_if_failed":false` và `"number_of_repeats":1` ![image](https://hackmd.io/_uploads/S1iMmEhtJg.png) Thay đổi chúng để gửi nhiều request đến server ![image](https://hackmd.io/_uploads/ryGgEEhF1g.png) # 5. Broken Function Level Authorization (BFLA) ## Challenge 7 - Delete a video of another user Chức năng thay đổi tên video ![image](https://hackmd.io/_uploads/H1z3NN3FJg.png) Sử dụng method OPTIONS để xem server cho phép ta sử dụng các method nào ![image](https://hackmd.io/_uploads/r1Gs442Yyg.png) Server yêu cầu phải là admin mới được xóa Thay đổi endpoint thành admin thì thành công ![image](https://hackmd.io/_uploads/ryxirN3Ykx.png) ![image](https://hackmd.io/_uploads/B1FpHEnFkg.png) ![image](https://hackmd.io/_uploads/SyA7L42Ykl.png) # 6. Mass Assignment ## Challenge 8 - Get an item for free Chức năng đặt hàng ![image](https://hackmd.io/_uploads/Syauj43Kke.png) Sau khi đặt xong có thể xem thông tin đơn hàng ![image](https://hackmd.io/_uploads/BkghiNntye.png) Response trả về chứa trạng thái của đơn hàng: `delivered`, và cho phép sử dụng method PUT. ![image](https://hackmd.io/_uploads/H1yQnNhFye.png) Vậy ta sẽ sửa trạng thái của order bằng PUT ![image](https://hackmd.io/_uploads/rk7QnEnKkl.png) Response trả về gợi ý về giá trị `status`, chỉ cần sửa thành `returned` là ta đã mua hàng free thành công ![image](https://hackmd.io/_uploads/HkAVhN3Ykl.png) ![image](https://hackmd.io/_uploads/By6Y34nK1l.png) ## Challenge 9 - Increase your balance by $1,000 or more Tương tự chall 8, nhưng cần hoàn tiền với số tiền lớn hơn. Ở đây, ta thử tăng giá sản phẩm lên thì không thành công ![image](https://hackmd.io/_uploads/SkSxRNnYJx.png) Vậy thì tăng số lượng vật phẩm thì sao ![image](https://hackmd.io/_uploads/rJ6MkB2Kyx.png) ![image](https://hackmd.io/_uploads/SyIb1H2FJg.png) ## Challenge 10 - Update internal video properties Khi thay đổi tên video thì có request sau ![image](https://hackmd.io/_uploads/SkFdJrnYJe.png) Thay đổi các giá trị thành công ![image](https://hackmd.io/_uploads/Hy0TJShYJl.png) # 7. SSRF ## Challenge 11 - Make crAPI send an HTTP call to "www.google.com" and return the HTTP response. Ở chức năng Contact Mechanic, request gửi đi có chứa url và nhận phản hồi từ url đó ![image](https://hackmd.io/_uploads/H15QZr2FJg.png) Nên ta chỉ cần thay thế thành www.google.com ![image](https://hackmd.io/_uploads/B13YbrhtJl.png) # 8. NoSQL ## Challenge 12 - Find a way to get free coupons without knowing the coupon code. Khi request 1 coupon code không hợp lệ ta sẽ nhận được lỗi 500 ![image](https://hackmd.io/_uploads/HJRSmrnYkx.png) Dữ liệu gửi lên ở dạng JSON nên ta sẽ chèn toán tử truy vấn: lấy các coupon code không phải invalid trong db ![image](https://hackmd.io/_uploads/HJWBQH2YJe.png) Phản hồi thành công ![image](https://hackmd.io/_uploads/rkXEXB3K1e.png) # Reference https://github.com/OWASP/crAPI https://owasp.org/www-project-crapi/ https://www.youtube.com/playlist?list=PL-DxAN1jsRa-BzhRSBWCVEa9g4BBTBJ1Y https://medium.com/@riteshs4hu/owasp-crapi-walkthrough-baec54214f85