# Exploiting NoSQL operator injection to extract unknown fields * Yêu cầu của bài lab là chúng ta khai thác lỗ hổng NoSQLi để trích xuất từ những trường không nhìn thấy được và login vào account của user `carlos`. Đầu tiên ta login bằng một account tùy ý để lấy request trong Proxy. ![Capture01](https://hackmd.io/_uploads/SJ6hDWOwT.png) ![Capture02](https://hackmd.io/_uploads/B162v-uvT.png) * Ta dùng payload `"password":{"$ne":"invalid"}` để login vào user `wierner` thì thành công. ![Capture03](https://hackmd.io/_uploads/Bka2vWOvp.png) * Nhưng dùng cho user `carlos` thì chúng ta lại nhận được response là "Account locked: please reset password". ![Capture04](https://hackmd.io/_uploads/B1phDW_wp.png) * Vì nhận được thông báo trên nên chúng ta sẽ gửi request `POST /forgot-password` của user `carlos`. Giờ ta phải tìm token reset password để đổi password của user `carlos`. ![Capture05](https://hackmd.io/_uploads/r1TnPb_Pa.png) * Chúng ta phải tìm được trường chứa token reset password trong database. Sử dụng `$where` và thử lần lượt với '0' và '1', chúng ta sẽ thấy khi `"$where":"0"` thì kết quả là "Invalid username or password" nhưng khi `"$where":"1"` thì nó trả về "Account locked" như lúc nãy. ![Capture06](https://hackmd.io/_uploads/S1a3vW_Da.png) ![Capture07](https://hackmd.io/_uploads/S163vWdva.png) * Sau khi xác định được vị trí các trường thì chúng ta sẽ đi tìm tên trường đó. Gửi request qua Intruder, thêm vào `"$where":"Object.keys(this)[1].match('^.{$$}$$.*')"` để tìm tên trường, payload đầu tiên là các số từ 0 đến 20, payload thứ hai là gồm các kí tự thường, in hoa với số. ![Capture08](https://hackmd.io/_uploads/HkTnPbOP6.png) * Kết quả trả về thì ta được trường `username`. ![Capture09](https://hackmd.io/_uploads/HJT3wb_DT.png) * Tăng vị trí từ 1 lên 2. Sau khi tấn công chúng ta được trường `password`. ![Capture10](https://hackmd.io/_uploads/S1p2vZ_wp.png) * Tăng vị trí lên 3. Sau khi tấn công, chúng ta được một trường mới là `pwResetTkn`. Đây có thể là trường chứa token reset password. ![Capture11](https://hackmd.io/_uploads/rJgT2DZOP6.png) * Ta thêm trường này vào request `GET /forgot-password`, cho giá trị là tùy ý. Sau khi gửi chúng ta sẽ nhận được response là "Invalid token", vậy đúng là trường chứa token reset pasword. ![Capture12](https://hackmd.io/_uploads/BJxp3DW_Dp.png) * Giờ chúng ta sẽ phải đi tìm token đó, sử dụng payload `"$where":"this.pwResetTkn.match('^.{$$}$$.*')"`, payload đầu tiên là các số từ 0 đến 20, payload thứ hai là gồm các kí tự thường, in hoa với số. ![Capture13](https://hackmd.io/_uploads/rJ62P-dv6.png) * Sau khi tấn công, chúng ta đã tìm được token gồm 16 kí tự. ![Capture14](https://hackmd.io/_uploads/Bka3Db_P6.png) * Thay token vừa tìm được vào request `GET /forgot-password?pwResetTkn=...` và gửi. Chúng ta đã nhận được response chứa form đổi password. ![Capture15](https://hackmd.io/_uploads/SkT2vWOv6.png) * Đổi password và login vào user `carlos`. Hoàn thành bài lab. ![Capture16](https://hackmd.io/_uploads/r163Dbuwp.png)