ASP.NET ดําเนินการเตรียมการร้องขอข้ามไซต์ (XSRF/CSRF) การตอบโต้จากหลัก

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพ แวด ล้อม

สตูดิโอภาพ
  • สตูดิโอภาพ 2019
แกนASP.NET
  • 3.0
  • 3.1

คําขอปลอมข้ามไซต์คืออะไร

การปลอมแปลงคําขอข้ามไซต์ (CSRF/XSRF) สําหรับผู้ที่ดําเนินการภายในไซต์ที่สนใจเท่านั้น การโจมตีบนช่องโหว่ที่ดําเนินการดังกล่าวกระบวนการปรับปรุงจากไซต์ภายนอก

ตัวอย่างเช่น สมมติว่าคุณมีความสามารถในการโพสต์ความคิดเห็นบนเว็บไซต์ ปกติฉันคิดว่าคุณจะโพสต์โดยป้อนความคิดเห็นจากเว็บไซต์ กระบวนการส่งนี้มักใช้ในการโยนข้อมูลที่ URL เป้าหมาย

ดังนั้นถ้าคุณส่งข้อมูลที่คล้ายกันไปยัง URL จากบุคคลอื่นนอกเหนือจากไซต์เป้าหมาย มันรักษาเดียวกันคุณโพสต์

ถ้าเพียงผู้โจมตีจะทําเช่นนี้มันจะไม่เป็นภัยคุกคาม สิ่งที่น่ากลัวเกี่ยวกับ CSRF คือผู้โจมตีสามารถสร้างเว็บไซต์ปลอมหรือฝัง URL ที่ซ่อนอยู่ในเว็บไซต์ มันเป็นที่ที่คนอื่นตั้งใจเข้าถึงมันและกลายเป็นผู้บุกรุก

ฉันจะไม่ลึกที่นี่ดังนั้นโปรดหาข้อมูลเพิ่มเติมเกี่ยวกับ forgeri คําขอข้ามไซต์

ASP.NET Core ได้รวมมาตรการนี้ไว้ในกรอบ

ตรวจสอบคําขอข้ามไซต์ปลอมในการทํางาน

ลองดูว่ากระบวนการปรับปรุงเป็นจริงดําเนินการจากเว็บไซต์ภายนอกหรือเครื่องมือ

สร้างฟอร์มสําหรับการป้อนค่าที่ส่งข้อความที่คุณใส่ไปยังเซิร์ฟเวอร์ จากนั้นวาง viewdata เพื่อให้เซิร์ฟเวอร์แสดงข้อความที่คุณสร้างขึ้นเพื่อให้ตรงกับข้อความป้อนเข้า

ดัชนี

@{
  ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<form method="post">
  <input type="text" name="text" />
  <button type="submit">送信</button>
</form>

<p>@ViewData["Message"]</p>

HomeController.csฝั่งเซิร์ฟเวอร์ประมวลผลข้อความที่ส่ง และผลลัพธ์ไปยังการสืบค้นกลับ Visual Studio ตั้งค่าข้อความเดียวกันเป็น ViewData เพื่อให้สามารถแสดงไปยังไคลเอนต์

HomeController.cs

public class HomeController : Controller
{
  // 省略

  [HttpPost]
  public IActionResult Index(string text)
  {
    System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
    ViewData["Message"] = $"「{text}」が入力されました。";
    return View();
  }

  // 省略
}

พยายามทํางานที่คุณเพิ่งสร้างในขั้นตอนปกติ เมื่อคุณเรียกใช้การตรวจแก้จุดบกพร่องและหน้าจอปรากฏขึ้น ให้ป้อนข้อความแล้วคลิกปุ่ม ส่ง

ข้อความที่ประมวลผลจะปรากฏบนหน้าจอตามที่คาดไว้

หน้าต่างแสดงผลของสตูดิโอภาพยังแสดงข้อความ ในความเป็นจริงเราทําสิ่งต่างๆเช่นการลงทะเบียนข้อมูลเข้าในฐานข้อมูล แต่เราจะไม่ลดความซับซ้อนของรหัสที่นี่

ตอนนี้, พยายามเข้าถึงโปรแกรมจากนอกไซต์เป้าหมายในขณะที่ดีบัก และทํางาน. สําหรับความเรียบง่าย, ฉันจะโพสต์โพสต์โดยใช้เครื่องมือที่เรียกว่า Visual Studio รหัส. หากคุณสามารถส่ง POST คุณสามารถใช้เครื่องมืออื่น ๆ หรือสร้างโปรแกรมไซต์อื่นสําหรับการโจมตี

เมื่อคุณติดตั้งส่วนขยายที่เรียกไคลเอ็นต์ RESTใน Visual Studio รหัส คุณสามารถใช้คุณลักษณะที่ช่วยให้คุณสามารถตรวจสอบการทํางานของ REST API ได้ง่ายๆ ด้วยการเปิดไฟล์.http

เมื่อคุณสร้างแฟ้ม.http คล้ายกับต่อไปนี้ในแฟ้มข้อความ และเปิดแฟ้มใน Visual Studio รหัส คุณสามารถส่ง GET หรือ POST ได้โดยคลิกส่งคําขอ

หากคุณสร้างข้อมูล POST ต่อไปนี้คุณจะถูกส่งเกือบจํานวนเดียวกันของข้อมูลที่คุณพิมพ์ข้อความบนหน้าจอและกดปุ่มส่ง (หมายเลขพอร์ต Localhost ควรเหมือนกับสภาพแวดล้อมการดําเนินการ)

การทดลองใช้งาน

### Form で POST 送信
POST https://localhost:44372/home/index HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"

なんらかのテキスト
------WebKitFormBoundary7MA4YWxkTrZu0gW--

เมื่อคุณส่งคุณจะเห็นว่าเซิร์ฟเวอร์ได้รับข้อความและประมวลผล

รหัส Studio Visual จะได้รับผลลัพธ์ ถ้าคุณดูโค้ดผลลัพธ์ใกล้ๆ คุณจะเห็นว่าค่าที่ตั้งไว้สําหรับ ViewData ถูกแสดง (จะแสดงใน Unicode แต่ข้อความจะแสดงอย่างถูกต้องถ้าดูในเว็บเบราว์เซอร์)

ที่อยู่ช่องโหว่ของคําขอข้ามไซต์ Forgeri

ที่ผมกล่าวถึงในตอนแรกASP.NET Core ประกอบด้วยมาตรการกับปลอมคําขอข้ามไซต์ในกรอบ มาตรการทั่วไปคือการออกโทเค็นที่ไม่ซ้ํากับลูกค้าล่วงหน้าบนหน้าจอที่ต้องมีการโพสต์เป็นต้น คุณไม่จําเป็นต้องยอมรับการประมวลผลเว้นแต่คุณจะโยนโทเค็นไปยังเซิร์ฟเวอร์

แน่นอนถ้าคุณเข้าถึง URL โดยตรงจากเว็บไซต์ภายนอกโทเค็นไม่รู้จักและจะไม่ยอมรับการประมวลผล

แรกผมอยากจะพูดคุยเกี่ยวกับการออกโทเค็นให้กับลูกค้า (HTML) แต่ความจริงก็คือกรอบไม่สามารถทําเช่นนี้ จะไป ถ้าคุณระบุวิธีการ POST ในแท็กฟอร์ม คุณสามารถรวมพารามิเตอร์โทเค็นลงใน HTML โดยไม่ได้รับอนุญาต

ใน HTML ด้านล่างมันเป็นชื่อที่ป้อน="__RequestVerificationToken" ="ซ่อน" ซึ่งจะถูกส่งไปยังเซิร์ฟเวอร์ร่วมกันเมื่อกดปุ่มส่ง โดยวิธีการที่จะไม่ผนวกโดย GET วิธีการ

ด้านเซิร์ฟเวอร์ Startup.csบริการ เพิ่มตัวควบคุมตัวเลือกวิธีการมุมมอง ตัวกรองไปยัง การกระทําทั้งหมด ตรวจสอบโทเค็นนี้จะถูกเพิ่มโดยอัตโนมัติไปยัง (เพื่อเป็นที่แน่นอนเท่านั้นวิธีการ HTTP ของ POST, PUT, PATCH และลบ)

ถ้าคุณต้องการเพิ่มข้อจํากัดนี้เฉพาะกับการกระทําที่เฉพาะเจาะจง, การกระทําไม่ทั้งหมด, ต่อตัวควบคุม, ต่อการกระทํา นอกจากนี้ยังเป็นไปได้ที่จะตั้งค่า

ถ้าคุณต้องการกําหนดข้อจํากัดในการดําเนินการส่วนใหญ่ แต่คุณต้องการยกเว้นการดําเนินการที่เฉพาะเจาะจง ถ้าคุณตั้งค่านี้IgnoreAntiforgeryTokenแอตทริบิวต์ไปยังตัวควบคุมและการกระทํา จะตกลง

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews(options =>
  {
    // 全ての「POST, PUT, PATCH, DELETE」アクションに自動で ValidateAntiForgeryToken を付与。
    // 個別に除外したい場合は「IgnoreAntiforgeryToken」属性を指定すること
    // API では HTML 側にトークンを発行できないのでコントローラーに「IgnoreAntiforgeryToken」を指定する必要がある。
    options.Filters.Add(new Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute());
  });
}

ลองดูวิธีการทํางาน แรกของทุกขั้นตอนการส่งจะทําจากหน้าจอตามปกติ

ผลที่ได้สะท้อนให้เห็นบนหน้าจอตามที่คาดไว้

นอกจากนี้ยังส่งออกไปยังการติดตาม

ตอนนี้ขอลองเข้าถึงจากภายนอก

การเข้าถึง ed แต่การร้องขอไม่ถูกต้องถูกส่งกลับ มันเป็นผลลัพธ์ที่แตกต่างจากเมื่อคุณไม่ได้ใช้มาตรการ เป็นที่เข้าใจว่ามันเป็นรักษาเพราะมันไม่ได้ส่งออกไปยังร่องรอย

สรุป

เวลานี้ผมพยายามที่จะใช้มาตรการกับคําขอข้ามไซต์ปลอม มันง่ายมากที่จะใช้เพราะมันถูกสร้างขึ้นแล้วในกรอบ

การสร้างเว็บไซต์ต้องการช่องโหว่มากขึ้นกว่า CSRF คุณสามารถตรวจสอบสิ่งที่ออกมีหรือคุณสามารถใช้เครื่องมือเช่น OWASP เพื่อตรวจสอบช่องโหว่ในเว็บไซต์ของคุณ