Rate this post

Các trình duyệt cung cấp các cơ chế lưu trữ phía máy khách sau để các nhà phát triển lưu trữ và truy xuất dữ liệu:

  • Local Storage
  • Session Storage
  • IndexedDB
  • Web SQL (Deprecated)
  • Cookies

Bạn có thể xem và chỉnh sửa các cơ chế lưu trữ này bằng cách sử dụng các công cụ dành cho nhà phát triển của trình duyệt, chẳng hạn như Công cụ dành cho nhà phát triển của Google Chrome hoặc Trình kiểm tra bộ nhớ của Firefox.

Các bài viết liên quan:

Lưu ý: Mặc dù bộ nhớ cache cũng là một dạng lưu trữ nhưng nó được đề cập trong một phần riêng biệt bao gồm các đặc thù và mối quan tâm của riêng nó.

Mục tiêu kiểm tra

Xác định xem trang web có đang lưu trữ dữ liệu nhạy cảm trong bộ nhớ phía máy khách hay không.

Việc xử lý mã của các đối tượng lưu trữ cần được kiểm tra các khả năng tấn công chèn ép, chẳng hạn như sử dụng đầu vào chưa được kiểm chứng hoặc các thư viện dễ bị tấn công.

Làm thế nào để kiểm tra

Local Storage

window.localStorage là một thuộc tính toàn cầu triển khai API Web Storage và cung cấp khả năng lưu trữ khóa-giá trị liên tục trong trình duyệt.

Cả khóa và giá trị chỉ có thể là chuỗi, vì vậy mọi giá trị không phải chuỗi phải được chuyển đổi thành chuỗi trước khi lưu trữ chúng, thường được thực hiện thông qua JSON.stringify.

Các mục nhập vào localStorage vẫn tồn tại ngay cả khi cửa sổ trình duyệt đóng lại, ngoại trừ các cửa sổ ở chế độ Riêng tư / Ẩn danh.

Dung lượng lưu trữ tối đa của localStorage khác nhau giữa các trình duyệt.

Liệt kê tất cả các mục nhập khóa-giá trị

for (let i = 0; i < localStorage.length; i++) {
  const key = localStorage.key(i);
  const value = localStorage.getItem(key);
  console.log(`${key}: ${value}`);
}

Session Storage

window.sessionStorage là một thuộc tính toàn cầu triển khai API Web Storage và cung cấp khả năng lưu trữ khóa-giá trị tạm thời trong trình duyệt.

Cả khóa và giá trị chỉ có thể là chuỗi, vì vậy mọi giá trị không phải chuỗi phải được chuyển đổi thành chuỗi trước khi lưu trữ chúng, thường được thực hiện thông qua JSON.stringify.

Các mục nhập vào sessionStorage là tạm thời vì chúng sẽ bị xóa khi đóng cửa sổ / tab trình duyệt.

Dung lượng lưu trữ tối đa của sessionStorage khác nhau giữa các trình duyệt.

Liệt kê tất cả các mục nhập khóa-giá trị

for (let i = 0; i < sessionStorage.length; i++) {
  const key = sessionStorage.key(i);
  const value = sessionStorage.getItem(key);
  console.log(`${key}: ${value}`);
}

IndexedDB

IndexedDB là một cơ sở dữ liệu hướng đối tượng, giao dịch dành cho dữ liệu có cấu trúc. Một cơ sở dữ liệu IndexedDB có thể có nhiều kho lưu trữ đối tượng và mỗi kho lưu trữ đối tượng có thể có nhiều đối tượng.

Trái ngược với Lưu trữ cục bộ và Lưu trữ phiên, IndexedDB có thể lưu trữ nhiều hơn chỉ là các chuỗi. Bất kỳ đối tượng nào được hỗ trợ bởi thuật toán sao chép có cấu trúc đều có thể được lưu trữ trong IndexedDB.

Các bài viết khác:

Ví dụ về một đối tượng JavaScript phức tạp có thể được lưu trữ trong IndexedDB, nhưng không được lưu trữ trong Local / Session Storage là CryptoKeys.

Khuyến nghị của W3C trên Web Crypto API khuyến nghị rằng các CryptoKeys cần được duy trì trong trình duyệt, phải được lưu trữ trong IndexedDB. Khi kiểm tra một trang web, hãy tìm kiếm bất kỳ CryptoKeys nào trong IndexedDB và kiểm tra xem chúng có được đặt là có thể trích xuất: true khi chúng đáng lẽ được đặt thành có thể trích xuất: false (nghĩa là đảm bảo tài liệu khóa cá nhân cơ bản không bao giờ bị lộ trong các hoạt động mật mã.)

In tất cả nội dung của IndexedDB

const dumpIndexedDB = dbName => {
  const DB_VERSION = 1;
  const req = indexedDB.open(dbName, DB_VERSION);
  req.onsuccess = function() {
    const db = req.result;
    const objectStoreNames = db.objectStoreNames || [];

    console.log(`[*] Database: ${dbName}`);

    Array.from(objectStoreNames).forEach(storeName => {
      const txn = db.transaction(storeName, 'readonly');
      const objectStore = txn.objectStore(storeName);

      console.log(`\t[+] ObjectStore: ${storeName}`);

      // Print all entries in objectStore with name `storeName`
      objectStore.getAll().onsuccess = event => {
        const items = event.target.result || [];
        items.forEach(item => console.log(`\t\t[-] `, item));
      };
    });
  };
};
indexedDB.databases (). then (dbs => dbs.forEach (db => dumpIndexedDB (db.name)));

Web SQL

Web SQL không được dùng nữa kể từ ngày 18 tháng 11 năm 2010 và các nhà phát triển web không nên sử dụng nó.

Cookies

Cookie là một cơ chế lưu trữ khóa-giá trị chủ yếu được sử dụng để quản lý phiên nhưng các nhà phát triển web vẫn có thể sử dụng nó để lưu trữ dữ liệu chuỗi tùy ý.

Cookie được đề cập rộng rãi trong kịch bản thử nghiệm các thuộc tính Cookies.

List All Cookies

console.log (window.document.cookie);

Global Window Object

Đôi khi các nhà phát triển web khởi tạo và duy trì trạng thái chung chỉ khả dụng trong thời gian chạy của trang bằng cách gán các thuộc tính tùy chỉnh cho đối tượng cửa sổ chung. Ví dụ:

window.MY_STATE = {
  counter: 0,
  flag: false,
};

Mọi dữ liệu được đính kèm trên đối tượng cửa sổ sẽ bị mất khi trang được làm mới hoặc đóng.

Liệt kê tất cả Entries của Window Object

(() => {
  // create an iframe and append to body to load a clean window object
  const iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  document.body.appendChild(iframe);

  // get the current list of properties on window
  const currentWindow = Object.getOwnPropertyNames(window);

  // filter the list against the properties that exist in the clean window
  const results = currentWindow.filter(
    prop => !iframe.contentWindow.hasOwnProperty(prop)
  );

  // remove iframe
  document.body.removeChild(iframe);

  // log key-value entries that are different
  results.forEach(key => console.log(`${key}: ${window[key]}`));
})();

Attack Chain

Sau khi xác định bất kỳ vectơ tấn công nào ở trên, một chuỗi tấn công có thể được hình thành với các kiểu tấn công phía máy khách khác nhau, chẳng hạn như các cuộc tấn công dựa trên DOM XSS.

Biện pháp khắc phục hậu quả

Các ứng dụng phải lưu trữ dữ liệu nhạy cảm ở phía máy chủ chứ không phải phía máy khách, theo cách bảo mật theo các phương pháp hay nhất.

Leave a Reply

Call now
%d bloggers like this: