เปิดสองหน้าต่าง

ทำตามนี้ทีละขั้น

เปิดคู่มือนี้ไว้หนึ่งหน้าต่าง และเปิดระบบนักเรียนไว้อีกหน้าต่าง เราจะทดลองด้วยการเปลี่ยน URL เท่านั้น จึงไม่ต้องติดตั้ง Burp

บัญชีทดลอง (รหัสผ่านทุกคน: 1234)

ใคร ชื่อผู้ใช้ โปรไฟล์ บทบาท
น้องเอ · สมชาย ใจดี nong-a /profile/101 นักเรียน
น้องบี · สมหญิง ใฝ่เรียน nong-b /profile/102 นักเรียน
ครูแอดมิน · ครูสมศักดิ์ kru-admin /profile/1 admin
1

ทดลองบนเว็บสาธิต

เปิด เว็บสาธิต แล้วล็อกอินด้วย nong-a และรหัสผ่าน 1234 เมื่ออยู่ที่ /profile/101 ให้เปลี่ยนเลขท้ายในช่อง URL ด้านบนของเบราว์เซอร์เป็น /profile/102 แล้วกด Enter

ถ้าเห็นเกรดของน้องบี ทั้งที่ล็อกอินเป็นน้องเอ แสดงว่าเซิร์ฟเวอร์ไม่ได้ตรวจสิทธิ์

2

ทำความรู้จักช่องโหว่นี้

สิ่งที่เพิ่งเกิดขึ้นคือ Broken Access Control รูปแบบ IDOR (Insecure Direct Object Reference) เซิร์ฟเวอร์เชื่อค่า id จาก URL โดยไม่ตรวจว่าผู้ใช้มีสิทธิ์ดูข้อมูลนั้นหรือไม่

3

เปิดแล็บบนเครื่องตัวเอง

ในโฟลเดอร์ portal รันคำสั่งนี้ แล้วเปิดเบราว์เซอร์ตามที่เทอร์มินัลบอก

npm start

ล็อกอินด้วย nong-a อีกครั้ง แล้วเปิด http://localhost:3000/profile/102 หน้าเว็บควรแสดงแถบแจ้งเตือนสีเหลืองว่ากำลังดูโปรไฟล์ของคนอื่น

4

แก้ไฟล์ access-control.js

เปิดไฟล์ portal/access-control.js หาฟังก์ชัน canViewProfile แล้วเปลี่ยน return true; เป็น:

return String(currentUser.id) === String(requestedId) || currentUser.role === "admin";

บันทึกไฟล์ แล้วที่เทอร์มินัลกด Ctrl+C จากนั้นรัน npm start ใหม่

5

ตรวจว่าการแก้ไขทำงาน

ล็อกอินเป็นน้องเอ แล้วเปิด /profile/102 อีกครั้ง เว็บต้องแสดงหน้า 403 ซึ่งหมายความว่าเซิร์ฟเวอร์ปฏิเสธคำขอแล้ว

จากนั้นล็อกอินด้วย kru-admin แล้วเปิด /profile/102 ครูต้องยังดูได้ เพราะกฎที่ถูกต้องคือให้เจ้าของโปรไฟล์หรือครูดูได้

+

โบนัสถ้าเหลือเวลา

ล็อกอินเป็นน้องเอ แล้วเปิดเมนู สำหรับครู (/admin/students) ถ้าเข้าได้ แสดงว่าหน้าแอดมินยังไม่ได้ตรวจบทบาท (role) ของผู้ใช้

แก้ฟังก์ชัน canViewAdminPage เป็น:

return currentUser.role === "admin";

รีสตาร์ทอีกครั้ง น้องเอต้องได้ 403 แต่ครูยังเข้าได้