📌 Bài viết này thuộc chuỗi write-up quá trình tiếp cận và đáp án cho các bài lab từ Portswigger Web Academy mà mình đã làm trong thời gian thực tập tại NCSC.
Mình không thích lắm cái cách mấy idol viết write-up lab theo kiểu cứ như thể họ đã biết đáp án từ đầu – họ chẳng bao giờ đủ kiên nhẫn để giải thích cặn kẽ tại sao họ lại làm một cái gì đó. Vậy nên, write-up phong cách bạn Tiểu ra đời. Mình mong là bạn có được những câu trả lời thoả đáng qua loạt bài này. Những ý kiến góp ý, thảo luận, báo lỗi – luôn luôn được hoan nghênh dưới mục comment.
Đề bài
Ngữ cảnh: Tính năng đổi email của lab này có thể bị tấn công CSRF. Nó cố gắng ngăn chặn các yêu cầu từ tên miền chéo nhưng lại có sơ hở.
Mục tiêu: Dùng Exploit server được cung cấp để lưu trữ trang HTML, trang này sử dụng tấn công CSRF để đổi email của người dùng.
Thông tin sẵn có: Tài khoản wiener:peter
Phân tích
Đọc cái tiêu đề là nghĩ ngay được hướng giải. “Xác thực Referer chỉ phụ thuộc vào sự có xuất hiện của trường này”, vậy là chúng ta chỉ cần làm cho nó biến mất là được.
Lời giải
- Theo dõi để xác nhận là đúng là nó check referer header thật.

2. Như thường lệ, gợi ý có ngay trong hướng dẫn của chủ đề CSRF:

Chúng ta chỉ cần thêm một trường meta trong form CSRF như thế này:
<meta name="referrer" content="never">
3. Bây giờ chúng ta viết một file HTML chứa form, cái form này sẽ có hai tính năng:
- Thứ nhất, xoá trường referer như trên
- Thứ hai, thay đổi email người dùng theo yêu cầu đề bài
Chúng ta làm form vì tính năng thay đổi email là một cái form.
Nếu bạn có Burp Suite Pro, bạn có thể bắt lấy Request đổi email → nhấn chuột phải → Generate CSRF PoC. Còn nếu không, bạn có thể viết tương tự như thế này:
<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <form action="<https://0a43007b04952094834b34e500d10086.web-security-academy.net/my-account/change-email>" method="POST"> <meta name="referrer" content="never"> <input type="hidden" name="email" value="hi@gmail.com" /> <input type="submit" value="Submit request" /> </form> <script> history.pushState('', '', '/'); document.forms[0].submit(); </script> </body> </html>
4. Đưa cái này lên Exploit server, phần Body. Bạn có thể kiểm tra rằng cái này hoạt động bằng nút “View exploit”, xem xem email của mình có đúng là bị thay đổi không.
Lưu ý: Để bài lab được ghi nhận, bạn cần phải đổi email trong PoC thành một email không trùng với email hiện tại của tài khoản bạn (hoặc là cái email ban đầu hoặc email bạn đã đổi sau 7749 lần thử).
Ví dụ nếu tài khoản của bạn có email hiện tại là something@portswigger.com thì bạn phải nhớ để giá trị của trường email trong cái PoC kia thành một cái email nào đó khác.
5. Ổn áp rồi thì “Deliver exploit to victim” là xong.