XSS tấn công và phòng thủ: Sơ lược về XSS

hacked

XSS (cross site scripting) là một lỗ hổng an ninh thường tìm thấy trên các ứng dụng Web. XSS cho phép kẻ tấn công chèn các đoạn script từ các máy trạm vào trang Web và nó sẽ hiển thị với những người dùng khác. Lỗ hổng XSS cũng có thể bị lợi dụng bởi kẻ tấn công để chiếm quyền điều khiển máy chủ.

Lỗ hổng XSS xuất hiên từ giữa những năm 90 tong những ngày đầu của Web. Khi đó, các trang Web thương mại điện tử bắt đầu xuất hiện ngày một nhiều. Các trang Web sử dụng các khung HTML và JavaScript để xây dựng nội dụng sao cho thật "cool". Javascript cho phép các nhà phát triển có thể xây dựng các trang Web với ảnh động, menus nổi, các cửa sổ pop-up, v.v... Nhưng các hacker cũng nhanh chóng nhận ra một lỗ hổng mới.

Các hacker nhận ra rằng, khi người dùng truy cập các trang Web, họ có thể tải bất kỳ trang web (ngân hàng, bán đấu giá, cửa hàng, Web mail, v.v...) trên chung 1 cửa sổ trình duyệt Web. Và nếu sử dụng JavaScript, hacker có thể vượt qua ranh giới giữa hai trang web, có thể đọc dữ liệu trang Web này từ 1 trang Web khác. Hacker có thể ăn cắp tên và mật khẩu người dùng đã nhận, ăn cắp cookie, hay tác động lên các thông tin cá nhân hiển thị trên màn hình. he báo cáo các vấn đề như một lỗ hổng trình duyệt Web. Để đối phó với lỗ hỏng này, các nhà phát triển trình duyệt Web đã đưa ra chính sách cùng nguồn gốc (same-origin policy). Chính sách này chỉ cho phép các đoạn script chạy trên các trang cùng 1 gốc (cùng scheme, hostname và số cổng), không giới hạn sự truy cập DOM lẫn nhau, nhưng lại ngăn chặn truy cập DOM từ các trang khác. Cũng từ đó, các hacker đã khám phá nhiều cách thông minh hơn đã lợi dụng lỗ hổng XSS này.

Các bộ công cụ khám phá lổ hổng XSS

Việc tìm kiếm và lợi dụng lỗ hổng XSS rất phức tạp và tốn nhiều thời gian. Vì vậy việc sử dụng các công cụ là rất cần thiết. Trong phần này, tôi sẽ giới thiệu một vài công cụ phổ biến.

Burp

Proxy là một máy chủ, làm trung gian giữa máy khách và các máy chủ Web. Proxy sẽ nhận yêu cầu từ máy khách và gửi yêu cầu đến các máy chủ Web, sau đó lại trả kết quả về cho máy khách. Thỉnh thoảng, proxy có thể được sử dụng để thay đổi dữ liệu đến và đi, hoặc dụng nó để theo dõi các gói tin được gửi qua lại.

Burp Proxy là một phần của bộ công cụ viết bằng Java là Burp Suite, cho phép thâm nhập vào các ứng dụng Web. Khi cấu hình và chạy Burp Proxy, bạn có thể theo dõi mọi dữ liệu được gửi và nhận bởi một máy khách. Nó cho phép bạn tìm các thông tin được gửi và thay đổi chúng. Tất nhiên những dữ liệu bị that đổi được gửi đến trình duyệt của bạn, và nó chỉ có tác dụng với bạn mà thôi. Tuy nhiên, nếu nó có thể tắt tính năng bảo vệ Javascript ở máy khách thì nó có thể thực hiện các hành vi bất chính, như tấn công XSS. Nó cũng có thể được sử dụng để loại bỏ nhiều thông tin có thể bị rò gỉ như cookie, các link dẫn, hoặc các thông tin dư thừa, làm chậm việc khai thác lỗ hổng. Một tính năng hữu dụng khác là việc có thể chuyển sang hex mode (nhìn mã hexa của gói tin), tính năng này đặc biệt hữu dụng khi xem các trang Web sử dụng encode không chuẩn như US-ASCII hay UTF-16

Burp Proxy là một trong những công cụ hữu dụng nhất trong đánh giá bảo mật các ứng dụng Web. Nó không chỉ giúp khám phá những thứ rõ ràng, nó có thể tuỳ biến bằng cách viết các quy tắc riêng nếu bạn biết mình đang tìm kiếm điều gì. Ví dụ, bạn chỉ muốn tìm các file XML để gỡ rối Ajax, bạn có thể viết quy tắc để Burp Proxy thực hiện điều này.

Các tiện ích mở rộng gỡ rối của trình duyệt Firefox

Trong phần này, tôi sẽ giới thiệu những công cụ và kỹ thuật để đi sâu vào thế giới phức tạp của các ứng dụng Web, đặc biệt là các tiện ích mở rộng của trình duyệt Firefox.

DOM Inspector

Một tính năng rất quan trọng của DHTML (Dynamic Hypertext Markup Language) và Ajax là chúng nó thể hiển thị những nội dụng động trên cấu trúc HTML của ứng dụng Web. Điều này giúp các ứng dụng Web chạy nhanh hơn, và hiệu quả hơn, bởi vì chỉ một phần trang Web được cập nhật thay vì toàn bộ. Biết về sự thay đổi cấu trúc HTML (DOM) là bước đầu tiên để kiểm tra bảo mật. Đó là khi chúng ta sử dụng DOM Inspector.

Khi bật DOM Inspector, hộp thoại sẽ hiện lên. Hộp thoại có 4 phần chính. Phần trên là những thông tin về tài nguyên được kiểm tra. Phần giữa là hai phần kết quả kiểm tra, được thể hiện dưới dạng cây, nơi mà bạn có thể lựa chọn cấu trúc bạn muốn khám phá: CSS, DOM, Javascript, v.v... Bên dưới là nội dung của trang Web được kiểm tra. Ví dụ như hình dưới đây.

DOM

Phần ở giữa, nơi thể hiện kết quả kiểm tra là phần quan trọng nhất. Bạn có thể di chuyển trong cấu trúc DOM bằng cách đóng và mở các nhánh của cây ở bên trái, và kết quả sẽ được cập nhật ở bên phải. Nếu bạn là một nhà thiết kế giao diện, bạn có thể sẽ thấy thích thú với việc khám phá nhiều thành phần CSS, nếu bạn là một nhà phát triển Web hay một người nghiên cứu bảo mật, bạn có thể thích kiểm tra DOM Javascript. Mỗi phần của cây đều cho phép bạn lựa chọn các view khác nhau.

Bằng cách chuyển đổi giữa các view khác nhau, bạn có thể khám phá cấu trúc HTML của ứng dụng mà bạn đang kiểm tra. Bạn không cần phải kiểm tra một mớ hỗn độn của HTML, CSS và JavaScript. Nếu bạn chọn một nhánh trong DOM Inspector, bạn có thể copy và dán nó vào nơi khác. Bạn có thể đọc mã XML tạo ra nhánh đó hoặc highlight các thành phần trong trang HTML. Tất cả những hành động này đều có thể thực hiện thông qua menu của DOM Inspector.

DOM Inspector có tiện ích là "Evaluate Expression" có thể được sử dụng để tác động vào cấu trúc DOM bằng các biểu thức Javascript. Nếu bạn muốn thay thể tham số referrer bạn hãy gõ đoạn mã sau vào hộp thoại "Evaluate Expression".

target.referrer = 'http://evil/?<script>alert(\'xss\')<script>'

Biểu thức này sẽ thay thế referrer bằng giá trị bạn đã định nghĩa. Sau khi biểu thức được thực thi, trong tương lai, tất cả các giá trị referrer sẽ được thay bằng giá trị http://evil?<script>alert(‘xss’)</script>.

Điều này có ảnh hưởng đến XSS trong nhật ký của máy chủ, hoặc bất cứ phần nào khác nơi là trường referrer được sử dụng. DOM Inspector là một tiện ích mở rộng mạnh nhất của Firefox dung cấp khả năng kiểm tra các ứng dụng Web phức tạp bằng một vài click chuột. DOM Inspector đã được tích hợp sẵn vào Firefox, và bạn có thể sử dụng mà không cần cài đặt thêm một thành phần nào khác.

Tiện ích mở rộng Web Developer

Khi cần thực hiện việc kiểm tra trang Web bằng tay, muốn kiểm tra thâm nhập thì trước hết cần phải hiểu những gì diễn ra bên trong hệ thống của trang Web, những điều mà thông thường được thực hiện trên máy chủ và không nhìn thấy được. Một trong những công cụ tốt nhất hỗ trợ cho việc kiểm tra này là tiện ích mở rộng Web developer (thông tin chi tiết có thể tìm thấy tại địa chỉ http://chrispederick.com/work/web-developer/). Web Developer cung cấp một loạt các công cụ, thường được sử dụng để phát triển và gỡ rối các ứng dụng Web, bởi vì các đối tượng CSS, JavaScript và các chức nằng khác có thể gây khó hiểu cho các đối tượng. Trong bài viết này, tôi không đi hết tất cả các tính năng của Web Developer, tôi sẽ tập trung vào các tính năng quan trong liên quan đến việc kiểm tra lỗ hổng XSS, trước hết là tính năng "Convert Form Method".

Bạn có thể nhận thấy rằng, các form là một nơi thường được sử dụng để chèn các đoạn mã XSS. Tuy nhiên, bạn cũng có thể thấy rằng, các form này thường sử dụng phương thức POST thay vì GET. Và có rất nhiều chương trình được xây dựng mà không quan tâm tới phương thức được sử dụng là GET hay POST. Nhưng, thay vì tải toàn bộ HTML về máy tính của bạn, thay thế bằng thay POST thành GET, và đưa nó trở lại (với hy vọng rằng các URL kết nối không ảnh hưởng đến ứng dụng), bạn có thể sử dụng tính nằng "Convert Form Method" để chuyển đổi qua lại giữa phương thức POST và GET.

Một công cụ rất hữu dụng khác để chỉnh sửa HTML là chức năng "Edit HTML". Chức năng này cho phép bạn chỉnh sửa và xem kết quả ngay lập tức trên chính cửa sổ trình duyệt của bạn. Cách tiếp cận này nhanh hơn rất nhiều so với việc tải trang HTML về hay sử dụng proxy.

Các tiện ích mở rộng của Firefox giúp phân tích lưu thông HTTP

Khả năng phân tích và thay đổi các lưu thông HTTP là rất cần thiết cho việc kiểm tra các ứng dụng Web. Sức mạnh của việc điều khiển dữ liệu qua lại một ứng dụng Web sẽ giúp chúng ta tìm ra các bug, dò lỗ hổng và lợi dụng nó, và nó cũng giúp kiểm tra các ứng dụng Web. Trong phần này, tôi sẽ giới thiệu một vài công cụ giúp chúng ta thực hiện công việc này.

LiveHTTPHeaders

LiveHTTPHeaders là một tiện ích mở rộng của Firefox giúp chúng ta phân tích và tái hiện lại các truy vấn HTTP. Công cụ này có thể được cài đặt trực tiếp từ địa chỉ http://livehttpheaders.mozdev.org. Ở đây, bạn cũng có thể tìm thấy nhiều thông tin hữu ích khác. Có hai cách chính để sử dụng LiveHTTPHeaders. Nếu bạn chỉ muốn theo dõi lưu thông, bạn chỉ cần mở một thanh hiển thị của LiveHTTPHeaders bằng cách truy cập View > Sidebar > Live HTTP Headers. Tuy nhiên nếu bạn muốn sử dụng toàn bộ tính năng, bạn nên mở nó trên một cửa sổ riêng biệt, bằng cách truy câp Tools > Live HTTP Headers. Cửa sổ chương trình sẽ có dạng như hình dưới đây.

liveHTTPHeader

Cửa sổ chương trình Live HTTP Headers được chia thành nhiều Tab với các chức năng tương ứng. Phần giữa màn hình là nơi các truy vấn và trả lời được hiển thị. Mỗi cặp truy vấn - trả lời này được ngăn cách bằng các đường kẻ ngang. Phần dưới của màn hình là các nút điều khiển và checkbox "Capture" (chế độ bắt gói tin có được bật hay không). Ngoài việc theo dõi các lưu thông trên mạng, LiveHTTPHeaders còn cho phép bạn tái hiện lại các truy vấn. Đây là một phần của chương trình rất hữu ích khi dùng để kiểm tra bảo mật các ứng dụng Web. Có thể truy cập đến các truy vấn cũ giúp chúng ta thay đổi các truy vấn này nhằm mục đích kiểm tra các lỗ hổng bảo mật và các bugs. Để sử dụng tính năng này, bạn hãy chọn một danh sách các truy vấn bất kỳ, và ấn nút Replay. Bạn hoàn toàn có thể thay đổi các gói tin được gửi đi, như thay đổi phương thức (GET và POST), thay đổi tiêu đề gói tin, thay đổi các tham số, v.v...

LiveHTTPHeaders là một trong những công cụ hữu ích nhất khi nó được dùng để tìm các lỗ hổng XSS. Chúng ta có thể dễ dàng truy cập nội dung các truy vấn, thay đổi chúng và gửi chúng chỉ cần một vài click chuột. Nếu bạn đã sử dụng LiveHTTPHeaders, bạn dễ dàng nhận ra rằng, việc tái hiện các truy vấn này sẽ cho kết quả ngay trên trình duyệt của bạn. Không giống như các công cụ khác như proxy chẳng hạn, bạn cần phải nhìn vào sự thay đổi cấu trúc HTML. LiveHTTPHeaders cung cấp một giao diện trực quan với những thay đổi được thể hiện ngay trên màn hình.

ModifyHeaders

ModifyHeaders là một tiện ích mở rộng cho phép chúng ta tự động hoá việc thay đổi các gói tin HTTP. Tiện ích này có thể được cài đặt từ địa chỉ http://modifyheaders.mozdev.org.

ModifyHeaders là một tiện ích cần phải có đối với những người nghiên cứu bảo mật. Mục tiêu của tiện ích này là tạo thêm hay thay đổi tiêu đề của bất kỳ truy vấn nào. Tính năng này có thể được sử dụng trong rất nhiều trường hợp. Cửa sổ chương trình tương tự như hình dưới đây khi bạn truy cập từ Tools > Modify Headers

modifyHeaders

Một trong những mục tiêu của tiện ích này là xác định vị trí XSS khi các encode khác nhau được sử dụng. Nên nhớ rằng XSS không phải là một lỗi đơn giản, và nếu bạn không tìm ra lỗ hổng khi sử dụng các thiết đặt mặc định của trình duyệt, rất có thể có những lỗ hổng khi sử dụng một vài thiết đặt khác biệt, nhưng accepted-charset

TamperData

Một tiện ích khác đi cùng với LiveHTTPHeaders và ModifyHeaders là TamperData. TamperData là tiện ích duy nhất cho phép những người kiểm tra bảo mật trang Web hay những kẻ tấn công có thể dễ dàng thay đổi nội dung của truy vấn trước khi nó được gửi đến máy chủ. Bằng cách này, nó đưa ra những tính năng giống như Replay của LiveHTTPHeaders nhưng TamperData cung cấp thêm nhiều tính năng hữu ích khác. TamperData có thể được cài đặt từ địa chỉ http://tamperdata.mozdev.org. Cửa sổ tiện ích này giống như hình dưới đây khi truy cập từ Tools > Tamper Data

tamperdata

Để bất đầu thay đổi dữ liệu, bạn hãy click Start Tamper và gửi truy vấn. Bạn có thể thay đổi bất kf thông tin nào bạn muốn và gửi nó đến máy chủ. Bạn có thể nhận ra rằng, rất nhiều lỗi XSS hay SQLInjection đều có chung một vấn đề (vector tấn công giống nhau). TamperData dung cấp một tính năng mà bạn có thể dễ dàng lựa chọn các vector bạn muốn và chúng sẽ được thêm vào các trường tương ứng. Điều này giúp quá trình tìm các bug dễ dàng hơn và nhanh hơn rất nhiều. Để sử dụng vector, bạn hãy click chuột phải vào trường bạn muốn thay đổi và chọn trong dang sách được đưa ra. Bạn có thể chọn giữa các menu con của data, XSS, SQL vectors. Một khi vector được chọn, quá trình thay đổi truy vấn là hoàn toàn tự động, bạn chỉ cần ấn OK. Mọi thay đổi này sẽ cho kết quả ngay trên trình duyệt của bạn. Bạn có thể dễ dàng quay lại, tìm hiểu và tái hiện các truy vấn trên trình duyệt của mình.

Đó vẫn chưa phải là tất cả những gì TamperData dung cấp cho bạn. Tính năng làm TamperData khác với các tiện ích khác chính là khả năng lựa chọn payload để tấn công. TamperData được thiết kế để sử dụng như là một công cụ thử them nhập hệ thống. Nó được tích hợp sẵn rất nhiều payload. Và bạn cũng có thể thêm vào những phần của riêng mình trong cửa sổ Extension Configuration. Để sử dụng tính năng này, bạn click Options trên màn hình chính. Bạn có thể dễ dang lựa chọn các payload trong danh sách được đưa ra. Tính năng này khiến TamperData là một công cụ tốt nhất giúp bạn tìm kiếm các lỗ hổng XSS.