Frontend Developer
วิธีการแก้ไขปัญหา Session Fixation ที่เช็คผ่าน RIPS (เนื้อหาวันที่ 1 กุมภาพันธ์ 2569)
อีก 1 ปัญหาที่เหลือหลังจากจบการเรียน คือ Session Fixation จากการค้นหาคร่าว ๆ AI ได้สรุปมาว่า Session Fixation คือการที่ผู้โจมตีบังคับให้ผู้ใช้งานใช้ session ID ที่พวกเขากำหนดไว้เอง พอผู้ใช้ login เข้าไปแล้ว ผู้โจมตีก็สามารถใช้ session ID อันนั้นเข้า account และสวมรอยได้เลย

ทางซ้ายมือจะมีปุ่ม get help (เครื่องหมาย ? สีฟ้า) ปุ่มนี้จะคอยบอกรายละเอียด มีคำอธิบาย ว่าจะต้องทำยังไงเพื่อแก้ไขปัญหานี้ ซึ่งถ้าเรากดเข้าไปดูก็จะเห็นรายละเอียดที่บอกว่า
Vulnerability Concept:
| Source | Sink | Vulnerability |
|---|---|---|
$_POST + |
setcookie() |
= Session Fixation |
Vulnerability Description: An attacker can force a user to use a specific session id. Once the user logs in, the attacker can use the previously fixated session id to access the account.
Vulnerable Example Code:
// 1:
setcookie("PHPSESSID", $_GET["sessid"]);
Proof of Concept:
/index.php?sessid=1f3870be274f6c49b3e31a0c6728957f
Patch: Do not use a session token supplied by the user.
1: No code.
Related Securing Functions: None.

เมื่อลองเข้าไปใน server ผ่าน WinSCP และเปิดไฟล์ดู พอเทียบกับในที่ RIPS แจ้ง error จะเห็นว่ามันใบ้เป็น comment อยู่แล้วว่าไฟล์ไหน ซึ่งในกรณีนี้คือ selections.php

ต่อไปลองเปิดไฟล์นั้นใน VS Code ดู เพื่อจะได้แก้ไขได้สะดวกขึ้น

เนื่องจากปัญหาอาจจะยากเกินกว่าลิงจะเข้าใจ และ get help ไม่สามารถช่วยอะไรเราได้ เราสามารถปรึกษา AI และเอาโค้ดเดิมที่มีปัญหาของเราส่งไปเพิ่มเติม เพื่อให้ AI ได้เข้าใจบริบทที่เราเจออยู่ตอนนี้มากขึ้น และมีโอกาสแก้ไขให้เราได้ถูกต้องมากกว่าตอนที่มันไม่เห็นอะไรจากเราเลยนอกจากคำถามลอย ๆ
4.1 ก่อนแก้

4.2 หลังแก้

จุดเปลี่ยนแปลงสำคัญ:
session_start() (บรรทัด 3) - เปิดใช้งาน PHP Sessionin_array() (บรรทัด 18-24) - รับเฉพาะค่า "0", "1", "2" เท่านั้น$_SESSION (บรรทัด 28) แทนการเก็บใน cookie ตรงๆsession_id() ใน cookie (บรรทัด 48) แทนค่าที่ผู้ใช้ส่งมา → ป้องกัน Session FixationhttpOnly = true (บรรทัด 52) - JavaScript เข้าถึง cookie ไม่ได้$_SESSION (บรรทัด 68-80) แทนการอ่านจาก cookie โดยตรงหลังจากแก้ไขเสร็จแล้ว ให้เซฟ และนำไฟล์ที่พึ่งแก้เสร็จ ไปแทนที่กับอันเก่าที่อยู่บน server (ควรจะ backup ไฟล์ดั้งเดิมไว้ก่อนจะทำขั้นตอนนี้ เผื่อกรณีไฟล์ที่แก้นั้นทำเละกว่าเดิม T^T)

เช็คผ่าน RIPS อีกครั้งว่าปัญหานั้นยังอยู่ไหม ถ้าเป็น 0 แล้วก็น่าจะใช้ได้แล้ว

หลังจากแก้ไขโค้ดแล้ว จำเป็นต้องทดสอบว่า functionality ยังทำงานได้ปกติ เพื่อให้มั่นใจว่าการแก้ช่องโหว่ไม่ได้ทำให้ระบบเสีย
สิ่งที่เราแก้ไป:
$_SESSION และใช้ session_id() ใน cookie แทนhttpOnly = true เพื่อป้องกัน JavaScript เข้าถึง cookieทำไมวิธีนี้ถึงปลอดภัย:
ผลการทดสอบ:

การทดสอบที่ทำ:
www.ivecr5.ac.th → 122.155.166.155)