ช่องโหว่ Serialization ใน PHP โจมตีผ่าน Stream Wrapper “Phar://”
โพสต์นี้เป็นการ 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 เสนอคือ
- เอาไฟล์ Phar archive ที่เป็น attack ฝังไว้ ไปวางไว้ในเครื่องเป้าหมาย
- ทำการใช้งานไฟล์ดังกล่าวผ่าน function file ต่างๆ ผ่าน XXE และอื่นๆ
โดยทาง Sam ใช้ PHPGGC / PHARGGC ในการสร้าง Phar file
1 |
phargcc -j IMG.jpg -o exploit.jpg Guzzle/RCE1 "uname -a" |
Scenario ที่ Sam ยกมานั้นมีมากมาย ไม่ว่าจะเป็นการทดสอบใน Typo 3, WordPress (ตอนนี้ก็ยังไม่ได้ fix), TCPDF (via Contao)