ปัจจุบันข่าวเรื่องความปลอดภัยทางเทคโนโลยี กลายเป็นหัวข้อที่ได้รับความสนใจและถูกให้สำคัญมากในปี 2024 ซึ่งหนึ่งในช่องโหว่อย่าง PHP-CGI RCE (CVE-2024–4577) ที่ถูกค้นพบโดย Orange Tsai นักวิจัยด้านความปลอดภัยของ Devcore Principal เมื่อวันที่ 7 พฤษภาคม 2024 ที่ผ่านมา และได้รายงานช่องโหว่นี้ให้แก่นักพัฒนา PHPได้รับทราบในเวลาต่อมา เราไปเริ่มต้นทำความรู้จักกับช่องโหว่นี้กันครับ
ช่องโหว่ PHP-CGI RCE (CVE-2024–4577) คือ ช่องโหว่ที่สามารถหลีกเลี่ยงการป้องกันของช่องโหว่ PHP-CGI RCE เมื่อปี 2012 คือ PHP-CGI RCE (CVE-2012–1823) ที่ได้รับความนิยมและถูกพูดถึงเป็นอย่างมากในเรื่องความปลอดภัยเทคโนโลยีสารสนเทศ โดยช่องโหว่ PHP-CGI RCE (CVE-2012–1823) นี้ เกิดขึ้นเมื่อปี 2012 ซึ่งเป็นปัญหาที่เกิดจากเว็บเซิร์ฟเวอร์ที่ใช้ PHP เป็นภาษาหลัก ทำให้ผู้ไม่ประสงค์ดีสามารถเข้าถึงและควบคุมเว็บเซิร์ฟเวอร์ โดยการเรียกใช้โค้ดที่เป็นอันตรายจากระยะไกล (Remote Code Execution) บน Windows ได้
ก่อนจะอธิบายช่องโหว่ PHP-CGI RCE (CVE-2024–4577) ผมจะขออธิบาย PHP-CGI เบื่องต้นกันก่อนครับ
PHP-CGI หรือ PHP Common Gateway Interface คือ โปรแกรมหรือส่วนเสริมของ PHP ที่ใช้ในการประมวลผลคำสั่ง PHP ในรูปแบบของ Common Gateway Interface (CGI) โดย CGI เป็นมาตรฐานสำหรับการสื่อสารระหว่างโปรแกรมและเว็บเซิร์ฟเวอร์ เมื่อมีการเรียกใช้งาน PHP-CGI ผ่านเว็บเซิร์ฟเวอร์ เซิร์ฟเวอร์จะส่งคำขอไปยัง PHP-CGI เพื่อให้มันประมวลผลสคริปต์ PHP และส่งผลลัพธ์กลับมายังเซิร์ฟเวอร์ เพื่อส่งให้กับผู้ใช้งานผ่านทางเว็บเบราว์เซอร์ เช่น ในระบบ XAMPP หรือบางระบบเว็บเซิร์ฟเวอร์อื่น ๆ และมีอีกส่วนที่สำคัญในระบบ XAMPP คือ Apache HTTPd ซึ่งเป็นโปรแกรมที่ทำหน้าที่เป็น Web Server หรือแปลงให้คอมพิวเตอร์ที่ติดตั้ง Apache สามารถให้บริการ Web Site ที่สามารถเรียกจากเครื่องอื่น ๆ ที่เป็น Client ได้ เช่น เรียกผ่านเว็บเบราว์เซอร์ของ IE, Chrome หรือ Firefox และ Apache อีกทั้งยังสามารถทำงานร่วมกับภาษาที่ใช้พัฒนาเว็บไซต์ได้หลากหลาย เช่น PHP ,Ruby ,JSP และอื่น ๆ
เมื่อติดตั้งเว็บที่ใช้ PHP โดยปกติจะมีหลายวิธี ตัวอย่าง เช่น ในระบบ XAMPP จะใช้วิธีการที่เรียกว่า PHP-CGI ร่วมกับ Apache HTTPd ดังนั้น เมื่อมีการเข้าถึงเว็บไซต์ เช่น “https://example-host/cgi.php?foo=bar” การทำเช่นนี้เทียบเท่ากับการรันโปรแกรมคำสั่ง “php.exe cgi.php foo=bar” และจากการทำงานเช่นนี้ ทำให้เกิดช่องโหว่ PHP-CGI RCE (CVE-2012–1823) และได้ถูกแก้ไขไปเป็นที่เรียบร้อยโดยการตรวจสอบ Input ก่อนเรียกใช้งาน php.exe และที่เกิดปัญหาคือตัวอักษร “-” ซึ่งหากดูตามภาพที่ 1
จะเห็นได้ว่าหากมองด้วยสายตาจะไม่มีส่วนใดแตกต่างกันเลย แต่หากมองด้วย Hex Editor ตามภาพที่ 2
“-” ที่ 2 จะมีรหัสเป็น (0xAD) และ “-” ที่ 1 จะมีรหัสเป็น (0x2D) ซึ่ง Apache ได้ escape เครื่องหมาย “-” หรือ (0x2D) ไปแล้ว แต่แน่นอนว่าเจ้า (0xAD) ที่มีหน้าตาคล้ายกับเครื่องหมาย “-” นั้น ยังไม่ได้ escape และเมื่อเซิร์ฟเวอร์รับ (0xAD) เข้าไป ก็จะประมวลผลเหมือนรับ (0x2D) ซึ่งเป็นที่มาทำให้เกิดช่องโหว่ PHP-CGI RCE (CVE-2024–4577) ขึ้นนั่นเอง
ย้อนกลับไปที่ช่องโหว่ PHP-CGI RCE (CVE-2012–1823) เมื่ออยู่ใน PHP-CGI Mode เราสามารถใช้คำสั่งต่าง ๆ ใน PHP-CGI ได้ดังภาพที่ 3
จากภาพที่ 3 ตัวอย่างการใช้งาน เช่น หากเราทำการใช้คำสั่ง -s ทำให้การเรียกหน้าเว็บ “https://example-host/cgi.php?%20-s” เป็นการไปเรียก “php.exe cgi.php -s” ซึ่ง -s ทำให้แสดงโค้ด PHP ของเว็บออกมาได้และจะมี Argument ที่สามารถทำให้ RCE ได้ คือ
-d allow_url_include -d auto_prepend_file=php://input
โดยทำการส่งด้วย HTTP POST Method และประกอบด้วยโค้ด PHP ที่ HTTP Request Body ตามที่เราต้องการเข้าไป
https://example-host/cgi.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
โดย auto_prepend_file คือ การเอาไฟล์โค้ด PHP ไปต่อท้ายไฟล์ PHP โดยไฟล์ที่เอาไปต่อ คือ php://input ซึ่งคือค่าจาก HTTP POST Method ทำให้โค้ด PHP ที่ส่งไปที่ URL นี้ถูกรันจนเกิด RCE ได้ ดังตัวอย่างดังภาพที่ 4
ส่วนช่องโหว่ PHP-CGI RCE (CVE-2024–4577) ที่ประกาศใหม่อย่างที่ Orange Tsai ไปเจอว่ามันมีอักษร Unicode ประหลาดอีกตัวที่หน้าตาคล้าย “-” ในภาษาจีนและญี่ปุ่น ซึ่งเมื่อส่งผ่าน URL มันจะไม่โดนการป้องกัน (Escape) จาก Patch ช่องโหว่ CVE-2012–1823 แต่ php.exe ดันยอมให้ค่า “-” ที่หน้าตาคล้ายกันนั้น เป็นการใส่ Argument เพิ่มเข้าไปได้โดยอักษรที่ว่า คือ %AD () ที่ใน Windows ภาษาจีนและญี่ปุ่นค่า Unicode นี้ให้ใช้แทนที่ %2D “-” ได้ ทำให้เรา Exploit ช่องโหว่ PHP-CGI เดิมของปี 2012 ด้วย Payload หน้าตาแบบนี้ได้ (ใช้ %AD แทน “-”) ตามภาพที่ 5
https:// example-host /cgi.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input
ซึ่งผลลัพธ์ที่ได้จะทำให้เราพบหน้า phpinfo() ของระบบได้ดังภาพที่ 6
ส่วน Version PHP ที่ได้รับผลกระทบ ได้แก่ PHP 8.3 < 8.3.8 PHP 8.2 < 8.2.20 PHP 8.1 < 8.1.29
การลดผลกระทบช่องโหว่ CVE-2024–4577
- อัปเกรดเวอร์ชัน PHP ให้เป็นล่าสุด (แนะนำให้ผู้ใช้อัปเกรดไปยังเวอร์ชัน PHP ล่าสุดที่มีอยู่ คือ 8.3.8, 8.2.20, และ 8.1.29)
- หากผู้ดูแลระบบใช้ XAMPP และไม่ต้องการฟีเจอร์ PHP CGI ให้ค้นหาคำสั่ง “ScriptAlias” ใน Apache configuration file (โดยทั่วไปจะอยู่ที่ ‘C:/xampp/apache/conf/extra/httpd-xampp.conf’) และ comment บรรทัดดังกล่าวออกไป
- ทำการ Sanitize และตรวจสอบความถูกต้องของพารามิเตอร์ที่รับเข้ามา
- ใช้การตั้งค่าที่ปลอดภัยเพื่อจำกัดการจัดการพารามิเตอร์ CGI
- ผู้ดูแลระบบพิจารณาย้ายจาก CGI ไปยังทางเลือกที่ปลอดภัยกว่า เช่น FastCGI, PHP-FPM และ Mod-PHP
เครื่องมือที่ใช้ช่วยในการหาช่องโหว่ CVE-2024–4577 เช่น Nuclei ด้วยคำสั่ง
nuclei -id cve-2024–4577 -list target.txt
ดังตัวอย่างภาพที่ 7
สรุปช่องโหว่ PHP-CGI RCE (CVE-2024–4577) เป็นช่องโหว่ที่มีผลกระทบอย่างรุนแรงต่อความปลอดภัยของระบบเทคโนโลยีสารสนเทศ การแก้ไขช่องโหว่นี้เป็นเรื่องสำคัญที่ผู้ดูแลระบบควรให้ความสำคัญเป็นอย่างยิ่ง เพื่อป้องกันไม่ให้ผู้ไม่ประสงค์ดีสามารถเข้าถึงและควบคุมระบบได้โดยไม่ได้รับอนุญาต
แนวทางปฏิบัติที่สำคัญสำหรับการลดความเสี่ยง คือควรอัปเกรดเวอร์ชัน PHP ล่าสุด ตรวจสอบข้อมูลขาเข้า และถึงใช้เครื่องมือช่วยในการตรวจจับช่องโหว่
การเรียนรู้และการแบ่งปันข้อมูลเป็นกุญแจสำคัญในการสร้างโลกดิจิทัลที่ปลอดภัยและยั่งยืน ขอให้ทุกท่านมีประสบการณ์ที่ดีและปลอดภัยในการใช้เทคโนโลยีสารสนเทศต่อไป ขอบคุณทุกท่านที่ติดตามและอ่านบทความนี้ครับ ขอบคุณครับ
Reference
- https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/
- https://x.com/longhackz/status/1799133564992365035?t=0FrBcpESUzhSKhZHzHnBhg
- https://pentesterlab.com/exercises/cve-2012-1823/course?ref=labs.watchtowr.com
- https://www.i-secure.co.th/2024/06/php-%E0%B9%81%E0%B8%81%E0%B9%89%E0%B9%84%E0%B8%82%E0%B8%8A%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B9%82%E0%B8%AB%E0%B8%A7%E0%B9%88-rce-%E0%B8%A3%E0%B8%B0%E0%B8%94%E0%B8%B1%E0%B8%9A-critical-%E0%B8%97%E0%B8%B5/
- https://www.thaicreate.com/web-host/web-host-apache-httpd.html
- https://github.com/TAM-K592/CVE-2024-4577
- https://x.com/pdnuclei/status/1799940293904765003