Giới thiệu về HTTP Parameter Pollution
1. HTTP parameter pollution là gì?
HTTP parameter pollution (HPP) là một kỹ thuật tấn công web mà kẻ tấn công sẽ tạo ra các tham số trùng nhau trong HTTP request. Lợi dụng các phản ứng khác nhau của các công nghệ web khi xử lý các tham số trùng nhau này để inject những đoạn mã độc hại nhằm tấn công server và người sử dụng.
Đây là một kỹ thuật đơn giản nhưng khá hiệu quả. Kẻ tấn công có thể lợi dụng kỹ thuật này để:
Do đó, nếu một ứng dụng web tồn tại lỗ hổng để thực hiện cuộc tấn công HPP, kẻ tấn công có thể dễ dàng chèn các đoạn mã độc hại để tấn công web server cũng như người sử dụng.
2. Các công nghệ web phản ứng khi xuất hiện các tham số trùng nhau trong HTTP request như thế nào?
Trong kỹ thuật HPP, kẻ tấn công sẽ truyền vào các tham số trùng nhau trong HTTP request, các tham số có thể truyền qua phương thức GET, POST hay qua COOKIE. Tuy nhiên, RFC 3986không quy định cách xử lý tiêu chuẩn cho trường hợp này. Do đó, mỗi công nghệ web khác nhau đưa ra cách xử lý khác nhau cho riêng nó trong trường hợp này.
Một số công nghệ web khi phân tích request sẽ nhận đầu vào là giá trị của tham số đầu tiên, một số lại nhận giá trị của tham số cuối cùng, số khác lại nhận tất cả các tham số… Bảng dưới đây mô tả các phản ứng của các công nghệ web với trường hợp HTTP request chứa các tham số trùng nhau.
Các ví dụ sau đây cho thấy cách phản ứng với các tham số trùng nhau, đầu tiên là công cụ tìm kiếm Google:
Công cụ tìm kiếm Bing:
3. Ví dụ về khai thác HPP
Ví dụ 1: Kịch bản dưới đây mô tả một website cung cấp dịch vụ webmail. Người dùng có thể xem (view) và xóa (delete) mail của mình. Url của webmail:
http://host/viewemail.jsp?client_id=79643215
Link xem email như sau:
Link xóa email như sau:
Đoạn mã tạo ra các link trên phía server như sau:
Do client_id không được kiểm tra dữ liệu đầu vào, kẻ tấn công có thể craft giá trị client_id như sau:
Url request lên server như sau:
http://host/viewemailn.jsp?client_id=79643215&action=delete
Sau khi craft link, nội dung của 2 link xem và xóa email ở trên sẽ được inject thêm một tham số action như sau:
Nhìn vào bản ở trên, JSP sẽ phân tích các tham số (action) và nhận giá trị đầu tiên. Do đó, câu lệnh Request.getParameter(“action”) sẽ trả về “delete” cho cả hai trường hợp ở trên. Vì vậy, khi người dùng click để xem hay xóa email thì kết quả đều là xóa email đó. Đây là một cho thấy cách hacker có thể xử dụng HPP để thực thi các mã độc hại nhằm tấn công người dùng phía client-side.
Ví dụ 2:
Giả sử link sau tồn tại lỗ hổng SQL injection:
Sử dụng kỹ thuật khai thác SQL injection
Tuy nhiên việc khai thác thông thường như trên dễ dàng bị WAF phát hiện và loại bỏ.
Một các khác khá hiệu quả để bypass WAF trong trường hợp này là sử dụng kỹ thuật HPP như sau:
Như ta thấy ở bảng trên, ASP.NET sẽ phân tích và nhận tất cả các giá trị của các tham số (proID). Do dó, giá trị nhận được của proID sẽ là
4. Kết luận
HPP là một kỹ thuật hacking khá đơn giản nhưng hiệu quả. Nó có thể được sử dụng để tấn công cả server-side và client-side. Vì vậy, các lập trình viên cần hiểu về lỗ hổng này và các công nghệ web mà họ sử dụng để có thể phòng chống các nguy cơ tấn công từ bên ngoài. Cách tốt nhất để phòng chống vẫn là kiểm tra chặt chẽ giá trị của tất cả các tham số đầu vào.
5. Tài liệu tham khảo
HTTP parameter pollution (HPP) là một kỹ thuật tấn công web mà kẻ tấn công sẽ tạo ra các tham số trùng nhau trong HTTP request. Lợi dụng các phản ứng khác nhau của các công nghệ web khi xử lý các tham số trùng nhau này để inject những đoạn mã độc hại nhằm tấn công server và người sử dụng.
Đây là một kỹ thuật đơn giản nhưng khá hiệu quả. Kẻ tấn công có thể lợi dụng kỹ thuật này để:
- Sửa đổi các tham số HTTP
- Thay đổi các hành vi của ứng dụng web
- Truy cập và khai thác các biến không được kiểm soát chặt chẽ
- Bypass WAF và các cơ chế kiểm tra dữ liệu đầu vào
Do đó, nếu một ứng dụng web tồn tại lỗ hổng để thực hiện cuộc tấn công HPP, kẻ tấn công có thể dễ dàng chèn các đoạn mã độc hại để tấn công web server cũng như người sử dụng.
2. Các công nghệ web phản ứng khi xuất hiện các tham số trùng nhau trong HTTP request như thế nào?
Trong kỹ thuật HPP, kẻ tấn công sẽ truyền vào các tham số trùng nhau trong HTTP request, các tham số có thể truyền qua phương thức GET, POST hay qua COOKIE. Tuy nhiên, RFC 3986không quy định cách xử lý tiêu chuẩn cho trường hợp này. Do đó, mỗi công nghệ web khác nhau đưa ra cách xử lý khác nhau cho riêng nó trong trường hợp này.
Một số công nghệ web khi phân tích request sẽ nhận đầu vào là giá trị của tham số đầu tiên, một số lại nhận giá trị của tham số cuối cùng, số khác lại nhận tất cả các tham số… Bảng dưới đây mô tả các phản ứng của các công nghệ web với trường hợp HTTP request chứa các tham số trùng nhau.
Các ví dụ sau đây cho thấy cách phản ứng với các tham số trùng nhau, đầu tiên là công cụ tìm kiếm Google:
Công cụ tìm kiếm Bing:
3. Ví dụ về khai thác HPP
Ví dụ 1: Kịch bản dưới đây mô tả một website cung cấp dịch vụ webmail. Người dùng có thể xem (view) và xóa (delete) mail của mình. Url của webmail:
http://host/viewemail.jsp?client_id=79643215
Link xem email như sau:
HTML:
View
HTML:
Delete
Mã:
ID = Request.getParameter(“client_id”)
href_link = “viewemail.jsp?client_id=” + ID + ”&action=view”
Mã:
client_id=79643215%26ction%3Ddelete
http://host/viewemailn.jsp?client_id=79643215&action=delete
Sau khi craft link, nội dung của 2 link xem và xóa email ở trên sẽ được inject thêm một tham số action như sau:
HTML:
View
Delete
Ví dụ 2:
Giả sử link sau tồn tại lỗ hổng SQL injection:
Sử dụng kỹ thuật khai thác SQL injection
Tuy nhiên việc khai thác thông thường như trên dễ dàng bị WAF phát hiện và loại bỏ.
Một các khác khá hiệu quả để bypass WAF trong trường hợp này là sử dụng kỹ thuật HPP như sau:
Như ta thấy ở bảng trên, ASP.NET sẽ phân tích và nhận tất cả các giá trị của các tham số (proID). Do dó, giá trị nhận được của proID sẽ là
proID=9 /*,*/UNION /*,*/SELECT 1,2,3 FROM /*,*/Users /*,*/ WHERE id=3 --
Vì vậy, có thể vượt qua WAF. Đây là một ví dụ về việc khai thác SQL injection sử dụng HPP để bypass WAF. Kẻ tấn công có thể chèn những đoạn mã nguy hiểm để tấn công server (server-side).
4. Kết luận
HPP là một kỹ thuật hacking khá đơn giản nhưng hiệu quả. Nó có thể được sử dụng để tấn công cả server-side và client-side. Vì vậy, các lập trình viên cần hiểu về lỗ hổng này và các công nghệ web mà họ sử dụng để có thể phòng chống các nguy cơ tấn công từ bên ngoài. Cách tốt nhất để phòng chống vẫn là kiểm tra chặt chẽ giá trị của tất cả các tham số đầu vào.
5. Tài liệu tham khảo