Thế nào là tấn công giả mạo request (Cross-site Request Forgery) Thủ thuật lập trình


Cross-site Request Forgery (CSRF), XSRF nói đến việc tấn công vào chứng thực request trên web thông qua việc sử dụng Cookies, nơi mà các hacker có khả năng sử dụng thủ thuật để tạo request mà bạn không hề biết. Vì vậy, một CSRF là hacker lạm dụng sự tin tưởng của một ứng dụng web trên trình duyệt của nạn nhân.

CSRF là một kiểu tấn công gây sự nhầm lẫn tăng tính xác thực và cấp quyền của nạn nhân khi gửi một request giả mạo đến máy chủ. Vì thế một lỗ hổng CSRF ảnh hưởng đến các quyền của người dùng ví dụ như quản trị viên, kết quả là chúng truy cập được đầy đủ quyền.

Trong khi một tấn công CSRF trình duyệt của nạn nhân bị lừa để gửi đi các request đến ứng dụng web theo mong muốn của kẻ tấn công, thông thường, ví dụ một yêu cầu sẽ được gửi lên để thay đổi một vài dữ liệu phía server.

Khi gửi một request HTTP (hợp pháp hoặc cách khác), trình duyệt của nận nhân sẽ bao gồm các tiêu đề cookie. Các cookie thường được dùng để lưu trữ một session để định danh người dùng không phải xác thực lại cho mỗi yêu cầu gửi lên, điều này hiển nhiên là không thực tế.

Nếu phiên làm việc đã xác thực của nạn nhân được lưu trữ trong một Cookie vẫn còn hiệu lực (một cửa sổ trình duyệt không nhất thiết phải mở), và nếu ứng dụng dễ bị tấn công CSRF, kẻ tấn công có thể thử dụng CSRF để chay bất cứ yêu cầu nào với trang web mà trang web không thể phân biệt được request nào là hợp pháp hay không.

Cross-site Request Forgery với các GET request

Ví dụ đơn giản dưới đây mô tả làm thế nào để CSRF có thể lạm dụng một GET request thông qua việc sử dụng thẻ <img>.

<img src="http://example.com/changePassword.php/?newPassword=attackerPassword">

 

Ví dụ trên về việc tấn công CSRF sử dụng HTTP GET. Nếu một nạn nhân ghé thăm một trang web được điều khiển bởi một kẻ tấn công, trình duyệt sẽ gửi một yêu cầu chứa cookie được kẻ tấn công chế ra. Tất nhiên lỗi này là lỗi sơ đẳng nhưng không vì thế mà không thể xảy ra.

Cross-site Request Forgery với POST requests

Các yêu cầu phương thức GET, tuy nhiên không chỉ có các phương thức HTTP bị các hacker lạm dụng. Các yêu cầu POST nhạy cảm với việc tấn công CSRF, tuy nhiên một kẻ tấn công sẽ cần sử dụng một chút JavaScript để gửi POST request.

Ví dụ dưới đây mô tả làm sao để CSRF có thể bị lạm dụng sử dụng POST request thông qua việc sử dụng thẻ <iframe>. Đoạn code dưới đây sẽ tải một iframe ngầm mà nạn nhân không hề biết.

iframe

<iframe src="http://attacker.com/csrfAttack" style="width:0;height:0;border:0;border:none;"></iframe>

 

Nội dung iframe

<body onload="document.getElementById('csrf').submit()">
<form id="csrf" action="http://example.com/changePassword.php" method="POST">
<input name="newPassword" value="attackerPassword" />
</form>
</body>

 

Ngăn chặn lỗ hổng CSRF

Có hai cách tiếp cận có thể ngăn chặn CSRF – đồng bộ hóa cookie với một mã token chống CSRF được cung cấp cho trình duyệt hoặc không cho trình duyệt gửi Cookie đến ứng dụng web trong lần đầu tiên.

Anti-CSRF tokens

Kỹ thuật phòng ngừa được sử dụng rộng rãi và khuyến nghị là sử dụng để ngăn chặn các cuộc tấn công CSRF được biết đến là anti-CSRF token, cũng có khi được biết đến là các mã đồng bộ.

Khi một người dùng gửi một form hoặc tạo các request được chứng thực yêu cầu một cookie, một mã token anti-CSRF nên được bao gồm trong request. Ứng dụng web sẽ xác nhậncác token đã tồn tại và chính xác trước khi xử lý yêu cầu. Nếu token không có hoặc không đúng thì request sẽ bị từ chối.

It’s highly recommended that you use an existing, well tested and reliable anti-CSRF library. Depending on your language and framework of choice, there are several high-quality open source libraries that are ready-to-use.

Bạn nên sử dụng một thư viện đã có, đã được kiểm tra và tin tưởng để phòng chống CSRF. Phụ thuộc vào ngôn ngữ của bạn sử dụng, có vài thư viện mã nguồn mở rất mạnh. Ví dụ trong ASP.NET MVC là ValidateAntiForgeryToken

Các đặc tính của một thiết kế tốt để chống CSRF cần có như sau:

  • Token chống CSRF nên được sử dụng trong mỗi session.
  • Phiên làm việc nên tự động hết hạn sau một khoảng thời gian phù hợp.
  • Token chống CSRF nên được max hóa với một giá trị ngẫu nhiên với độ dài đủ an toàn.
  • Token chống CSRF nên được mã hóa và được tạo ra bởi một giải thuật mã hóa mạnh.
  • Token chống CSRF được thêm vào một trường hidden field trong form hoặc với URL (chỉ cần thiết nếu GET request thay đổi trạng thái)
  • Máy chủ nên từ chối các yêu cầu nếu mã token chống CSRF không đúng.

Same-site Cookies

Thuộc tính Cookie cùng một trang web là một thuộc tính mới có thể được đặt trên Cookies để hướng dẫn trình duyệt tắt tính năng sử dụng của bên thứ ba đối với Cookies cụ thể.

Thuộc tính cùng trang web được thiết lập bởi máy chủ khi thiết lập Cookie và yêu cầu trình duyệt chỉ gửi cookie của bên thứ nhất, do đó yêu cầu phải bắt nguồn từ cùng một yêu cầu nguồn gốc được tạo bởi các trang web bên thứ ba. Sẽ không bao gồm Cookie cùng một trang. Điều này có hiệu quả loại bỏ (CSRF) mà không cần sử dụng mã thẻ synchronizer. Thật không may, phương pháp CSRF này chỉ có hiệu quả trong một số trình duyệt hiện đại.

Trong khi các cuộc tấn công từ chối yêu cầu qua trang web (CSRF) không cung cấp cho kẻ tấn công phản hồi từ máy chủ, một kẻ tấn công thông minh có thể gây ra một số lượng thiệt hại đáng kể, đặc biệt khi kết hợp với cuộc tấn công kỹ thuật xã hội tốt với người dùng quản trị.


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