### Web Academy PortSwigger
* Lab: [Lab: Stored DOM XSS](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored)
* Descript: This lab demonstrates a stored DOM vulnerability in the blog comment functionality.
* To solve this lab, exploit this vulnerability to call the alert() function.
* Solved and Writeup by Me ^^!

Truy cập trang Lab , giao diện trang web hiện ra như sau :

Vì đề bài gợi ý vuln stored DOM trong chức năng comment ,ta nhấp vào môt bài post bất kỳ và xem :

Đây là nội dung bài post cho ai muốn biết ^_O (Đã dịch :>)

Lướt xuống cuối trang , ta sẽ thấy mục comment và các comment trước đó đã được load

Xem qua source trang, ta thấy có vẻ như có file xử lý việc tải comment ,

Hãy thử tạo một vài bình luận và xem :

Kết quả hiện thị , mình không hiểu tại sao thẻ đóng `</script>` bị mất , thẻ `img` vẫn hiện thị chính xác, thẻ img vẫn nằm trong thẻ `p` , thử chèn thẻ đóng để break out ra thử :` </p><img src=x onerror="alert()" > `

---

Thông báo được bật lên khi load trang, bài lab được giải quyết . Nhưng một thắc mắc là ta có thể break out dễ như vậy mà không có hạn chế nào ¯\_(ツ)_/¯
Xem qua file js được tìm thấy trong source lúc nãy :

Có thể trang lab đã load không đúng nên đã không lọc nội dung của cmt được tải lên. Dù sao , hãy phân tích nó!
Mô tả ngắn gọn về chức năng , hàm `loadComments` thực hiện tạo và gửi request thông qua Object `XMLHttpRequest` (Đối tượng được sử dụng để yêu cầu dữ liệu từ máy chủ web,có thể cập nhật nội dung trang web mà không cần load trang )
Phương thức `Json.parse`, được sử dụng để chuyển đổi dữ liệu phản hồi từ request dạng `json` thành mảng các object javascript , sau đó gán vào biến `comments` , làm tham số cho `function` hiển thị nội dung `displayComments()`
Ta chú ý hàm `displayComments()` sử dụng `escapeHTML()` để xử lý chuyển đổi `<` , `>` trong chuỗi thành `≶`, `>`
---

Chẳng hạn như `<script>` sẽ được chuyển đổi thành `≶script>`
Do sử dụng `replace` chỉ thay thế các ký tự xuất hiện đầu tiên. Ta có thể thêm `<>` vào đầu scrip alert ! để bypass hàm `escapeHTML()` này và thực thi thành công đoạn scrip alert rồi ¯\_(ツ)_/¯!