jhenk

moew

View on GitHub

⬅ ย้อนกลับ

การจัดการช่องโหว่ Cross-Site Scripting (XSS)

เป้าหมาย: ไฟล์ index.php ในระบบ PHP Web Application ระดับความเสี่ยง: สูง (High Risk)

PIC1

===

1. ฟังก์ชันการทำงานเดิม (Business Function)

หน้านี้มีไว้ทำอะไร?

หน้านี้มีหน้าที่รับค่าชื่อจากผู้ใช้ผ่าน URL แล้วแสดงผลข้อความต้อนรับบนหน้าเว็บ


2. ช่องโหว่และการทดสอบ (Vulnerability & Payload)

ปัญหาอยู่ที่บรรทัดไหน?

จากการตรวจสอบด้วยเครื่องมือ RIPS พบว่าแอปพลิเคชันนำข้อมูลจากผู้ใช้ไปแสดงผลโดยตรงโดยไม่ผ่านการป้องกัน

PIC0

ผลการสแกน (RIPS Output)

User input reaches sensitive sink

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

PIC2

คำอธิบายปัญหา (Root Cause Analysis)

ช่องโหว่เกิดจากการนำข้อมูลที่ผู้ใช้ควบคุมได้ไปแสดงผลทันที ทำให้ผู้โจมตีสามารถฝัง HTML หรือ JavaScript เข้าไปในหน้าเว็บได้

ผลที่อาจเกิดขึ้น:


3. การพิสูจน์ช่องโหว่ (Exploitation)

เจาะระบบได้อย่างไร?

เนื่องจากระบบแสดงผลข้อมูลตรง ๆ ผู้โจมตีสามารถแทรก JavaScript ได้ทันที

/index.php?name=<script>alert(1)</script>


4. แนวทางการแก้ไข (Remediation)

แก้ยังไงให้ปลอดภัย?

หลักการสำคัญคือ:

“ห้ามนำข้อมูลจากผู้ใช้ไปแสดงผลตรง ๆ ต้อง Encode ก่อนเสมอ”

เราแก้ไขโดยใช้ htmlentities() เพื่อแปลงอักขระพิเศษให้ปลอดภัยก่อนแสดงผล

print("Hello " . htmlentities($_GET["name"], ENT_QUOTES, "utf-8"));

อธิบายการป้องกัน htmlentities() → แปลง < > “ ‘ & ให้เป็น HTML-safe

ENT_QUOTES → ป้องกันการแทรก quote ทั้งเดี่ยวและคู่

“utf-8” → ป้องกันการ bypass ด้วย encoding

ขั้นตอนการแก้ไข

ตรวจสอบรายละเอียดจาก RIPS PIC50

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

PIC11

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

PIC40

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

พบว่าปัญหาดังกล่าวหาไปแล้ว

PICX

5.1 ตรวจสอบความปลอดภัย (Security Check)

ทดสอบ Payload เดิมอีกครั้ง:

PIC8

/index.php?name= ผลลัพธ์: โค้ดถูกแสดงเป็นข้อความธรรมดา ไม่ถูกรัน

5.2 ตรวจสอบคุณภาพโค้ด (RIPS Re-scan)

สแกนซ้ำด้วย RIPS ผลลัพธ์: ไม่พบช่องโหว่เพิ่มเติม (No vulnerabilities found)

PIC6


5.3 ตรวจสอบการใช้งาน (Usability Check)

ทดสอบการใช้งานปกติ

เมื่อทดสอบ PIC8

ลิงค์ไปที่

PICXJ

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

===

สรุป :

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