CSRF là gì? Cách phòng tránh tấn công CSRF?

Chào các bạn, mình quay trở lại rồi đây. Hôm nay mình xin được viết về một chủ đề mà mình nghĩ mọi Web Developer nên phải biết. Đó là CSRF.

CSRF là gì?

  • CSRF là viết tắt của từ “Cross-Site Request Forgery”, đây là một kỹ thuật tấn công sử dụng quyền chứng thực của người dùng để thực hiện các hành động trên một website khác. Kỹ thuật này được xuất hiện lần đầu tiên vào năm 1990.
  • Rất nhiều “ông lớn” đã từng “ôm hận” vì bị dính phải kỹ thuật tấn công này.

Giải thích kịch bản tấn công

Thật ra có rất nhiều các hình thức tấn công nhưng mình chỉ giải thích một loại cơ bản nhất để các bạn có thể hiểu rõ về nó.

LƯU Ý: kịch bản chỉ mang tính chất minh họa, không phải là thuốc, không có tác dụng thay thế thuốc chữa bệnh.

Một thanh niên tên là A có tài khoản ngân hàng B và sử dụng dịch vụ internet banking của ngân hàng này.

Một ngày đẹp trời, thanh niên A đăng nhập vào web internet banking của ngân hàng B để gửi tiền về cho bố mẹ.

Ngay sau khi chuyển tiền xong thanh niên A vào trang web để đọc tin tức linh tinh. Danh sách tin tức sẽ như sau.

Thanh niên A chợt nhìn thấy mình được nhận xe SH nên ham hố bấm vào mà không suy nghĩ gì cả.

BÙM: tự nhiên SMS báo về tài khoản của bạn đã bị trừ 50 củ. Thanh niên A hốt hoảng không biết điều gì xảy ra…

Lúc này, chuyên viên điều tra tên là Tiến vào cuộc. Cuối cùng, chuyên viên đã tìm ra nguyên nhân về việc mất tiền này. Tiến xem source code của trang tin tức kia và:

Hóa ra link nhận xe SH kia không phải là link bình thường. Nó chính là cả 1 cái form chuyển tiền vào số tài khoản của hacker được ngụy trang dưới vỏ bọc của 1 link bình thường.

Những hình thức khác

Về cơ bản, hình thức này lợi dụng chính request của người dùng nên hacker có thể lợi dụng những thẻ mà khi người dùng load trang, resource được load theo. Ví dụ như:

  • Thẻ link:
<link rel="stylesheet" type="text/css" href="http://hihi.com/delete/all_post">
  • Thẻ script:
<script type="text/javascript" src="http://hihi.com/delete/all_post" charset="utf-8" async defer></script>
  • Thẻ CSS:
<p style="background-image: url(https://hihi.com/delete/all_post)"></p>

Cách thức phòng tránh tấn công CSRF

Phía người dùng

  • Không click vào các link lạ trên bất kỳ một trang nào.
  • Trong khi thực hiện các giao dịch quan trọng thì không vào các trang web khác, hoặc sử dụng trình duyệt ẩn danh sau đó tắt luôn.

Phía application, server

  • Chúng ta có thể thực hiện xây dựng captcha cho các yêu cầu quan trọng.
  • Sử dụng CRSF Token để xác thực các request của người dùng đến hệ thống (đặc biệt là POST, PUT, PATCH thì lúc nào cũng cần phải có). Trong mỗi form hay request, ta đính kèm một CSRF token. Token này được tạo ra dựa theo session của user. Khi gửi về server, ta kiểm tra độ xác thực của session này. Do token này được tạo ngẫu nhiên dựa theo session nên hacker không thể làm giả được (hầu hết tất cả các framework đểu hỗ trợ CSRF token).

Demo sử dụng trong bài viết

<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>

    <ul>
        <li><a href="/">Coffee</a></li>
        <li><a href="/">Tea</a></li>
        <li><a href="/">Milk</a></li>
      </ul>

    <form method="POST" action="http://B/banking/send-money">
        <input type="hidden" name="total_money" value="50000000" />
        <input type="hidden" name="account_number"" value="12345678910" />
        <button>Bấm vào đây để nhận xe SH miễn phí bạn ơi</button>
    </form>

    <style>
        ul {
            list-style-type: none;
            margin: 0;
        }

        form {
            padding-inline-start: 40px;
        }

        form button {
            display: list-item;
            text-align: -webkit-match-parent;
            border: none;
            background: none;
            padding: 0;
            cursor: pointer;
            color: blue;
            text-decoration: underline;
        }
    </style>
</body>
</html>


Tham khảo:

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *