IV. Phân Tích và Khai Thác Kỹ Thuật Tấn Công Ô Nhiễm Prototype Phía Server
1. Sự Khác Biệt Giữa Ô Nhiễm Prototype Phía Server và Phía Client
Ô nhiễm Prototype phía server là một dạng lỗ hổng nghiêm trọng xảy ra ngay tại máy chủ, khác với các lỗ hổng phía client. Mặc mặc dù JavaScript thường được coi là ngôn ngữ lập trình cho front end, nó đã trở thành một công cụ mạnh mẽ cho việc xây dựng backend và API. Độc giả có thể tham khảo cuốn sách JavaScript from Frontend to Backend để hiểu rõ hơn về sự chuyển mình này.
2. Những Khó Khăn Trong Việc Kiểm Tra và Khai Thác Ô Nhiễm Prototype
Khi tiến hành kiểm tra ô nhiễm Prototype trên máy chủ, chúng ta sẽ gặp phải một số thách thức đáng kể:
- Thiếu mã nguồn: Trái ngược với phía client, việc kiểm tra ô nhiễm phía server giống như kiểm thử "blackbox" bởi vì không có mã nguồn có thể xem xét.
- Dấu hiệu không rõ ràng: Ô nhiễm phía server thường không rõ ràng vì các giá trị thuộc tính không hiển thị trong giao diện mà chỉ có thể được tìm kiếm thông qua phản hồi từ server.
- Ảnh hưởng đến hệ thống: Việc thay đổi thuộc tính trong môi trường server không đúng có thể làm hỏng luồng hoạt động của chương trình.
- Khó khôi phục dữ liệu: Sau khi ô nhiễm, việc không biết giá trị ban đầu của thuộc tính gây khó khăn cho việc khôi phục lại giá trị đó.
Chúng ta sẽ cần một cách tiếp cận cẩn thận để vừa kiểm tra ô nhiễm, vừa đảm bảo hệ thống vẫn hoạt động hiệu quả.
3. Phát Hiện Ô Nhiễm Khi Dữ Liệu Xuất Hiện Trong Phản Hồi
Nhiều lập trình viên đã quen thuộc với vòng lặp for...in
trong JavaScript. Vòng lặp này không chỉ liệt kê các thuộc tính của đối tượng mà còn cả các thuộc tính kế thừa từ prototype. Điều này có thể làm lộ lỗ hổng khi kiểm tra thuộc tính trong một đối tượng.
const testObject = {'a': 1, 'b': 2};
for (propertyKey in testObject) {
console.log(propertyKey);
}
// Kết quả: a b
Việc thêm thuộc tính vào Object.prototype
có thể ảnh hưởng đến chương trình:
const testObject = {'a': 1, 'b': 2};
Object.prototype.test = '3';
for (propertyKey in testObject) {
console.log(propertyKey);
}
// Kết quả: a b test
4. Một Số Kỹ Thuật Phát Hiện Lỗ Hổng Ô Nhiễm
4.1. Khám Phá Qua Thuộc Tính parameterLimit
Trong Express, thuộc tính parameterLimit
giúp giới hạn số lượng tham số mà server có thể xử lý trong request. Nếu khả năng tấn công xảy ra, việc điều chỉnh giá trị này có thể cho thấy lỗ hổng.
4.2. Sử Dụng Thuộc Tính ignoreQueryPrefix
Khi thiết lập thuộc tính này thành true, hệ thống có khả năng phân tích cú pháp tham số dạng ??test=
, điều này có thể được sử dụng để kiểm tra tính bảo mật của ứng dụng.
4.3. Khám Phá Qua allowDots
Tương tự như ignoreQueryPrefix
, thuộc tính này cho phép sử dụng dấu chấm trong tham số, làm tăng khả năng lợi dụng các lỗ hổng.
Tài Liệu Tham Khảo
- Portswigger - Ô nhiễm Prototype Phía Server
- Nghiên Cứu về Ô Nhiễm Prototype Phía Server
- Documentation for qs library
©️ Tác giả: Lê Ngọc Hoa từ Viblo.
source: viblo