Skip to main content

CSRF/XSRF Cross-Site Request Forgery

Sự ra đời của CSRF

Năm 2001, Peter Watkins trong bài viết: "The Dangers of Allowing Users to Post Images" "trên bugtrag đã lần đầu tiên sử dụng thuật ngữ CSRF.

CSRF (Cross-Site Request Forgery) là gì?


Cross-Site Request Forgery (CSRF / XSRF), là kiểu tấn công lừa người sử dụng thực hiện một hành động mà họ không mong muốn lên ứng dụng web, bằng chính quyền của người dùng đó. Sử dụng một số thủ thuật social engineering đơn giản (như gửi link qua email, chát), hacker có thể lừa người dùng thực hiện một số tác vụ lên ứng dụng web bị lỗi CSRF như: xóa bài, thêm người dùng, thay đổi email, thay đổi mật khẩu của victim ... Nếu người bị lừa là Admin, thì hacker hoàn toàn có thể chiếm quyền điều khiển ứng dụng web đó.

Ví dụ: Trong giao diện quản trị admin control panel của một ứng dụng web cho phép admin xóa bài viết bằng request sau?


http://WebSites.com/admincp/index.php?act=delete&id=[color="#FF0000"]ID[/color]


Chuyện gì sẽ xảy ra nếu admin nhận được 1 email,đọc một comment có chèn đoạn code HTML sau:

<img src="http://WebSites.com/admincp/index.php?act=delete&amp;id=[color="#FF0000"]ID[/color]" /


Cookiee và CSRF


Nếu website phân biệt người dùng qua Cookie hoặc Session thì liệu có bị CSRF không. Câu trả lời là có. Khi kết nối tới server để load ảnh tại link trên, trình duyệt đã tự động điền cookie, session vào request đó.

Store CSRF

Phân biệt CSRF vs XSS (Cross-Site Scripting)

Website chỉ sử dụng POST có bị CSRF không

Đúng là việc khai thác CSRF qua POST sẽ khó hơn, mức độ nguy hiểm của những lỗi CSRF qua POST vì thế cũng bị đánh giá thấp hơn . Tuy nhiên, phải hiểu rằng, việc truyền biến qua POST không phải là giải pháp cho XSRF.

Các cách khai thác CSRF phổ biến

1. Khai thác qua các thẻ HTML
IMG SRC

<img src="http://host/?command">


SCRIPT SRC


<script src="http://host/?command">


IFRAME SRC

<iframe src="http://host/?command">


2. Khai thác qua Javascript (Thường dùng cho các request dạng POST)

'Image' Object


<script>
  var foo = new Image();
  foo.src = "http://host/?command";
  </script>


'XMLHTTP' Object
IE


<script>
  var post_data = 'name=value';
  var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  xmlhttp.open("POST", 'http://url/path/file.ext', true);
  xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState == 4)
  {
  alert(xmlhttp.responseText);
  }
  };
  xmlhttp.send(post_data);
  </script>


Mozilla

<script>
  var post_data = 'name=value';
  var xmlhttp=new XMLHttpRequest();
  xmlhttp.open("POST", 'http://url/path/file.ext', true);
  xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState == 4)
  {
  alert(xmlhttp.responseText);
  }
  };
  xmlhttp.send(post_data);
</script>

Ngoài ra còn rất nhiều kiểu khai thác khác nữa như sử dụng VBScript, Action Script, hay dùng các ngôn ngữ XML để thực hiện request.
CSRF ngoài việc khai thác trực tiếp qua trình duyệt, còn có thể khai thác qua Flash, Document file (PDF, DOC, EXEL ...), movie (WMA, AVI..), qua RSS, atom ...


Cách Pentest CSRF

Nếu website cho phép thực hiện các chức năng thông qua các request GET hoặc POST cố định thì có khả năng mắc lỗi CSRF. Tức là nếu mình replay lại được request POST hoặc GET trên thì có khả năng là website sẽ mắc lỗi.

Phòng chống CSRF

Một số quam niệm sai lầm


Sai lầm 1: Sử dụng POST để tránh CSRF. (Đã phân tích ở trên)
Sai lầm 2: Sử dụng Cookie để tránh CSRF. (Đã phân tích ở trên)
Sai lầm 3: Sử dụng Referer có thể khắc phục triệt để được CSRF

Đúng là việc check referer có thể khiến cho việc khai thác CSRF trở nên khó khăn hơn, nhưng điều đó không có nghĩa là bạn có thể dùng nó để chống CSRF. Tốt nhất là hãy code website để nó không mắc lỗi, chứ đừng để nó mắc lỗi mà đi tìm cách chặn kiểu khác thác của nó. Rõ ràng khi site bị CSRF, nếu ta relay thành công một request hợp lệ thì xem như sẽ khai thác được. Cái khó ở đây là website đó đã check referer. Vậy mấu chốt là phải giả được referer. Nếu bạn đã cài được 1 plugin lên trình duyệt của người dùng, thì xem như hết chuyện để nói, còn trên thực tế bạn có thể dùng XMLHTTP hoặc Flash để tạo ra request có referer giả

Vậy rốt cuộc, nên phòng chống CSRF như thế nào? Dưới đây là một số recomment:

1. Synchronizer Token Pattern:
Tạo thêm 1 trường ẩn có giá trị là token

<form action="/transfer.do" method="post">
  <input type="hidden" name="CSRFToken" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZjMTVi
  MGYwMGEwOA==">
  …
  </form>


2. Disclosure of Token in URL
Cách này đưa token lên URL, bạn vào các website mà có đường dẫn loằng ngoằng toàn số, chính là loại này.
Kiểu này có đặc điểm là không đẹp, khó SEO.

3. Viewstate (ASP.NET)
4. Double Submit Cookies

Kiểu này thực chất là khá giống kiểu 1, nhưng lấy ngay cookie làm trường ẩn.


Sưu tầm.

Share this with your friends
Loading...