Chall này khá giống một cửa hàng, check từng mục thì thấy một danh sách các sản phẩm
Có một điểm đáng chú ý là url của trang web
Có một thuộc tính p được gắn giá trị prices và mình thử thay bằng một giá trị khác
Có một tính năng rp cho admin và đó chắc hẳn là cách duy nhất để lấy flag, đầu tiên phải thử xem nó có bị XSS không, ban đầu mình thử
1
<script>alert(1)</script>
Mình thử mở source lên check thì thấy đầu vào được gắn trong một thẻ <a>
Ý tưởng là mình sẽ truyền thêm một thuộc tính vào thẻ này và dẫn đến host của mình, ở đây mình dùng onmousemove khi trỏ chuột vào thì nó sẽ chạy đoạn js bên trong. Ban đầu mình thử
1
test" onmousemove="alert(1)
Có thể thấy nó vẫn chưa thoát được thuộc tính href nên mình thử lại bằng cách thay nháy kép thành nháy đơn như sau:
1
test' onmousemove='alert(1)
Lần này thì đã có thể XSS thành công, sau đó mình thực hiện gửi cookie của admin vào host của mình bằng payload:
Chall này có một tính năng gửi tin nhắn và lưu trữ lại sau đó admin sẽ đọc chúng, ban đầu mình thử kiểm tra XSS bằng cách nhập vào message <script>alert(1)</script>
Tương tự như chall trên mình sẽ tải một đoạn script dẫn đến host của mình kèm theo admin, ở đây mình sử dụng thẻ img với thuộc tính onerror, nếu đường link dẫn đến ảnh bị lỗi thì nó sẽ tự động thực thi đoạn script bên trong mà không cần thao tác của người dùng
Chall này có một thanh input và nó như một trò chơi nho nhỏ đoán số được sinh ra ngẫu nhiên và ghi lại input vào đoạn mã script
Mục đích của chall là lấy cookie admin nên không cần quan tâm quá nhiều vào trò chơi này. Vì nó có thêm 1 chức năng contact cho phép gửi đi một url đến admin đúng định dạng có sẵn
Ý tưởng sẽ là chèn XSS ở trang main sau đó gửi đường link đó đến cho admin và đánh cắp cookie
Ban đầu thử xem XSS có hoạt động không:
1
test'; alert(1);//
Đoạn mã trên trình duyệt sẽ như thế này
Sau đó thì sử dụng document.location để đánh cắp cookie của admin:
Chall này có chức năng tạo pass theo username nhập vào, và username đầu vào cũng được ghi lại trong đoạn mã script
Tương tự thì nó cũng có chức năng contact admin và cho phép gửi url theo đúng định dạng
Cũng với ý tưởng như bài trên và mình thử lỗi XSS với chức năng ở Main bằng payload:
1
test'; alert(1);//
Có vẻ như nháy đơn đã bị lọc bỏ, và còn một điều nữa đó chính là đầu vào được hiển thị trong Result for, và dựa trên tên chall này nên rất có thể đoạn code sẽ là Result for {{name}}, lúc này mình thử nhập vào payload:
1
{{constructor.constructor("alert(1)")()}}
(đoạn mã này sử dụng hàm khởi tạo trong angular để có thể thực thi đoạn mã javascript bên trong ngoặc tròn)
Vậy là đã XSS được thành công, lúc này khúc mắc cuối cùng là việc bypass nháy đơn, thì mình có thử sử dụng HTML encode dấu nháy đơn thành không ngờ một phát ăn ngay, payload hoàn chỉnh:
Chức năng của trang web khá giống với chall Stored 1, cũng là gửi tin nhắn và lưu chúng lại chờ admin đọc, nhưng phần message và title đều đã được làm sạch và không thể XSS được
Để ý thấy có một thứ mà Stored 1 không có đó là phần status được thêm vào khá đáng ngờ, sau khi kiểm tra source thì thấy nó được thêm vào trong 1 thẻ i
Mình liền thử dùng burp suite xem có thể thay đổi được status không thì thấy status được gửi qua phần cookie và có thể tùy ý thay đổi
Sau đó mình liền test thử xem chỗ này có bị XSS không bằng cách thoát thẻ i ra và chèn đoạn mã script vào:
1
"><script>alert(1)</script><p class="
Mọi thứ khá thuận lợi, đến đây mình tiếp tục sử dụng payload giống như ở chall Stored 1 để lấy cookie của admin