– Tiếp đến là có một hàm isAdmin, ở câu Query đặt ? để chèn các tham số vào. Nên không thể Sqli ở đây. – Ngược lại thì hàm Register lại sử dụng câu Query nối chuỗi.
– Lưu ý là username admin đã được tạo sẵn, và cột username lại ràng buộc Unique, nghĩa là trong cột đó không thể tạo thêm một username giá trị = admin được. – Nhưng trong Sqlite có câu lệnh INSERT ON CONFLICT cho phép cập nhật một hàng đã tạo ra trong bảng.
Để thực hiện SQLi register từ ip 127.0.0.1 ta sẽ lợi dụng từ việc trang web get api để lấy thông tin thời tiết. "nodeVersion": "v8.12.0" Trang web được viết bằng Nodejs ver 8. Có một lỗ hổng SSRF kết hợp với lỗi CRLF (HTTP request splitting) ở version này. Link bài viết
Giải thích về lỗ hổng:
– HTTP request splitting:
Response splitting (a.k.a CRLF injection) là một kỹ thuật khai thác web phổ biến. Kẻ tấn công gửi đi dữ liệu được encode, nằm trong một vài tham số của request, dữ liệu này sau đó được decode và lặp lại trong một trường nào đó của response header.
Nếu dữ liệu này là một ký hiệu thể hiện sự kết thúc của response, và một response tiếp theo được bắt đầu, response ban đầu sẽ bị chia tách thành hai và nội dung của response thứ hai sẽ bị điều khiển bởi kẻ tấn công. Kẻ tấn công sau đó có thể tạo một request khác trong cùng một kết nối liên tục, và lừa người nhận (bao gồm cả các yếu tố trung gian) tin rằng response thứ hai này là để trả lời cho request thứ hai.
– Đọc qua bài blog: Đầu tiên request đường dẫn là một dạng chuỗi. Sau đó Nodejs chuyển chuỗi đó qua chuỗi byte. Đối với phần header thì mặc định nodejs sẽ sử dụng "latin1" để decode. Tuy nhiên đối với những ký tự có unicode lớn. Nó sẽ cắt bớt byte, để biểu diễn
Vì vậy, nếu chúng ta chèn một số ký tự Unicode như '\u010D' hoặc '\u010A', chúng sẽ bị cắt bớt và được chuyển đổi thành '\r' và '\n'. Vì các ký tự Unicode đó không phải là các ký tự điều khiển HTTP nên có thể sử dụng.