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 เพื่อตรวจสอบช่องโหว่ในเว็บไซต์ของคุณ