ทำความรู้จักช่องโหว่ PHP-CGI RCE (CVE-2024–4577)

Datafarm
4 min readJun 12, 2024

ปัจจุบันข่าวเรื่องความปลอดภัยทางเทคโนโลยี กลายเป็นหัวข้อที่ได้รับความสนใจและถูกให้สำคัญมากในปี 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 (ที่มา: https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/)

“-” ที่ 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 (ที่มา: https://pentesterlab.com/exercises/cve-2012-1823/course?ref=labs.watchtowr.com)

จากภาพที่ 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

ภาพที่ 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
ภาพที่ 5

ซึ่งผลลัพธ์ที่ได้จะทำให้เราพบหน้า phpinfo() ของระบบได้ดังภาพที่ 6

ภาพที่ 6 (ที่มา: https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/)

ส่วน Version PHP ที่ได้รับผลกระทบ ได้แก่ PHP 8.3 < 8.3.8 PHP 8.2 < 8.2.20 PHP 8.1 < 8.1.29

การลดผลกระทบช่องโหว่ CVE-2024–4577

  1. อัปเกรดเวอร์ชัน PHP ให้เป็นล่าสุด (แนะนำให้ผู้ใช้อัปเกรดไปยังเวอร์ชัน PHP ล่าสุดที่มีอยู่ คือ 8.3.8, 8.2.20, และ 8.1.29)
  2. หากผู้ดูแลระบบใช้ XAMPP และไม่ต้องการฟีเจอร์ PHP CGI ให้ค้นหาคำสั่ง “ScriptAlias” ใน Apache configuration file (โดยทั่วไปจะอยู่ที่ ‘C:/xampp/apache/conf/extra/httpd-xampp.conf’) และ comment บรรทัดดังกล่าวออกไป
  3. ทำการ Sanitize และตรวจสอบความถูกต้องของพารามิเตอร์ที่รับเข้ามา
  4. ใช้การตั้งค่าที่ปลอดภัยเพื่อจำกัดการจัดการพารามิเตอร์ CGI
  5. ผู้ดูแลระบบพิจารณาย้ายจาก CGI ไปยังทางเลือกที่ปลอดภัยกว่า เช่น FastCGI, PHP-FPM และ Mod-PHP

เครื่องมือที่ใช้ช่วยในการหาช่องโหว่ CVE-2024–4577 เช่น Nuclei ด้วยคำสั่ง

nuclei -id cve-2024–4577 -list target.txt

ดังตัวอย่างภาพที่ 7

ภาพที่ 7 (ที่มา: https://x.com/pdnuclei/status/1799940293904765003)

สรุปช่องโหว่ PHP-CGI RCE (CVE-2024–4577) เป็นช่องโหว่ที่มีผลกระทบอย่างรุนแรงต่อความปลอดภัยของระบบเทคโนโลยีสารสนเทศ การแก้ไขช่องโหว่นี้เป็นเรื่องสำคัญที่ผู้ดูแลระบบควรให้ความสำคัญเป็นอย่างยิ่ง เพื่อป้องกันไม่ให้ผู้ไม่ประสงค์ดีสามารถเข้าถึงและควบคุมระบบได้โดยไม่ได้รับอนุญาต

แนวทางปฏิบัติที่สำคัญสำหรับการลดความเสี่ยง คือควรอัปเกรดเวอร์ชัน PHP ล่าสุด ตรวจสอบข้อมูลขาเข้า และถึงใช้เครื่องมือช่วยในการตรวจจับช่องโหว่

การเรียนรู้และการแบ่งปันข้อมูลเป็นกุญแจสำคัญในการสร้างโลกดิจิทัลที่ปลอดภัยและยั่งยืน ขอให้ทุกท่านมีประสบการณ์ที่ดีและปลอดภัยในการใช้เทคโนโลยีสารสนเทศต่อไป ขอบคุณทุกท่านที่ติดตามและอ่านบทความนี้ครับ ขอบคุณครับ

--

--

Responses (1)