โพสต์นี้เป็นการ update ตัวเองเกี่ยวกับช่องโหว่ serializtion ที่ทาง @Sam Thomas  เจอและนำมาพูดในงาน Blackhat USA 2018 ช่วงสัปดาห์ที่ผ่านมา ก็เลยเอามาสรุปซักหน่อยครับ

(หากใครไม่รู้จัก Serialization แนะนำให้ไปอ่านใน link นี้ก่อนครับ)

โดยปกติแล้ว พวก function fopen(), copy(), file_exists() และ filesize() มีการ support wrapper ต่างๆมากมายโดย default มาตั้งแต่ PHP 5.3.0 (2009) โดยมีทั้ง

  • file:// (มักถูกใช้ remote file inclusion attacks)
  • http:// (มักถูกใช้ remote file inclusion attacks)
  • ftp:// (มักถูกใช้ remote file inclusion attacks)
  • php:// (มักถูกใช้กับ XXE, local file inclusion m (“php://input”,”php://filter/convert.base64-encode/resource=index.php”))
  • zlib://
  • data:// (มักถูกใช้ remote file inclusion attacks)
  • glob://
  • phar://
  • expect:// (มักถูกใช้ command execution ) ไม่ได้ถูก enable โดย default

โดย paper ที่ปล่อยออกมาของ Sam นั้นจะเจาะจงไปกับการใช้งาน phar:// ซึ่งเป็น wrapper ที่คล้ายๆกับ zlib:// เป็นการระบุตำแหน่งภายในเครื่องที่มีลักษณะเป็น Phar archive

โดยใน Phar archive ดังกล่าว จะมีส่วนที่เรียกว่า meta-data ที่จะถูกทำ unserializtion ทุกๆครั้งที่มีการเรียกใช้งานผ่าน file function (fopen, file_exists, file_get_contents, etc..) ซึ่งหาก meta-data นั้นเราฝังเป็น unserialization attack ก็จะทำให้โจมตีผ่านช่องทางนี้ได้

ขั้นตอนวิธีการโจมตีที่ทาง Sam เสนอคือ

  1. เอาไฟล์ Phar archive ที่เป็น attack ฝังไว้ ไปวางไว้ในเครื่องเป้าหมาย
  2. ทำการใช้งานไฟล์ดังกล่าวผ่าน function file ต่างๆ ผ่าน XXE และอื่นๆ

โดยทาง Sam ใช้ PHPGGC / PHARGGC ในการสร้าง Phar file

Scenario ที่ Sam ยกมานั้นมีมากมาย ไม่ว่าจะเป็นการทดสอบใน Typo 3, WordPress (ตอนนี้ก็ยังไม่ได้ fix), TCPDF (via Contao)

Source:: https://cdn2.hubspot.net/hubfs/3853213/us-18-Thomas-It’s-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-….pdf