1.DOM-Based XSS (Kịch bản chéo trang dựa trên DOM) là gì?
Các lỗ hổng XSS dựa trên DOM (DOM-based XSS) thường phát sinh khi JavaScript lấy dữ liệu từ nguồn do kẻ tấn công kiểm soát, chẳng hạn như URL và chuyển dữ liệu đó đến một hệ thống hỗ trợ thực thi mã động, chẳng hạn như eval() hoặc innerHTML. Điều này cho phép kẻ tấn công thực thi JavaScript độc hại, thường cho phép chúng chiếm đoạt tài khoản của người dùng khác.
Để thực hiện một cuộc tấn công DOM-based XSS bạn cần đặt dữ liệu vào một nguồn để nó được truyền đến một nơi sinks và thực thi JavaScript tùy ý.
Nguồn phổ biến nhất cho DOM XSS là URL, thường được truy cập bằng window.location đối tượng. Kẻ tấn công có thể xây dựng một liên kết để gửi nạn nhân đến một trang dễ bị tấn công với tải trọng trong chuỗi truy vấn và các phần phân đoạn của URL. Trong một số trường hợp nhất định, chẳng hạn như khi nhắm mục tiêu trang 404 hoặc trang web chạy PHP, tải trọng cũng có thể được đặt trong đường dẫn.

2.Cách kiểm tra tập lệnh chéo trang dựa trên DOM (DOM-Based XSS)
- Kiểm tra phần sinks HTML
Để kiểm tra DOM XSS trong sinks HTML, hãy đặt một chuỗi ký tự chữ và số ngẫu nhiên vào nguồn (chẳng hạn như location.search), sau đó sử dụng các công cụ dành cho nhà phát triển để kiểm tra HTML và tìm vị trí chuỗi của bạn xuất hiện. Lưu ý rằng tùy chọn “Xem nguồn” của trình duyệt sẽ không hoạt động đối với thử nghiệm DOM XSS vì nó không tính đến những thay đổi đã được thực hiện trong HTML bằng JavaScript. Trong công cụ dành cho nhà phát triển của Chrome, bạn có thể sử dụng Control+F (hoặc Command+F trên MacOS) để tìm kiếm chuỗi của mình trong DOM.
Đối với mỗi vị trí nơi chuỗi của bạn xuất hiện trong DOM, bạn cần xác định ngữ cảnh. Dựa trên ngữ cảnh này, bạn cần tinh chỉnh thông tin đầu vào của mình để xem nó được xử lý như thế nào. Ví dụ: nếu chuỗi của bạn xuất hiện trong thuộc tính được trích dẫn kép thì hãy thử chèn dấu ngoặc kép vào chuỗi của bạn để xem liệu bạn có thể thoát ra khỏi thuộc tính đó hay không.
Lưu ý rằng các trình duyệt hoạt động khác nhau liên quan đến mã hóa URL: Chrome, Firefox và Safari sẽ mã hóa URL location.search và location.hash, trong khi IE11 và Microsoft Edge (tiền-Chromium) sẽ không mã hóa URL các nguồn này. Nếu dữ liệu của bạn được mã hóa URL trước khi được xử lý thì cuộc tấn công XSS khó có thể hoạt động.
- Kiểm tra mức độ thực thi JavaScript sinks
Việc kiểm tra mức độ thực thi JavaScript cho XSS dựa trên DOM (DOM-Based XSS) khó hơn một chút. Với những phần sinks này, dữ liệu đầu vào của bạn không nhất thiết phải xuất hiện ở bất kỳ đâu trong DOM, vì vậy bạn không thể tìm kiếm nó. Thay vào đó, bạn sẽ cần sử dụng trình gỡ lỗi JavaScript để xác định xem dữ liệu đầu vào của bạn có được gửi đến hệ thống xử lý hay không và bằng cách nào.
Đối với mỗi nguồn tiềm năng, chẳng hạn như location, trước tiên bạn cần tìm các trường hợp trong mã JavaScript của trang nơi nguồn đang được tham chiếu. Trong các công cụ dành cho nhà phát triển của Chrome, bạn có thể sử dụng Control+Shift+F(hoặc Command+Alt+F trên MacOS) để tìm kiếm nguồn trên tất cả mã JavaScript của trang.
Khi bạn đã tìm thấy nơi nguồn đang được đọc, bạn có thể sử dụng trình gỡ lỗi JavaScript để thêm điểm ngắt và làm theo cách sử dụng giá trị của nguồn. Bạn có thể thấy rằng nguồn được gán cho các biến khác. Nếu đúng như vậy, bạn sẽ cần phải sử dụng lại chức năng tìm kiếm để theo dõi các biến này và xem liệu chúng có được chuyển đến bồn chứa hay không. Khi tìm thấy một vùng lưu trữ đang được gán dữ liệu có nguồn gốc từ nguồn, bạn có thể sử dụng trình gỡ lỗi để kiểm tra giá trị bằng cách di chuột qua biến để hiển thị giá trị của nó trước khi nó được gửi đến vùng lưu trữ. Sau đó, giống như phần sinks của HTML, bạn cần tinh chỉnh dữ liệu đầu vào của mình để xem liệu bạn có thể thực hiện một cuộc tấn công XSS thành công hay không.
- Kiểm tra DOM XSS bằng DOM Invader
Việc xác định và khai thác DOM XSS trong thực tế có thể là một quá trình tẻ nhạt, thường yêu cầu bạn phải tìm kiếm thủ công các JavaScript phức tạp, được rút gọn. Tuy nhiên, nếu bạn sử dụng trình duyệt của Burp, bạn có thể tận dụng tiện ích mở rộng DOM Invader được tích hợp sẵn của nó, tiện ích này thực hiện rất nhiều công việc khó khăn cho bạn.
3.Những phần sinks nào có thể dẫn đến lỗ hổng DOM-XSS?
Sau đây là một số phần sinks chính có thể dẫn đến lỗ hổng DOM-XSS:
document.write()document.writeln()document.domainelement.innerHTMLelement.outerHTMLelement.insertAdjacentHTMLelement.onevent
Các hàm jQuery sau đây cũng có thể dẫn đến lỗ hổng DOM-XSS:
add()after()append()animate()insertAfter()insertBefore()before()html()prepend()replaceAll()replaceWith()wrap()wrapInner()wrapAll()has()constructor()init()index()jQuery.parseHTML()$.parseHTML()
