การจัดการช่องโหว่ Cross-Site Scripting (XSS)
เป้าหมาย: ไฟล์ index.php ในระบบ PHP Web Application ระดับความเสี่ยง: สูง (High Risk)

===
1. ฟังก์ชันการทำงานเดิม (Business Function)
หน้านี้มีไว้ทำอะไร?
หน้านี้มีหน้าที่รับค่าชื่อจากผู้ใช้ผ่าน URL แล้วแสดงผลข้อความต้อนรับบนหน้าเว็บ
- การทำงาน: ระบบรับค่าจาก
$_GET["name"]แล้วนำมาแสดงผลผ่านคำสั่ง print/echo - สิ่งที่ควรจะเป็น: ระบบควรแสดงชื่อผู้ใช้เป็นข้อความธรรมดาเท่านั้น โดยไม่อนุญาตให้โค้ดทำงาน
2. ช่องโหว่และการทดสอบ (Vulnerability & Payload)
ปัญหาอยู่ที่บรรทัดไหน?
จากการตรวจสอบด้วยเครื่องมือ RIPS พบว่าแอปพลิเคชันนำข้อมูลจากผู้ใช้ไปแสดงผลโดยตรงโดยไม่ผ่านการป้องกัน

ผลการสแกน (RIPS Output)
User input reaches sensitive sink
- Source:
$_GET["name"](รับข้อมูลจากผู้ใช้)- Sink:
print()/echo(แสดงผลลงหน้าเว็บโดยตรง)

คำอธิบายปัญหา (Root Cause Analysis)
ช่องโหว่เกิดจากการนำข้อมูลที่ผู้ใช้ควบคุมได้ไปแสดงผลทันที ทำให้ผู้โจมตีสามารถฝัง HTML หรือ JavaScript เข้าไปในหน้าเว็บได้
- รับค่าจาก URL โดยตรง (Untrusted Input)
- ไม่มีการ Encode หรือ Filter ก่อน Output
- Browser จึงตีความข้อมูลเป็นโค้ดจริง
ผลที่อาจเกิดขึ้น:
- เปลี่ยนหน้าตาเว็บไซต์ (Defacement)
- สร้างหน้า Phishing หลอกผู้ใช้
- ขโมย Cookie
- Session Hijacking (ปลอมตัวเป็นผู้ใช้)
3. การพิสูจน์ช่องโหว่ (Exploitation)
เจาะระบบได้อย่างไร?
เนื่องจากระบบแสดงผลข้อมูลตรง ๆ ผู้โจมตีสามารถแทรก JavaScript ได้ทันที
- Payload:
/index.php?name=<script>alert(1)</script>
- การทำงาน: Browser ประมวลผล
<script>เป็นโค้ดจริง - ผลลัพธ์: Popup alert แสดงขึ้น ยืนยันว่าช่องโหว่ XSS ถูกโจมตีได้จริง
4. แนวทางการแก้ไข (Remediation)
แก้ยังไงให้ปลอดภัย?
หลักการสำคัญคือ:
“ห้ามนำข้อมูลจากผู้ใช้ไปแสดงผลตรง ๆ ต้อง Encode ก่อนเสมอ”
เราแก้ไขโดยใช้ htmlentities() เพื่อแปลงอักขระพิเศษให้ปลอดภัยก่อนแสดงผล
print("Hello " . htmlentities($_GET["name"], ENT_QUOTES, "utf-8"));
อธิบายการป้องกัน htmlentities() → แปลง < > “ ‘ & ให้เป็น HTML-safe
ENT_QUOTES → ป้องกันการแทรก quote ทั้งเดี่ยวและคู่
“utf-8” → ป้องกันการ bypass ด้วย encoding
ขั้นตอนการแก้ไข
ตรวจสอบรายละเอียดจาก RIPS

เชื่อมต่อ Server ผ่าน WinSCP จากนั้น เปิดไฟล์และแก้ไขโค้ด

อัปโหลดไฟล์ใหม่แทนของเดิม

5. การตรวจสอบหลังแก้ไข (Verification)
พบว่าปัญหาดังกล่าวหาไปแล้ว

5.1 ตรวจสอบความปลอดภัย (Security Check)
ทดสอบ Payload เดิมอีกครั้ง:

/index.php?name= ผลลัพธ์: โค้ดถูกแสดงเป็นข้อความธรรมดา ไม่ถูกรัน
5.2 ตรวจสอบคุณภาพโค้ด (RIPS Re-scan)
สแกนซ้ำด้วย RIPS ผลลัพธ์: ไม่พบช่องโหว่เพิ่มเติม (No vulnerabilities found)

5.3 ตรวจสอบการใช้งาน (Usability Check)
ทดสอบการใช้งานปกติ
เมื่อทดสอบ

ลิงค์ไปที่

ผลลัพธ์: ระบบยังแสดงข้อความต้อนรับตามปกติ ผู้ใช้ใช้งานได้เหมือนเดิม

===
สรุป :
การแก้ไขช่องโหว่ Cross-Site Scripting (XSS) สามารถทำได้อย่างมีประสิทธิภาพด้วยการ Encode ข้อมูลก่อนแสดงผล โดยใช้ htmlentities() ส่งผลให้โค้ดจากผู้ใช้ไม่สามารถทำงานใน Browser ได้อีกต่อไป ลดความเสี่ยงจากการโจมตีประเภท XSS และทำให้ระบบมีความปลอดภัยพร้อมใช้งานตามปกติ