Series bảo mật trong ASP.NET MVC - 3: Tấn công Cross-Site Scripting (XSS) Bảo mật


Tấn công Cross-site Scripting (XSS) là cách tấn công bằng việc đẩy các đoạn mã javascript vào hệ thống thông qua các trường nhập liệu, kiểu tấn công này là phổ biến nhất và cho phép các hacker có thể lấy cắp thông tin đăng nhập và các dữ liệu có giá trị nhằm khai thác hệ thống.

https://www.codeproject.com/KB/aspnet/1116318/Fig17.jpg

Hình 1. Cross Site Scripting (XSS).

Hacker sẽ ghé thăm một website sau đó cố gửi các đoạn mã script có hại vào ô comment hoặc bất cứ ô nhập liệu nào. Nếu website không kiểm tra và cho phép nhúng các mã độc thì code sẽ được thực thi trên website của bạn.

Hãy thử ví dụ dưới đây một form nhân viên chúng ta dùng để lưu dữ liệu. Trong textbox tôi đã cố gắng thực thi một vài đoạn mã có hại sử dụng javascript sử dụng thẻ SCRIPT. Nhưng nếu chúng ta cố gắng thực thi chúng trên MVC sẽ gặp lỗi.

Mặc định ASP.NET đã ngăn chặn tấn công XSS

Một giá trị nguy hiểm được tìm thấy trong Request.Form như sau: ("<script>alert('hi');").

Đây là lỗi xẩy ra bởi vì MVC đã kiểm tra dữ liệu được nhập vào từ người dùng và nếu người dùng cố gắng thực thi đoạn script sẽ không được phép.

https://www.codeproject.com/KB/aspnet/1116318/Fig18.jpg

Hình 2. Cố tính gửi đoạn script có hại sẽ gặp lỗi

Nhưng nếu chúng ta cần đẩy thẻ SCRIPT lên. Ví dụ trang web lập trình đăng code mẫu sẽ cần người dùng gửi code mẫu lên có chứa thẻ script. Trong tình huống này chúng ta có 4 thứ có thể cho phép script được đăng lên:

Giải pháp: -

  1. [ValidateInput(false)]
  2. [AllowHtml]
  3. [RegularExpressionAttribute]
  4. AntiXSS Library

Giải pháp 1:

ValidateInput

[ValidateInput] là một attribute có thể áp dụng trên cả Controller hoặc Action Method mà chúng ta muốn script được đi qua.

Nếu chúng ta muốn cho phép đăng đoạn mã lên chỉ cần set thuộc tính thành False ([ValidateInput(false)]) chúng ta sẽ không validate nội dung truyền lên. Nếu chúng ta set thành true [ValidateInput(true)]) thì nó sẽ kiểm tra nội dung truyền lên. Theo cách này nếu bạn áp dụng nó vào Controller thì nó sẽ áp dụng vào toàn bộ các action method trong controller đó và nếu bạn chỉ áp dụng trên từng Action Method thì sẽ chỉ có tác dụng trên method đó mà thôi.

ValidateInput áp dụng cho tất cả các property của Model (EmployeeDetails).

Ảnh chụp khi áp dụng ValidateInput trên phương thức HttpPost

https://www.codeproject.com/KB/aspnet/1116318/Fig19.jpg

Hình 3. Áp dụng ValidateInput trên phương thức với POST.

Sau khi đã áp dụng ValidateInput Attribute

https://www.codeproject.com/KB/aspnet/1116318/Fig20.jpg

Hình 4. Đây là đoạn code cho phép đăng script lên thông qua method POST

Giải pháp 2:

AllowHtml

Attribute [AllowHtml] được áp dụng cho các thuộc tính của Model không muốn kiểm tra. Điều này cho phép đăng HTML lên hệ thống thông qua trường thuộc tính được đặt attribute này.

Đoạn code dưới đây tôi đã áp dụng AllowHTML trên trường Address của EmployeeDetail

https://www.codeproject.com/KB/aspnet/1116318/Fig21.jpg

Sau khi áp dụng [AllowHtml] trên thuộc tính Address, thuộc tính Address sẽ không kiểm tra và cho phép HTML được submit vào.

https://www.codeproject.com/KB/aspnet/1116318/Fig22.jpg

Hình 5. Sau khi thêm [AllowHtml] vào trường Address thì có thể đăng đoạn Script này lên

Giải pháp 3:

Regular Expression

Cách thứ 3 để chống tấn công XSS là cho phép tất cả các trường đều phải validate những dữ liệu đầu vào theo một Regex. Điều này sẽ ngăn chặn việc nhập dữ liệu không mong muốn vào hệ thống.

Sử dụng Regex để kiểm tra đầu vào

https://www.codeproject.com/KB/aspnet/1116318/Fig23.jpg

Danh sách các mẫu Regex phổ biến cần thiết.

Ký tự và khoảng trắng

[a-zA-Z ]+$

Chri ký tự a-z

^[A-z]+$

Số

^[0-9]+$

Số, chữ thường và chữ hoa

^[a-zA-Z0-9]*$

Email

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Số điện thoại (tùy vùng)

^([7-9]{1})([0-9]{9})$

Ngày tháng( mm/dd/yyyy | mm-dd-yyyy | mm.dd.yyyy)

/^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d+$/

Website URL

^http(s)?://([\\w-]+.)+[\\w-]+(/[\\w- ./?%&=])?$

Số thẻ tín dụng

Visa

^4[0-9]{12}(?:[0-9]{3})?$

MasterCard

^5[1-5][0-9]{14}$

American Express

^3[47][0-9]{13}$

Số thập phân

((\\d+)((\\.\\d{1,2})?))$

Giải pháp 4:-

Thư viện AntiXSS

Giải pháp thứ 4 này để chống tấn công XSS bằng cách sử dụng MicrosoftAntiXSSLibrary sẽ giúp bảo vệ ứng dụng của bạn.

Nào giờ hãy cài đặt MicrosoftAntiXSSLibrary từ Nuget chỉ cần chuột phải vào project chọn Manage Nuget Packages.

https://www.codeproject.com/KB/aspnet/1116318/Fig24.jpg

Sau khi chọn thì một cửa sổ hiển thị bạn tìm thư viện AntiXSSLibrary trong ô tìm kiếm và chọn AntiXSS sau đó click Install.

https://www.codeproject.com/KB/aspnet/1116318/Fig25.jpg

Sau khi cài đặt thành công

https://www.codeproject.com/KB/aspnet/1116318/Fig26.jpg

Sau khi cài đặt chúng ta có thể xem cách sử dụng như sau:

Sanitizer Class

https://www.codeproject.com/KB/aspnet/1116318/Fig27.jpg

Fig 27. Sanitizer Class dùng để làm sạch input

Hình dưới đây mô tả cách sử dụng của Sanitizer Class

Sanitizer là class static có thể truy cập bất cứ mọi nơi chỉ cần đưa input của trường nào vào là có thể kiểm tra được, nó sẽ kiểm tra và trả về chuỗi kết quả đã được làm sạch.

https://www.codeproject.com/KB/aspnet/1116318/Fig28.jpg

Chúng ta có thể sử dụng phương thức này để lọc các script có hại được đẩy vào database và hiển thị lên trình duyệt.

Thủ thuật: Sử dụng [ValidateInput(false)] hoặc [AllowHtml] trước khi sử dụng AntiXSS để tránh lỗi đưa ra: “A potentially dangerous Request.Form”



Trích nguồn từ: (codeproject.com)