0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Khám Phá Kỹ Thuật DOM Clobbering: Từ Cơ Bản Đến Nâng Cao

Đăng vào 3 tuần trước

• 4 phút đọc

Giới Thiệu

Trong bài viết này, tôi sẽ chia sẻ hiểu biết của mình về kỹ thuật DOM Clobbering sau khi tham khảo từ nhiều nguồn khác nhau. Hy vọng nhận được các ý kiến đóng góp từ độc giả. Bài viết này được thử nghiệm trên trình duyệt Edge, có thể một số nội dung không hoạt động chính xác trên các trình duyệt không dựa trên Chromium.

DOM Clobbering Là Gì? Khi Nào Sử Dụng?

Theo PortSwigger, DOM Clobbering là một kỹ thuật tiêm HTML vào trang web để thao tác với DOM với mục đích cuối cùng là thay đổi hành vi của JavaScript trên trang. Kỹ thuật này đặc biệt hữu ích khi không thể thực hiện XSS nhưng có khả năng kiểm soát các phần tử HTML trên trang có thuộc tính id hoặc name sau khi được lọc bằng whitelist. Thuật ngữ clobbering (ghi đè) đến từ thực tế là việc "clobbering" một biến toàn cục hoặc thuộc tính của một đối tượng và thay thế nó bằng DOM hoặc HTMLCollection.

Tổng Quan Về DOM Clobbering

Object window và Cách Truy Cập

Theo WHATWG, khi truy cập vào thuộc tính name trên đối tượng window (window[name] hay window.name), nó sẽ trả về một phần tử hoặc một collection của các phần tử. Đặc biệt, khi một phần tử được gán thuộc tính id, bạn có thể truy cập phần tử đó qua window với tên là id, khiến id đó trở thành một biến toàn cục.

Khi có nhiều phần tử với cùng id, nó trở thành HTMLCollection. Các thuộc tính name tương tự hoạt động với một số thẻ nhất định. Một skript đơn giản dưới đây sẽ kiểm tra các thẻ nào có thể truy cập từ window:

javascript Copy
tags = ['a', 'iframe', 'object', 'img', 'form'];
for(tag of tags) {
    html = `<${tag} name="test">`;
    document.body.innerHTML = html;
    if(window.test) {
        console.log(tag);
    }
}

Kết quả sẽ cho thấy các thẻ như embed, form, iframe, image, imgobject đều có thể được sử dụng.

Object document và Cách Truy Cập

Tương tự như window, đối với thuộc tính id, chỉ có thẻ object có thể được truy cập.

Đối với thuộc tính name, skript sau có thể được sử dụng để kiểm tra:

javascript Copy
tags = ['a', 'iframe', 'object', 'img', 'form'];
for(tag of tags) {
    html = `<${tag} name="test">`;
    document.body.innerHTML = html;
    if(document.test) {
        console.log(tag);
    }
}

Kết quả sẽ cho thấy embed, form, iframe, image, imgobject đều có thể ghi được vào document với thuộc tính name.

Tại Sao Lại Có Tình Trạng Này?

Khi một trang web được tải, trình duyệt sẽ tạo ra một DOM Tree để thể hiện cấu trúc và nội dung của trang web. Algorithm visibility của named property là một cơ chế quy định cách mà các thuộc tính được gán trong HTML được truy cập trong JavaScript. Khi trang web chứa các phần tử HTML với thuộc tính id hoặc name, trình duyệt sẽ tự động ánh xạ các phần tử này thành các đối tượng trong JavaScript. Điều này có nghĩa là các phần tử HTML với id hoặc name sẽ trở thành thuộc tính của đối tượng window hoặc document trong JavaScript. Khi có sự trùng lặp tên giữa biến JavaScript và phần tử HTML, trình duyệt sẽ ưu tiên truy cập đến phần tử HTML, dẫn đến việc biến JavaScript có thể bị clobbering bởi phần tử HTML cùng tên, và điều này có thể dẫn đến các cuộc tấn công như XSS thông qua DOM Clobbering.

Clobbering Trong objectdocument

Theo những gì đã đề cập, khả năng truy cập từ windowdocument có thể dẫn đến việc clobbering. Với document, điều này có thể xảy ra, nhưng với window, thì không. Điều này dẫn đến việc dễ xảy ra tấn công trên document hơn.

Phòng Chống Kỹ Thuật DOM Clobbering

Để ngăn chặn các cuộc tấn công có khả năng gây hại từ DOM Clobbering, các nhà phát triển có thể thực hiện các biện pháp sau:

  • Sử dụng DOMPurify với các tùy chọn SANITIZE_DOM hoặc SANITIZE_NAMED_PROPS.
  • Áp dụng CSP (Content Security Policy).
  • Sử dụng Object.freeze() cho các biến.
  • Xác thực đầu vào từ người dùng.
  • Hạn chế việc sử dụng document và window cho biến toàn cục.

Kết Luận

Kỹ thuật DOM Clobbering mang lại những thách thức thú vị cho các nhà phát triển web và những người tìm kiếm lỗ hổng bảo mật. Học hỏi về kỹ thuật này không chỉ giúp người thực hiện kiểm tra bảo mật mà còn giúp nhà phát triển bảo vệ ứng dụng của mình tốt hơn trước các mối đe dọa từ các cuộc tấn công XSS. Đừng quên theo dõi các nguồn tài liệu và nghiên cứu thêm về chủ đề để cập nhật kịp thời những kiến thức mới!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào