ทดลองบนเว็บสาธิต
เปิด เว็บสาธิต
แล้วล็อกอินด้วย nong-a และรหัสผ่าน 1234
เมื่ออยู่ที่ /profile/101 ให้เปลี่ยนเลขท้ายในช่อง URL ด้านบนของเบราว์เซอร์เป็น
/profile/102 แล้วกด Enter
ถ้าเห็นเกรดของน้องบี ทั้งที่ล็อกอินเป็นน้องเอ แสดงว่าเซิร์ฟเวอร์ไม่ได้ตรวจสิทธิ์
ทำความรู้จักช่องโหว่นี้
สิ่งที่เพิ่งเกิดขึ้นคือ Broken Access Control รูปแบบ
IDOR (Insecure Direct Object Reference)
เซิร์ฟเวอร์เชื่อค่า id จาก URL โดยไม่ตรวจว่าผู้ใช้มีสิทธิ์ดูข้อมูลนั้นหรือไม่
เปิดแล็บบนเครื่องตัวเอง
ในโฟลเดอร์ portal รันคำสั่งนี้ แล้วเปิดเบราว์เซอร์ตามที่เทอร์มินัลบอก
npm start
ล็อกอินด้วย nong-a อีกครั้ง แล้วเปิด
http://localhost:3000/profile/102
หน้าเว็บควรแสดงแถบแจ้งเตือนสีเหลืองว่ากำลังดูโปรไฟล์ของคนอื่น
แก้ไฟล์ access-control.js
เปิดไฟล์ portal/access-control.js หาฟังก์ชัน
canViewProfile แล้วเปลี่ยน return true; เป็น:
return String(currentUser.id) === String(requestedId) || currentUser.role === "admin";
บันทึกไฟล์ แล้วที่เทอร์มินัลกด Ctrl+C จากนั้นรัน npm start ใหม่
ตรวจว่าการแก้ไขทำงาน
ล็อกอินเป็นน้องเอ แล้วเปิด /profile/102 อีกครั้ง
เว็บต้องแสดงหน้า 403 ซึ่งหมายความว่าเซิร์ฟเวอร์ปฏิเสธคำขอแล้ว
จากนั้นล็อกอินด้วย kru-admin แล้วเปิด /profile/102
ครูต้องยังดูได้ เพราะกฎที่ถูกต้องคือให้เจ้าของโปรไฟล์หรือครูดูได้
โบนัสถ้าเหลือเวลา
ล็อกอินเป็นน้องเอ แล้วเปิดเมนู สำหรับครู
(/admin/students) ถ้าเข้าได้ แสดงว่าหน้าแอดมินยังไม่ได้ตรวจบทบาท
(role) ของผู้ใช้
แก้ฟังก์ชัน canViewAdminPage เป็น:
return currentUser.role === "admin";
รีสตาร์ทอีกครั้ง น้องเอต้องได้ 403 แต่ครูยังเข้าได้