---
# System prepended metadata

title: 'Lab: Stored DOM XSS'

---

### 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 ^^!
![Ảnh chụp màn hình 2023-11-04 102015.png](https://hackmd.io/_uploads/Bkjt_4Xma.png)

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

![Ảnh chụp màn hình 2023-11-04 103520.png](https://hackmd.io/_uploads/H1Tb2VmQp.png)

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 : 

![Ảnh chụp màn hình 2023-11-04 103443.png](https://hackmd.io/_uploads/BJUn24mQa.png)

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

![Ảnh chụp màn hình 2023-11-04 104122.png](https://hackmd.io/_uploads/SkDR6EQQ6.png)

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


![Ảnh chụp màn hình 2023-11-04 104450.png](https://hackmd.io/_uploads/SyoBA4Xm6.png)


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

![Ảnh chụp màn hình 2023-11-04 102509.png](https://hackmd.io/_uploads/HycYREQma.png)

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

![Ảnh chụp màn hình 2023-11-04 110115.png](https://hackmd.io/_uploads/HkmdMrmXT.png)

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()" > `

![Ảnh chụp màn hình 2023-11-04 110842.png](https://hackmd.io/_uploads/r1z-NrXmT.png)

---
![Ảnh chụp màn hình 2023-11-04 110915.png](https://hackmd.io/_uploads/r1OWEHQ7T.png)

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 :  

![Ảnh chụp màn hình 2023-11-04 111218.png](https://hackmd.io/_uploads/SkybSHmQT.png)

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 `&lg;`, `&gt;`

---
![Ảnh chụp màn hình 2023-11-04 111356.png](https://hackmd.io/_uploads/SJwQrSmXT.png)

Chẳng hạn như `<script>` sẽ được chuyển đổi thành `&lg;script&gt;`

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 ¯\_(ツ)_/¯!





