CWE-384: Session Fixation

บทความนี้เราจะมาดูกันว่า Session Fixation คืออะไร แล้วจะป้องกันได้ยังไง ?

ก่อนอื่นลองดู code ต่อไปนี้ดูว่าระบบ session ถูกหรือไม่ ?

ตัวอย่างขอเป็น PHP นะ แต่ไม่ได้เขียน PHP มาหลายปีแล้ว อาจจะเขียนผิดไปบ้างขอโทษด้วย

แน่นอนว่าผิดแน่ ๆ เพราะถ้าถูกจะเอามาให้ดูทำไมหล่ะ 🙄


ลองมาดูกันว่า code นี้จะเกิด session fixation ได้ยังไง ?

เราลองเปิด browser ขึ้นมา 2 ตัว ที่ไม่ใช่ browser เดียวกัน (อาจจะใช้ chrome กับ chrome incognito ก็ได้)

ให้เปิดดู browser ตัวแรก เข้าไปที่เว็บของเรา แล้วเปิดดู cookie จะได้หน้าตาประมาณนี้

มี Cookie ชื่อว่า PHPSESSID มีค่าเป็น f6b1a1f56aaf78cb180e05cc4cefd525

คราวนี้ให้เราเปิด browser อีกตัว แล้วก็อปเอา session id จาก browser ตัวแรกไปทับ

ตอนนี้เราจะมี browser 2 ตัวที่มี session id ค่าเดียวกัน

ให้เราลอง login ใน browser ตัวที่ 2 ดู ด้วยรหัส “pass” แล้วลอง refresh browser ตัวที่ 1

จะเห็นว่าทั้ง 2 browser จะ login เหมือนกัน


Session Fixation ก็คือ

การที่เราแอบเอา session id ไปใส่ใน browser ของเหยื่อ แล้วรอให้เหยื่อ sign in จะทำให้เราได้ session id ที่ sign in เป็นเหยื่อคนนั้น


แล้วเราจะสามารถป้องกันได้ยังไงหล่ะ ?

ทุกครั้งที่ user ถูกยกระดับสิทธิ์ (จากไม่ได้ sign in เป็น sign in, จาก user ธรรมดา เป็น admin ฯลฯ) ให้เปลี่ยน session id เป็นค่าใหม่เสมอ

คราวนี้เราลองทำเหมือนเดิม แต่จะเห็นว่าพอ browser แรก sign in แล้ว browser ตัวที่ 2 จะไม่ sign in ด้วย เพราะว่าเราเปลี่ยน session id ให้กับ browser ตัวแรกแล้วนั้นเอง

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.