inwzaa007x
หน้าเว็บนี้มีหน้าที่หลักเพียงอย่างเดียวคือ แสดงปุ่ม “Go Back” เพื่อให้ผู้ใช้กดแล้วย้อนกลับไปยังหน้าที่เคยเข้ามาก่อนหน้า
เปรียบเหมือนกดปุ่ม ลูกศรย้อนกลับ บนเบราว์เซอร์ แต่แบบที่เขียนโค้ดควบคุมเอง
ตัวอย่างการทำงานของโค้ดเดิม:
- รับค่า URL ของหน้าที่ผู้ใช้มาจาก (Referer)
- นำค่านั้นมาสร้างเป็นลิงก์ให้ปุ่ม Go Back กดแล้วพากลับไป

XSS (Cross-Site Scripting) คือช่องโหว่ที่ทำให้ คนร้ายสามารถแอบฝังโค้ด JavaScript อันตราย เข้าไปในหน้าเว็บของเรา แล้วโค้ดนั้นจะถูกรันบนเบราว์เซอร์ของผู้ใช้คนอื่นที่เข้ามา
ประเภทที่พบในกรณีนี้คือ Reflected XSS หมายความว่า โค้ดอันตรายจะ “สะท้อน” กลับมาทันทีในหน้าตอบสนอง โดยไม่ได้ถูกเก็บไว้ในฐานข้อมูล
ความเสี่ยงที่อาจเกิดขึ้น:


ช่องโหว่อยู่ที่ ไฟล์ xss_back_button.php ตรงส่วนโค้ดที่สร้างปุ่ม Go Back
ปัญหาหลัก: โค้ดดึงค่า $_SERVER['HTTP_REFERER'] มาใช้งานโดยตรงโดยไม่มีการกรองหรือเข้ารหัสข้อมูลก่อน
HTTP_REFERER คืออะไร?
คือข้อมูลที่เบราว์เซอร์ส่งไปบอกเซิร์ฟเวอร์ว่า “ผู้ใช้คนนี้มาจากหน้าไหน” เช่น https://example.com/login.php
แต่ข้อมูลนี้คนร้ายสามารถปลอมแปลงได้ง่ายมาก! เช่น เปลี่ยนค่าเป็น <script>alert('XSS')</script> แล้วส่งมา

วิธีที่คนร้ายโจมตี:
<script>alert('XSS')</script>การยืนยันด้วยเครื่องมือสแกน (RIPS):
เครื่องมือสแกนความปลอดภัย RIPS ตรวจพบและระบุตำแหน่งโค้ดที่มีช่องโหว่ได้ชัดเจน โดยแจ้งเตือนว่าบรรทัดไหนในไฟล์ที่นำค่าจาก $_SERVER['HTTP_REFERER'] มาแสดงผลโดยไม่ผ่านการเข้ารหัส
xss_back_button.php
เปิดดูรายงานจาก RIPS กดที่รายละเอียดของช่องโหว่เพื่อดูว่า:

WinSCP คือโปรแกรมสำหรับโอนถ่ายไฟล์เข้า-ออกเซิร์ฟเวอร์อย่างปลอดภัย
ขั้นตอน:
xss_back_button.php
นำไฟล์มาเปิดใน VS Code เพื่อวิเคราะห์โค้ดและเตรียมแก้ไข
ตรวจสอบตำแหน่งที่แน่ชัดว่าโค้ดส่วนไหนดึงค่า HTTP_REFERER มาใช้งาน

โค้ดเดิมดึงค่า $_SERVER['HTTP_REFERER'] จากฝั่งเซิร์ฟเวอร์ PHP มาแสดงผลหรือใส่ใน JavaScript โดยตรง โดยไม่มีการกรองข้อมูลใดๆ ทำให้คนร้ายสามารถแก้ไขค่านี้แล้วฝังโค้ดอันตรายได้

เปลี่ยนมาใช้ document.referrer ซึ่งเป็นคำสั่ง JavaScript ฝั่งเบราว์เซอร์แทน
ทำไมถึงปลอดภัยกว่า?
document.referrer ดึงข้อมูลจากเบราว์เซอร์โดยตรง ไม่ผ่านเซิร์ฟเวอร์ PHP จึงไม่สามารถถูกแก้ไขผ่าน HTTP Header ได้portal.php ทันที
ก่อนทำการแทนที่ไฟล์ในเซิร์ฟเวอร์ ต้องทำขั้นตอนเหล่านี้ก่อน:
⚠️ สำคัญ: ต้อง สำรองข้อมูล (Backup) ไฟล์เดิมไว้ในโฟลเดอร์อื่นเสมอ ก่อนที่จะลบหรือแทนที่ไฟล์ในเซิร์ฟเวอร์ เผื่อเกิดปัญหาจะได้เรียกคืนได้


หลังจากอัปโหลดไฟล์แก้ไขแล้ว ให้รันการสแกนด้วย RIPS อีกครั้งเพื่อยืนยันว่าช่องโหว่หายไปจริง
จำนวนช่องโหว่ที่ RIPS รายงาน ลดลง — ยืนยันว่าการแก้ไขสำเร็จ

| สถานการณ์ | ก่อนแก้ไข | หลังแก้ไข |
|---|---|---|
| กดปุ่ม Go Back | ❌ อาจเกิด XSS / ใช้งานผิดปกติ | ✅ ย้อนกลับได้ปกติและปลอดภัย |
| เปิดหน้าตรงๆ (ไม่มี Referer) | ❌ อาจเกิด Error หรือ Redirect ผิดที่ | ✅ พาไปหน้า portal.php อัตโนมัติ |
| ระบบ DNS Lookup ในหน้า | ✅ ใช้งานได้ปกติ | ✅ ยังใช้งานได้ปกติ (ไม่กระทบ) |


หลังจากทำการแก้ไขโค้ดและอัปโหลดไฟล์ใหม่เรียบร้อยแล้ว สรุปผลได้ดังนี้:
ด้านความปลอดภัย:
ด้านการใช้งาน (Business Function):
สรุป: การแก้ไขครั้งนี้สามารถ ปิดช่องโหว่ด้านความปลอดภัยได้สำเร็จ โดยไม่กระทบการทำงานเดิมของระบบ ซึ่งถือเป็นแนวทางการแก้ไขที่ถูกต้องและเหมาะสม