Shang
Blog 👨‍💻
  • 🌸Introduction
  • 💻WEB SECURITY
    • Research Vulnerability
      • 📲Server-side topics
        • 🔏API Testing
        • 🔏Race conditions
        • 🔏XML external entity (XXE) injection
        • 🔏Server-side request forgery (SSRF)
        • 🔏File upload vulnerabilities
        • 🔏Access control vulnerabilities and privilege escalation
        • 🔏Business logic vulnerabilities
        • 🔏OS Command injection
        • 🔏Directory traversal
        • 🔏Authentication vulnerabilities
        • 🔏SQL injection
      • 📱Client-side topics
        • 🔏DOM-based vulnerabilities
        • 🔏Cross-origin resource sharing (CORS)
        • 🔏WebSockets
        • 🔏Clickjacking (UI redressing)
        • 🔏Cross-site request forgery (CSRF)
        • 🔏Cross-site scripting(XSS)
      • 🌀Advanced topics
        • 🔐Web cache poisoning
        • 🔐HTTP request smuggling
        • 🔐Prototype pollution
        • 🔐Server-side template injection(SSTI)
        • 🔐Insucure deserialization
    • Learn Java Vulnerability
      • Intro & Setup
      • Java Reflection Part 1
      • Java Reflection Part 2
    • Research Documents
      • 🎯DNS Rebinding
      • 🍪Remote Code Execution - Insecure Deserialization
      • 🍪Remote Code Execution on Jinja - SSTI Lab
      • 🍪Exploit cross-site request forgery (CSRF) - Lab
      • 🍪Exploit a misconfigured CORS - Lab
      • 🍪Same Origin Policy (SOP) - Lab
  • 📝WRITE-UP CTF
    • CTF Competitions
      • 🔰[WolvCTF 2023] Writeup Web
      • 🔰[M☆CTF Training 2023] Writeup Web
      • 🔰[HackTM CTF 2023] Writeup Web
      • 🔰[Incognito 4.0 2023] Writeup Web
      • 🔰[LA CTF 2023] Re-writeup Web
      • 🔰[Dice CTF 2023] Writeup Web
      • 🔰[ByteBandits CTF 2023] Writeup Web
      • 🔰[Knight CTF 2023] Writeup Web
      • 🔰[Sekai CTF 2022] Writeup Web
      • 🔰[WRECK CTF 2022] Writeup Web
      • 🔰[Maple CTF 2022] Writeup Web
    • CTF WarGame
      • ✏️[Root me] Writeup Sever Side
      • ✏️Websec.fr
      • ✏️[Root me] Writeup XSS Challenge
    • [tsug0d]-MAWC
      • 💉TSULOTT
      • 💉IQTEST
      • 🧬TooManyCrypto
      • 🧬NumberMakeup
    • Pwnable.vn
Powered by GitBook
On this page
  • CSRF là gì ?
  • Ảnh hưởng của cuộc tấn công CSRF
  • Cách thức CRFS hoạt động
  • Để có một cuộc tấn công CSRF hiệu quả, có 3 điều kiện chính:
  • Để đáp ứng điều kiện yêu cầu cho CSRF:
  • Cách xây dựng một cuộc tấn công CSRF
  • Cách truyền một CSRF exploit
  • Ngăn chặn tấn công CSRF
  • Cách CSRF token nên được truyền
  • CSRF Token không được truyền trong cookie.
  • Việc xác thực CSRF token phụ thuộc vào phương pháp request
  • Việc xác thực CSRF Token dựa trên token hiện có
  • CSRF Token không bị ràng buộc bởi session người dùng
  • CSRF Token bị ràng buộc bởi cookie không theo session
  • CSRF Token được sao chép đơn giản trong một cookie
  • Referer-based chống lại CSRF
  • Việc xác thực Referer dựa vào header hiện tại
  • Việc xác thực Referer có thể bị phá vỡ
  1. WEB SECURITY
  2. Research Vulnerability
  3. Client-side topics

Cross-site request forgery (CSRF)

Client Side Vul

PreviousClickjacking (UI redressing)NextCross-site scripting(XSS)

Last updated 2 years ago

CSRF là gì ?

CSRF hay còn gọi là kỹ thuật tấn công “Cross-site Request Forgery“, nghĩa là kỹ thuật tấn công giả mạo chính chủ thể của nó. CSRF 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. Đây là 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.

Ảnh hưởng của cuộc tấn công CSRF

Trong một cuộc tấn công CSRF thành công, kẻ tấn công gây cho nạn nhân tiến hành các hoạt động khoog có ý định từ trước.

Ví dụ: điều này có thể là thay đổi địa chỉ email trên tài khoản của họ, thay đổi mật khẩu của họ hoặc thực hiện chuyển tiền. Tùy thuộc vào bản chất của hành động, kẻ tấn công có thể có toàn quyền kiểm soát tài khoản của người dùng. Nếu người dùng bị xâm phạm có vai trò đặc biệt trong ứng dụng, thì kẻ tấn công có thể có toàn quyền kiểm soát tất cả dữ liệu và chức năng của ứng dụng.

Cách thức CRFS hoạt động

Để có một cuộc tấn công CSRF hiệu quả, có 3 điều kiện chính:

  • Một hành động có liên quan. Có một hành động trong ứng dụng mà kẻ tấn công có lý do để gây ra. Đây có thể là một hành động đặc quyền (chẳng hạn như sửa đổi quyền cho những người dùng khác) hoặc bất kỳ hành động nào đối với dữ liệu dành riêng cho người dùng (chẳng hạn như thay đổi mật khẩu của chính người dùng).

  • Xử lý phiên dựa trên cookie. Thực hiện hành động bao gồm việc đưa ra một hoặc nhiều yêu cầu HTTP và ứng dụng chỉ dựa vào cookie phiên để xác định người dùng đã thực hiện yêu cầu. Không có cơ chế nào khác để theo dõi phiên hoặc xác thực yêu cầu của người dùng.

  • Không có thông số yêu cầu không thể đoán trước. Các yêu cầu thực hiện hành động không chứa bất kỳ tham số nào có giá trị mà kẻ tấn công không thể xác định hoặc đoán được. Ví dụ, khi khiến người dùng thay đổi mật khẩu của họ, chức năng này không dễ bị tấn công nếu kẻ tấn công cần biết giá trị của mật khẩu hiện có.

Cho ví dụ: Giả sử một úng dụng chưa một hàm mà người dùng thay đổi email của tài khoản của họ. Khi đó người dùng thực hiện hành động, sẽ có một HTTP request như sau:

POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE

email=wiener@normal-user.com

Để đáp ứng điều kiện yêu cầu cho CSRF:

  • Hành động thay đổi địa chỉ Email trong tài khoản của người dùng được kẻ tấn công quan tâm. Sau hành động này kẻ tấn công sẽ có thực hiện reset lại mật khẩu và kiểm soát hoàn toàn tài khoản của người dùng.

  • Úng dụng sử dụng một session cookie để nhận dạng người dùng nào đã đưa ra yêu cầu. Không có tokens khác hoặc cơ chế nào khác theo dõi session của người dùng

  • Kẻ tấn công có thể dễ dàng quyết định giá trị của các giá trị của tham số yêu cầu mà cần được thực hiện thành đông

Với những điều kiện chính thì kẻ tấn công có thể xây dựng một trang web chứa HTML như sau:

<html>
    <body>
        <form action="https://vulnerable-website.com/email/change" method="POST">
            <input type="hidden" name="email" value="pwned@evil-user.net" />
        </form>
        <script>
            document.forms[0].submit();
        </script>
    </body>
</html>

Nếu nạn nhân vào trang web của kẻ tấn công thì sẽ xảy ra như sau:

  • Trang của kẻ tấn công sẽ kích hoạt một HTTP request tới trang web bị lỗi

  • Nếu người dùng được login vào trang web lỗi, thì trình duyệt của họ sẽ tự động chứa các session cookie của họ trng request

  • Trang web lỗi sẽ xử lý request theo một cách bình thường và coi nó như một hành động bởi nạn nhân và thay đổi địa chỉ Email của nạn nhân

Note: Mặc dù CSRF thường được mô tả liên quan đến xử lý phiên dựa trên cookie, nhưng nó cũng phát sinh trong các ngữ cảnh khác khi ứng dụng tự động thêm một số thông tin đăng nhập của người dùng vào các yêu cầu, chẳng hạn như xác thực HTTP cơ bản và xác thực dựa trên chứng chỉ.

Cách xây dựng một cuộc tấn công CSRF

Tạo thủ công HTML cần thiết cho CSRF để khai thác có thể rất phức tạp, cụ thể nơi mà mong muốn request chưa một lượng lớn số và biến, hoặc những thứ kỳ quặc trong yêu cầu. Các dễ nhất để tạo CSRF exploit là sự dụng CSRF PoC generator trng Burp Suite Pro( bạn có thể crack nó)

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
    <form action="https://0a17002804104b4fc0d5015c00cf00ba.web-security-academy.net/my-account/change-email" method="POST">
      <input type="hidden" name="email" value="hacker&@gmail.com" />
		<script>document.form[0].submit()</script>
    </form>
  </body>
</html>

Thực tế khi chúng ta tạo CSEF form từ Burp Suite thì nó sẽ có button để nạn nhân ấn nhưng thường các nạn nhân sẽ khó đoán, vậy dùng script để auto submit khi nạn nhân nhấn vào link luôn//////

Cách truyền một CSRF exploit

Các cơ chế truyền cho CSRF về cơ bản giống như đối với Reflected XSS. Thông thường, kẻ tấn công sẽ đặt mã HTML độc hại vào một trang web mà chúng kiểm soát, sau đó lôi kéo nạn nhân truy cập vào trang web đó. Điều này có thể được thực hiện bằng cách cung cấp cho người dùng một liên kết đến trang web, qua email hoặc tin nhắn trên mạng xã hội. Hoặc nếu cuộc tấn công được đặt vào một trang web phổ biến

Lưu ý rằng một số khai thác CSRF đơn giản sử dụng phương pháp GET và có thể hoàn toàn độc lập với một URL duy nhất trên trang web dễ bị tấn công. Trong tình huống này, kẻ tấn công có thể không cần sử dụng trang web bên ngoài và có thể cung cấp trực tiếp cho nạn nhân một URL độc hại trên miền dễ bị tấn công. Trong ví dụ trước, nếu yêu cầu thay đổi địa chỉ email có thể được thực hiện bằng phương thức GET, thì một cuộc tấn công khép kín sẽ giống như sau:

<img src="https://vulnerable-website.com/email/change?email=pwned@evil-user.net">

Ngăn chặn tấn công CSRF

Cách mạnh nhất để chặn lại cuộc tấn công CSRF là bao gồm một CSRF token với các request liên quan. Token phải là:

  • Không thể đoán trước với entropy cao, như đối với token phiên nói chung.

  • Bị ràng buộc với session của người dùng.

  • Được xác nhận nghiêm ngặt trong mọi trường hợp trước khi hành động liên quan được thực hiện.

CSRF token là một giá trị duy nhất, bí mật, không thể đoán trước được tạo bởi ứng dụng phía máy chủ và được truyền đến máy khách theo cách mà nó được đưa vào một yêu cầu HTTP tiếp theo do máy khách thực hiện. Khi yêu cầu sau đó được thực hiện, ứng dụng phía máy chủ xác thực rằng yêu cầu có bao gồm token mong đợi và từ chối yêu cầu nếu token bị thiếu hoặc không hợp lệ.

CSRF token là một giá trị duy nhất, bí mật, không thể đoán trước được tạo bởi ứng dụng phía máy chủ và được truyền đến máy khách theo cách mà nó được đưa vào một yêu cầu HTTP tiếp theo do máy khách thực hiện. Khi yêu cầu sau đó được thực hiện, ứng dụng phía máy chủ xác thực rằng yêu cầu có bao gồm token mong đợi và từ chối yêu cầu nếu token bị thiếu hoặc không hợp lệ.

CSRF token phải chứa entropy đáng kể và rất khó đoán, có các thuộc tính giống như session tokens nói chung

Cách CSRF token nên được truyền

CSRF token phải được coi là bí mật và được xử lý một cách an toàn trong suốt vòng đời của chúng. Một cách tiếp cận thường hiệu quả là truyền token đến máy khách trong trường ẩn của biểu mẫu HTML được gửi bằng phương thức POST. Sau đó, token sẽ được bao gồm dưới dạng tham số yêu cầu khi biểu mẫu được gửi:

<input type="hidden" name="csrf-token" value="CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz" />

Để đảm bảo an toàn hơn, trường chứa CSRF token phải được đặt càng sớm càng tốt trong tài liệu HTML, lý tưởng là trước bất kỳ trường đầu vào không ẩn nào và trước bất kỳ vị trí nào mà dữ liệu do người dùng kiểm soát được nhúng trong HTML. Điều này giảm thiểu các kỹ thuật khác nhau trong đó kẻ tấn công có thể sử dụng dữ liệu được tạo thủ công để thao tác tài liệu HTML và nắm bắt các phần nội dung của nó.

Một cách tiếp cận thay thế, đặt token vào chuỗi truy vấn URL, hơi kém an toàn hơn vì chuỗi truy vấn:

  • Được đăng nhập ở nhiều vị trí khác nhau ở phía máy khách và máy chủ;

  • Có trách nhiệm truyền cho các bên thứ ba trong HTTP Referer header;

  • Có thể được hiển thị trên màn hình trong trình duyệt của người dùng.

CSRF Token không được truyền trong cookie.

Các lỗ hổng CSRF phổ biến

Hầu hết các lỗ hổng CSRF phát sinh do sai lầm trong quá trình xác thực CSRF token.

Trong ví dụ trước, giả sử rằng ứng dụng hiện bao gồm CSRF token trong yêu cầu thay đổi e-mail của người dùng:

POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
Cookie: session=2yQIDcpia41WrATfjPqvm9tOkDvkMvLm

csrf=WfF1szMUHhiokx9AHFply5L2xAOfjRkE&email=wiener@normal-user.com

Điều này phải ngăn chặn các cuộc tấn công CSRF vì nó vi phạm các điều kiện cần thiết cho lỗ hổng CSRF: ứng dụng không còn chỉ dựa vào cookie để xử lý phiên và yêu cầu chứa một tham số mà giá trị của kẻ tấn công không thể xác định. Tuy nhiên, có nhiều cách khác nhau mà lớp bảo vệ có thể bị phá vỡ, có nghĩa là ứng dụng vẫn dễ bị tấn công bởi CSRF.

Việc xác thực CSRF token phụ thuộc vào phương pháp request

Một số ứng dụng xác thực đúng token khi yêu cầu sử dụng phương thức POST nhưng bỏ qua xác thực khi phương thức GET được sử dụng.

Trong tình huống này, kẻ tấn công có thể chuyển sang phương thức GET để bỏ qua xác thực và thực hiện một cuộc tấn công CSRF:

GET /email/change?email=pwned@evil-user.net HTTP/1.1
Host: vulnerable-website.com
Cookie: session=2yQIDcpia41WrATfjPqvm9tOkDvkMvLm

Việc xác thực CSRF Token dựa trên token hiện có

Một số ứng dụng xác thực chính xác token khi nó hiện diện nhưng bỏ qua xác thực nếu token bị bỏ qua.

Trong tình huống này, kẻ tấn công có thể xóa toàn bộ tham số chứa token (không chỉ giá trị của nó) để bỏ qua xác thực và thực hiện một cuộc tấn công CSRF:

POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
Cookie: session=2yQIDcpia41WrATfjPqvm9tOkDvkMvLm

email=pwned@evil-user.net

CSRF Token không bị ràng buộc bởi session người dùng

Một số ứng dụng không xác thực rằng token thuộc cùng một session với người dùng đang thực hiện yêu cầu. Thay vào đó, ứng dụng duy trì một nhóm token toàn cầu mà nó đã phát hành và chấp nhận bất kỳ token nào xuất hiện trong nhóm này.

Trong tình huống này, kẻ tấn công có thể đăng nhập vào ứng dụng bằng tài khoản của chính họ, lấy token hợp lệ và sau đó cung cấp token đó cho người dùng nạn nhân trong cuộc tấn công CSRF của chúng.

Vì nó không liên quan tới Session người dùng nên mỗi lần thay đổi email thì CSRF Token lại thành một mã mới. Nên chúng ta cần dùng token trung với email mà chúng ta thay đổi để gửi cho nạn nhân

CSRF Token bị ràng buộc bởi cookie không theo session

Trong một biến thể của lỗ hổng bảo mật trước đó, một số ứng dụng gắn CSRF Token với một cookie, nhưng không gắn với cùng một cookie được sử dụng để theo session. Điều này có thể dễ dàng xảy ra khi một ứng dụng sử dụng hai khuôn khổ khác nhau, một để xử sesion và một để bảo vệ CSRF, không được tích hợp với nhau:

POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
Cookie: session=pSJYSScWKpmC60LpFOAHKixuFuM4uXWF; csrfKey=rZHCnSzEp8dbI6atzagGoSYyqJqTz5dv

csrf=RhV7yQDO0xcq9gLEah2WVbmuFqyOq7tY&email=wiener@normal-user.com

Tình trạng này khó khai thác hơn nhưng vẫn dễ có lỗ hổng . Nếu trang web chứa bất kỳ hành vi nào cho phép kẻ tấn công đặt cookie trong trình duyệt của nạn nhân, thì một cuộc tấn công có thể xảy ra. Kẻ tấn công có thể đăng nhập vào ứng dụng bằng tài khoản của chính họ, lấy mã thông báo hợp lệ và cookie được liên kết, tận dụng hành vi thiết lập cookie để đặt cookie của chúng vào trình duyệt của nạn nhân và cung cấp mã thông báo của chúng cho nạn nhân trong cuộc tấn công CSRF của chúng.

NOTE

  1. Quan sát rằng nếu bạn hoán đổi csrfKeycookie và csrftham số từ tài khoản đầu tiên sang tài khoản thứ hai, yêu cầu được chấp nhận.

  2. Quay lại trình duyệt ban đầu, thực hiện tìm kiếm, gửi yêu cầu kết quả đến Burp Repeater và quan sát rằng cụm từ tìm kiếm được phản ánh trong tiêu đề Set-Cookie. Vì chức năng tìm kiếm không có bảo vệ CSRF, bạn có thể sử dụng chức năng này để đưa cookie vào trình duyệt của người dùng nạn nhân. (Dùng Set-Cookie)

CSRF Token được sao chép đơn giản trong một cookie

Trong một biến thể khác trong lỗ hổng trước đó, một số ứng dụng không duy trì bất kỳ bản ghi phía máy chủ nào về token đã được phát hành, mà thay vào đó sao chép từng mã thông báo trong cookie và tham số yêu cầu. Khi yêu cầu tiếp theo được xác thực, ứng dụng chỉ cần xác minh rằng mã thông báo được gửi trong tham số yêu cầu khớp với giá trị được gửi trong cookie. Điều này đôi khi được gọi là biện pháp bảo vệ "double submit" chống lại CSRF và được ủng hộ vì nó dễ thực hiện và tránh sự cần thiết của bất kỳ trạng thái phía máy chủ nào:

POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
Cookie: session=1DQGdzYbOJQzLP7460tfyiv3do7MjyPw; csrf=R8ov2YBfTYmzFyjit8o2hKBuoIjXXVpa

csrf=R8ov2YBfTYmzFyjit8o2hKBuoIjXXVpa&email=wiener@normal-user.com

Trong trường hợp này, kẻ tấn công có thể thực hiện lại một tấn công CSRF nếu trang web chưa bất kỳ chức năng cài đặt cookie nào. Ở đây, kẻ tấn công không cần lấy token hợp lệ của riêng họ. Họ chỉ cần tạo một token , tận dụng hành vi cài đặt cookie để đặt cookie của họ vào trình duyệt của nạn nhân và cung cấp token của họ cho nạn nhân trong cuộc tấn công CSRF của họ.

NOTE:

  • Kiểm tra csrf của cookie và csrf có bằng nhau hay không

  • Thay đổi cả hai csrf của cookie và csrf giống như nhau gửi lại khi đó email được đổi thành công => dính CRSF | /?search=test%0d%0aSet-Cookie:%20csrf=fake

Referer-based chống lại CSRF

Ngoài các biện pháp bảo vệ CSRF Token, một vài ứng dụng sử dụng HTTP Referer Header để có gắng ngăn chặn lại tấn công CSRF, bình thường kiếm trả lại rằng request bắt đầu từ domain riêng của ứng dụng.

Việc xác thực Referer dựa vào header hiện tại

Một số ứng dụng xác thực Referer header khi nó xuất hiện trong các yêu cầu nhưng bỏ qua xác thực nếu tiêu đề bị bỏ qua.

Trong tình huống này, kẻ tấn công có thể khai thác CSRF của họ theo cách khiến trình duyệt của người dùng nạn nhân thả Refererheader trong yêu cầu kết quả. Có nhiều cách khác nhau để đạt được điều này, nhưng cách dễ nhất là sử dụng thẻ META trong trang HTML lưu trữ cuộc tấn công CSRF:

<meta name="referrer" content="never">

Việc xác thực Referer có thể bị phá vỡ

Một số ứng dụng xác nhận Referertiêu đề theo cách ngây thơ có thể bị bỏ qua. Ví dụ: nếu ứng dụng xác thực rằng miền trong phần Refererbắt đầu bằng giá trị mong đợi, thì kẻ tấn công có thể đặt nó làm miền phụ của miền riêng của chúng:

http://vulnerable-website.com.attacker-website.com/csrf-attack

Tương tự như vậy, nếu ứng dụng chỉ đơn giản xác nhận rằng Referercó chứa tên miền riêng của nó, thì kẻ tấn công có thể đặt giá trị bắt buộc ở nơi khác trong URL:

http://attacker-website.com/csrf-attack?vulnerable-website.com

Note: Mặc dù bạn có thể xác định hành vi này bằng cách sử dụng Burp, bạn sẽ thường thấy rằng phương pháp này không còn hoạt động khi bạn kiểm tra bằng chứng khái niệm của mình trong trình duyệt. Trong một nỗ lực để giảm nguy cơ dữ liệu nhạy cảm bị rò rỉ theo cách này, nhiều trình duyệt hiện đã loại bỏ chuỗi truy vấn khỏi Referertiêu đề theo mặc định.

Bạn có thể ghi đè hành vi này bằng cách đảm bảo rằng phản hồi chứa phần khai thác của bạn có bộ Referrer-Policy: unsafe-url tiêu đề (lưu ý Referrer trong trường hợp này viết đúng chính tả, chỉ để đảm bảo rằng bạn đang chú ý!). Điều này đảm bảo rằng URL đầy đủ sẽ được gửi, bao gồm cả chuỗi truy vấn.

Cảm ơn các bạn đã đọc bài.....

Các bạn có thể tìm hiểu history.pushState làm gì ở .

💻
📱
🔏
Referer Header
đây