Lập trình C++ / C# — August 4, 2016 at 5:03 am

Những lỗi bảo mật thường gặp trong ứng dụng web

by

Dưới đây là những lỗi bảo mật của một website hoặc webapp mà các lập trình viên cần nên tránh nếu không muốn website của mình bị phá hủy bới những hacker

2. Cross-Site Request Forgery(CSRF,XSRF)

Tấn công CSRF là giả mạo request hay nói cách khác là làm sai lệch bản chất của một request mà user ( hay chính xác hơn là browser) không thể nhận biết được. Ví dụ, giả sử trên một page có sử dụng thẻ img để load hình ảnh như sau:

![””/](”/picture.jpg” alt=””/)

Vì một lý do nào đó (do bị hack hay do sự nhầm lẫn của developer) thẻ img có thể bị biến đổi thành

![””/](”/account/logout” alt=””/)

Khi đó, nếu page này được load, browser sẽ làm một request tới server mục đích là load hình ảnh nhưng thực chất lại khiến cho server thực thi code log out user. Đây chính là một dạng của CSRF.

Trong thực tế, tấn công CSRF thường ở dạng những đường link được gửi từ spammer tới email hoặc các social websites mà nếu user bất cẩn click vào sẽ bị redirect tới một page âm thầm submit form với thông tin user tới những nơi mà hacker mong muốn ( ví dụ như website của ngân hàng để thực hiện transaction). Khi đó, về mặt lý thuyết là chính user đó đang submit form nhưng trên thực tế user không hề hay biết.

Để ngăn chặn CSRF, chúng ta cần một cơ chế xác định có phải chính user muốn thực hiện request đó không. ASP.NET MVC cung cấp một giải pháp khá tốt cho vấn đề này gọi là token verification. Đầu tiên, developer sẽ sử dụng hàm Html.AntiForgeryToken để sinh ra một hidden field nằm trong form mà chứa một giá trị bất kỳ duy nhất. Giá trị này cũng sẽ được lưu trong một session cookie ở phía browser của client. Khi form được submit, 2 giá trị này sẽ được so sánh nhờ vào action filter ValidateAntiforgeryToken.

Giải pháp token verification sẽ xử lý được hầu hết các tấn công CSRF thông thường, nhưng không phải tất cả. Một giải pháp khác tương tự token verification nhưng thay vì kiểm tra token tự sinh ra thì sẽ kiểm tra thuộc tính HttpReferrer của request để đảm bảo request đến từ page được sinh ra bởi chính site đang nhận request chứ không phải đến từ một page được sinh ra bởi site nào khác. Giải pháp này gọi là HttpReferrer Validation. Developer có thể cài đặt logic kiểm tra trong một action filter mà sẽ được thực thi trước khi thực thi code action method như ví dụ dưới đây:

public class IsPostedFromThisSiteAttribute : AuthorizeAttribute
{
    public override void OnAuthorize(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext != null)
        {
            if (filterContext.HttpContext.Request.UrlReferrer == null)
                thrownew System.Web.HttpException("Invalid submission");
            if (filterContext.HttpContext.Request.UrlReferrer.Host != "trandev90.com.com")
                thrownew System.Web.HttpException("This form wasn't submitted from this site!");
        }
    }
}

Một quy tắc giúp giảm nhẹ khả năng tấn công CSRF là luôn xử lý những thay đổi dữ liệu trong database hay trong site dưới dạng POST request.

3. Cookie Stealing

Website sử dụng cookies để lưu thông tin user giữa các request (user’s session). Cookies có thể chứa những thông tin không quan trọng như preferences hay history hoặc có thể lưu những thông tin rất quan trọng ví dụ như authentication ticket.

Có 2 loại cookies:

Session cookie: Những cookies chứa trong bộ nhớ của browser và sẽ bị mất đi khi tắt browser hoặc khi user session timeout.

Persistent cookies: Những cookies được lưu trữ trong các file text trên ổ cứng của user và sẽ không bị mất đi trừ khi user clear cache browser.

Cùng với sự tiện lợi thì cookies cũng là cơ hội để hacker sử dụng XSS để ăn cắp cookies của user và sau đó sử dụng nó để giả danh user thực hiện các thao tác khác. Bởi vì XSS phụ thuộc vào script để có thể ăn cắp cookies nên một cách hiệu quả để chống mất cắp cookies là không cho phép script access cookies bằng cách sử dụng HttpOnly.

Để ngăn chặn script access lên tất cả cookies của site, set config sau trong web.config:

<system.web>

<httpCookiesdomain=””requireSSL=”false”httpOnlyCookies=”true”/>

</system.web>

Để set HttpOnly lên từng cookie có thể sử dụng code khi ghi cookie như sau:
Response.Cookies[“MyCookie”].Value = “Remembering you…”;

Response.Cookies[“MyCookie”].HttpOnly = true;

4. Over-Posting

Over-posting xảy ra trong những web framework sử dụng tính năng model binding, chẳng hạn như trong ASP.NET MVC. Khi một view sử dụng model để render html nhưng không render hết các property của model sẽ tạo cơ hội cho hacker sử dụng các công cụ web development để chèn thêm các giá trị không mong muốn vào các property của model không được render.

Cách đơn giản để ngăn tình trạng này xảy ra là sử dụng attribure Bind để xác định tường minh property nào của model sẽ được binding. BindAttribute có thể được đặt trên model class hoặc trong các tham số của action method. Ví dụ:

[Bind(Include=”Name, Comment”)]

public class Review

{

publicint ReviewID { get; set; }

publicstring Name { get; set; }

publicstring Comment { get; set; }

publicbool Approved { get; set; }

}

Một cách khác là sử dụng hàm UpdateModel hoặc TryUpdateModel. Ví dụ:

UpdateModel(review, “Review”, newstring[] { “Name”, “Comment” });

5. Open Redirection

Bất kỳ ứng dụng web nào mà redirect tới một URL được mô tả qua query string hay form data đều có thể bị hacker khai thác để redirect user tới một site bên ngoài mà user lầm tưởng là của site hiện tại. Cách thức tấn công này gọi là open redirection.

Ví dụ dễ nhận biết là tham số ReturnUrl được include trong query string khi user được redirect tới page login trong ASP.NET MVC. Nếu tham số này bị thay đổi bởi hacker ( có thể dưới dạng những link mà hacker gửi đến user) và code server không validate tham số này thì khi user login thành công sẽ được redirect tới site của hacker mà hacker có thể giả dạng site hiện tại để yêu cầu user nhập lại username/password hoặc nhập thêm thông tin khác.

Trong ASP.NET MVC 1 và 2 không có code template cho việc validate URL, Từ ASP.NET MVC trở đi, framework cung cấp một hàm để validate URL tên là Url.IsLocalUrl và template cũng sinh ra một đoạn code để validate returnURL sau khi user login thành công như sau:

private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(“Index”, “Home”);
}
}

Trên đây là những lỗi bảo mật của ứng dụng web thường gặp mà chúng tôi đã chia sẻ với các bạn. Hy vọng các bạn sẽ sớm khắc phục được những lỗi trên. Cảm ơn đã theo dõi!

Nguồn: trandev90

Leave a Comment

Your email address will not be published. Required fields are marked *