# DOM-Based XSS ## Lịch sử DOM-Based XSS Công khai lần đầu trong bài viết của **Amit Klein** vào tháng 5 năm 2005 Anh đề cập rằng có một thể XSS khá khác so với mô tả XSS ta biết từ trước đến giờ Theo tác giả thì dạng XSS này cần được hiểu rõ vì cách phát hiện cũng như ngăn chặn sẽ khác với các dạng XSS từng biết trước đây ## Vì sao gọi là DOM-Based XSS? Giới thiệu sơ qua về DOM: trên trình duyệt để JS tương tác với một file HTML, thì HTML sẽ được parse thành DOM tree và object `document` sẽ được JS dùng để tương tác với DOM tree đó ![](https://i.imgur.com/HyLGttg.png) DOM-Based XSS hay tạm dịch là "XSS dựa vào DOM". Dạng XSS này xảy ra dựa vào việc chỉnh sửa DOM tree trên trình duyệt của nạn nhân bằng JavaScript, từ đó thực hiện các hành động không mong muốn. XSS thông thường xảy ra khi **untrust data** được server trả về client ( thường là browser ) trong phản hồi. Trong quá trình này thì server đóng vai trò quan trọng bởi nó xử lý untrust data và gửi nó về lại client, nếu không có bước này (untrust data không được gửi về client) thì sẽ không xảy ra XSS DOM-Based XSS thì khác, untrust data được lấy từ DOM và được chèn vào DOM tree. Hay nói cách khác là cả source và sink đều nằm trong DOM. ## Ví dụ ``` <HTML> <TITLE>Welcome!</TITLE> Hi <script> var pos=document.URL.indexOf("name=")+5; document.write(document.URL.substring(pos,document.URL.length)); // lấy dữ liệu từ param name và dùng document.write để in ra </script> <br> Welcome to our system … </HTML> ``` Ở ví dụ trên: * `document.URL` là đang tham chiếu đến thuộc tính `URL` chứa giá trị url của trang web * `document.write` là phương thức dùng để in ra nội dung lên trang web, bản chất của nó là chính là chỉnh sửa DOM tree, overwrite các node trong DOM hiện tại và yêu cầu trình duyệt phân tích lại DOM. * Ta thấy dữ liệu từ `document.URL` được truyền vào phương thức `document.write` nên có thể hiểu `document.URL` là source và `document.write` là sink. Cả source và sink đều xuất phát từ DOM, được xử lý nội trong browser bởi JS (không có sự tham gia của server) nên đây chính là DOM-Based XSS. ## Phân tích các trường hợp ### innerHTML, outerHTML, document.location.href (nhiều nhưng vài cái để ví dụ) Trong đối tượng `document` được cung cấp phương thức `querySelector` dùng để tìm và tham chiếu tới một node trong DOM. Mỗi DOM sẽ có nhiều thuộc tính và trong đó có `innerHTML` và `outerHTML` chứa nội dung HTML của node. ### eval ### postMessage ## Phòng chống * Tránh việc để untrust data rơi vào các hàm nguy hiểm như `eval`, `document.write`, ... những hàm có thể thay đổi cấu trúc và nội dung của DOM Tree mà không thông qua kiểm tra hay làm sạch * Tránh việc gán untrust data vào các thuộc tính của các node hay object trong DOM Tree (`document.location.href`, ...) * Xem xét việc sử dụng các hàm an toàn hơn nếu có thể. Ví dụ để thay đổi nội dung của một node ta có thể gán nội dung vào `textContent` hoặc `innerText` thay vì `innerHTML`. * Đối với `postMessage`, cần kiểm tra thuộc tính `origin` để đảm bảo data được gửi đến từ nguồn được tin tưởng (đây chỉ là mitigation, sẽ không patch được tận gốc) ## Case study ## Labs