# Lý thuyết
- Source : Nơi accept data mà potentially attacker-controlled.Ví dụ như location.search , location.hash , document.referrer , window.name

- Sink : dangerous JavaScript function hoặc DOM objection có thể dẫn đến các hành vi không mong muốn nếu attacker-controlled.

- DOM clobbering:
+ một vài hành vi của trình duyêt : Bất kỳ thẻ HTML nào có thuộc tính **id** (hoặc **name** trong một số trường hợp) sẽ tự động trở thành một biến toàn cục trong đối tượng **window**
+ nhận biết : sử dụng toán tử || or sử dụng form
- trong DOM thì các elements html điều là object .
- trong một page<Chome> nếu có hai id trùng nhau thì khi dùng cấu lệnh "window.ten_id" trả về một **HTMLCollection** đây cũng là một **object** . **id** trở trành một global variable
- Tính năng named property access của HTMLCollection : Khi một **HTMLCollection** có attribute **id** or **name** thì có thể truy cập vào elements bằng value của attribute này
- toString() : Nếu với các elements html thì kết quả của toString() luôn là [object HTML_tên element_Element] . **Riêng với element <area> và element <a> thì kết quả trả về là values của attribute href**
- VÍ DỤ : 
- command : window.link ==> trả về **HTMLCollection** (chứa hai thẻ a) .
- command: window.link.quandz ==> trả về thẻ a thứ 2 (đây là một **object**)
- **NỐI CHUỖI thì hàm toString() sẽ được tự động gọi . Nếu với các elements html thì kết quả của toString() luôn là [object HTML_tên element_Element] . Riêng với element <area> và element <a> thì kết quả trả về là values của attribute href**
- cid: (or xmpp:)là prototol mà trong allow_list của DOMPurify nên kí tự entries html : ": se được browser decode lại lúc render mà cắt end chuỗi
# LAB
## Lab: DOM XSS using web messages

- start:
- ở trang Home có đoạn script 
- Nhận một message(event build-in trong js **https://developer.mozilla.org/en-US/docs/Web/API/Window/message_event**) tóm lại là event message được dành cho giao tiếp cross-origin (sự kiện message – một sự kiện built-in trong JavaScript được kích hoạt khi một thông điệp (message) được gửi đến cửa sổ (window) bằng phương thức postMessage())
- đoạn script không check e.origin và dùng .innerHTML để chèn data vào DOM
- payload : 
- khi content của trang html trong src được load thì mới thực thi postMessage() . postMessage() phải được gọi bởi đối tượng windown của site html nhận message
## Lab: DOM XSS using web messages and a JavaScript URL

- Start:
- 
- nhận một message từ different site thông qua postMessage() . Dùng indexOf() để check protocol là https or http . nhưng indexOf() chỉ kiểm tra vị trí đầu tiên của kí tự
-thực thi javascript trong herf
- payload :
//https: là để bypass indexOf() và mã javascript sẽ thành:
**location.herf=javascript:print()** có dấu comment nên sẽ đúng cú pháp
## Lab: DOM XSS using web messages and JSON.parse

- Start:
- ở trang home có đoạn javascript: 
- không kiểm tra e.origion nếu attacker dùng iframe để nhúng site này vào iframe và dùng postMessage() để gửi message
- payload : 
## Lab: DOM-based open redirection

- Start:
- regex.exec(location) , location là là url hiện tại (sink)

-payload : 
## Lab: DOM-based cookie manipulation

- Start:
- lấy windown.location làm cookies=lastViewedProduct mà cái này là du user manipulation
- 
-giá trị của href là cookies=lastViewedProduct
- gây XSS ở đây :
- thay đổi url thành : 
- kiểm tra cookies có thay đổi theo url không?. cookies thay đổi theo url
- quay lại load trang lần 2 thì alert() thực thi
- dùng iframe nhúng target site vào nhưng làm cho load 2 lần :))
- payload : 
- iframe load lần 1 , then onload executed nó kiểm tra attribute 'hehe' không có nên nó sẽ thay đổi src bằng chính nó nên load lần 2 , thiết lập attribute'hehe'=1 để không load vô hạn
## Lab: Exploiting DOM clobbering to enable XSS

- Start:
- **LÝ THUYẾT**:
- trong DOM thì các elements html điều là object .
- trong một page<Chome> nếu có hai id trùng nhau thì khi dùng cấu lệnh "window.ten_id" trả về một **HTMLCollection** đây cũng là một **object** . **id** trở trành một global variable
- Tính năng named property access của HTMLCollection : Khi một **HTMLCollection** có attribute **id** or **name** thì có thể truy cập vào elements bằng value của attribute này
- toString() : Nếu với các elements html thì kết quả của toString() luôn là [object HTML_tên element_Element] . **Riêng với element <area> và element <a> thì kết quả trả về là values của attribute href**
- VÍ DỤ : 
- command : window.link ==> trả về **HTMLCollection** (chứa hai thẻ a) .
- command: window.link.quandz ==> trả về thẻ a thứ 2 (đây là một **object**)
- Solution:
#### CÁCH 1:
- payload 2: do sử dụng DOMPurify version 2.0.15 <= 2.0.17 nên dính lỗi Mutation XSS : 
[Mutation XSS](https://hackmd.io/W8oWWkmRShSYoOa9JpX-KA)
[Mutation XSS gốc](https://research.securitum.com/mutation-xss-via-mathml-mutation-dompurify-2-0-17-bypass/)
#### CÁCH 2:
- nhận thấy đoạn code sau để bị DOM clobbering: 
vì . Global variable defaultAvatar dễ bị DOM clobbering vì nếu chèn hai element html có id='defaultAvatar' thì có thể truy cập vào
- phân tích code : vì comment.avatar luôn false nên src kết quả sẽ được **NỐI CHUỖI** thì hàm **toString()** sẽ được tự động gọi . Nếu với các elements html thì kết quả của toString() luôn là [object HTML_tên element_Element] . **Riêng với element \<area> và element \<a> thì kết quả trả về là values của attribute href**
- payload 1 : tạo ra hai thẻ a với **id="defaultAvatar"** với **name="avatar"** để phá với việc reference của code.

- kiểm tra trên consolog xem DOM clobbering thành công nhưng avatar unchange???. 

- Không change được vì khi post comment lần 1 thì nó chi mới tạo elemnts html trên page chứ không vẫn chưa áp dụng vào thử tạo một comment thứ 2 thì thấy avatar đã change . 
- element trên page : 
paylaod : 
**cid:** (or **xmpp:**)là prototol mà trong allow_list của DOMPurify nên kí tự entries html : **":** se được browser decode lại lúc render mà cắt end chuỗi
## Lab: Clobbering DOM attributes to bypass HTML filters

- Start:
- Lab này sử dụng một **custom library (HTMLJanitor)** để filter comments before it is posted in lab.
- file : **/resources/js/htmlJanitor.js** đây là file để build a custom library **HTMLJanitor**.
file này thực hiện duyệt sanitize data do user post before được post lên lab . Sử dụng TreeWalKer để duyệt từng DOM node . và lọc .

theo như config này thì nó cho phép tag **form,input,b,p**. Do không thể khai thác qua global variable nên chúng ta sẽ khai thác quá tag form vì : nếu chúng ta chèn vào một thẻ input có id="attributes" thì đoạn code sau : 
**node.atributes** thay vì trả về một **NameNodeMap** thì nó lại trả về thẻ input nếu id="adtributes":
- Payload : 
payload này làm cho **node.attributes.length** trả về **undefine** nên **a<undefine** là **false** nên vòng lặp check attribute không xảy ra
- kết quả : 
- truy cập id=1 qua url thì alert() xuất hiện 
- payload : đợi iframe load trang rồi sau 1s load thêm 1 lần nữa để print() chạy