---
# System prepended metadata

title: NoSQL Injection
tags: [PortSwigger, Writeup]

---

# 1. Lab: Detecting NoSQL injection
![image](https://hackmd.io/_uploads/B13dDxdUa.png)
- Lab phân loại và tìm kiếm category bằng mongodb, để solve lab thì mình cần khiến cho trang web hiển thị tất cả sản phẩm, kể cả những sản phẩm chưa được ra mắt
![image](https://hackmd.io/_uploads/r1juFxu8a.png)
- Phần lý thuyết đã giải thích khá kĩ cách làm tạo ra điều kiện `or 1=1` như của sql. Thì ở NoSQL mình sẽ sử dụng `'||1||'`, câu query sẽ tương đương với `'||'1'=='1'`
![image](https://hackmd.io/_uploads/HkotKgd8a.png)
- Ngoài cách trên thì mình cũng có thể dùng `'%00` (nullbyte) để loại bỏ điều kiện ở đằng sau
- Solved :heavy_check_mark: 
![image](https://hackmd.io/_uploads/Sk_vtedLa.png)

# 2. Lab: Exploiting NoSQL operator injection to bypass authentication
![image](https://hackmd.io/_uploads/H1NEqxd8a.png)
Tính năng đăng nhập được thực hiện bởi MongoDb, để solve lab thì mình cần đăng nhập vào user admin
Đăng nhập vào thì mình thấy họ đẩy qua post body, mình thử đổi mật khẩu và sử dụng operator `$ne` để bypass login thì thấy thành công:
![image](https://hackmd.io/_uploads/H15-jgOLT.png)
Mình chuyển ngay sang username administrator, nhưng đời không như là mơ
![image](https://hackmd.io/_uploads/rJJPsgu8p.png)
Bypass được tài khoản wiener, mình chuyển sang nghĩ rằng tên user administrator không tồn tại, nên mình sẽ thử xài `$in` để chèn mảng vào để xem sao
![image](https://hackmd.io/_uploads/S1Ga6e_UT.png)
Thử một hồi mảng không được, mình thử sang regex thì ăn ngay :>, hehe
```json!
{"username":{"$regex":"ad"},"password":{"$ne":"lmao"}}
```
![image](https://hackmd.io/_uploads/rk4d6lOIT.png)
Để tên admin như này sao mà đỡ được :rolling_on_the_floor_laughing:, solved
![image](https://hackmd.io/_uploads/H1KM0l_L6.png)

# 3. Lab: Exploiting NoSQL injection to extract data
![image](https://hackmd.io/_uploads/rknDlZOLa.png)
Trong burp history lúc đăng nhập có tab này, website tìm kiếm user trước rồi mới vào my-account, mình sẽ lợi dụng entrypoint này để leak thông tin admin
![image](https://hackmd.io/_uploads/BJhzbb_8T.png)
Mình biết được username là administrator
![image](https://hackmd.io/_uploads/SJylG-dLp.png)
Bruteforce lấy mật khẩu thui
![image](https://hackmd.io/_uploads/Bk0wmWuLp.png)
Nếu như không thành công thì câu query sẽ không tìm thấy user, mình thử độ dài của pasword là 30 thì có kết quả:
![image](https://hackmd.io/_uploads/ry1iXWOUT.png)
Mật khẩu của admin là: `hnkqksxd`
Solved :heavy_check_mark: 
![image](https://hackmd.io/_uploads/S1kwXZOU6.png)

# 4. Lab: Exploiting NoSQL operator injection to extract unknown fields
![image](https://hackmd.io/_uploads/rJUpVZuUa.png)
- Lab hint rằng để solve lab thì phải lấy được reset token của carlos trước, nên mình sẽ đi tìm nó
- Ban đầu khi nói đến việc lấy reset password token, thì mình cứ nghĩ rằng mình sẽ có 1 email server nhưng không, không có gì cả, mình cũng không có tài khoản mặc định wiener:peter, nên mình chưa hiểu sẽ lấy tài khoản kiểu gì
Khi mình thử nosql injection vào login thì không có gì
![image](https://hackmd.io/_uploads/S1xbsmuLp.png)
Mình cứ ngỡ là không bị dính, nhưng khi thêm operator $where thì nó lại dính, nên mình quyết định đi tìm tên các cột dựa vào việc trigger ở operator $where
![image](https://hackmd.io/_uploads/S1TKuX_Ia.png)
Mình đoán cột 1 là id và thử thì ra response là account locked, chứng tỏ là câu quyery đã được thực thi
![image](https://hackmd.io/_uploads/ry4iOmO8T.png)
- Cứ như vậy mình bruteforce được 4 bảng, bảng thứ 4 nghe có vẻ dùng để khai thác lấy reset token
```
id
username
password
pwResetTkn
```
![image](https://hackmd.io/_uploads/HJxIOQdUp.png)
- Mình sẽ đi bruteforce lấy giá trị reset token trong db
![image](https://hackmd.io/_uploads/rJHvtm_8T.png)
- Kết quả: `9ce05bd2c09bdfad`
![image](https://hackmd.io/_uploads/rJF8FXd8p.png)
- Sau đó mình không thể tìm thấy được endpoint nào sử dụng cái này, cuối cùng mình mới biết nó ở `/forgot-password?pwResetTkn=9ce05bd2c09bdfad` (pha này chịu mình không đoán được)
![image](https://hackmd.io/_uploads/B1slqmO86.png)
- Solved :heavy_check_mark: 
![image](https://hackmd.io/_uploads/H1kN5muUT.png)
