PHP上傳漏洞是目前互聯(lián)網(wǎng)安全領域中比較常見的一種漏洞,攻擊者可以利用該漏洞來上傳不安全的文件,比如可執(zhí)行腳本、木馬、病毒等,以達到入侵網(wǎng)站系統(tǒng)的目的。
目前互聯(lián)網(wǎng)上被攻擊的例子數(shù)不勝數(shù)。比如2016年,全球有130余萬臺設備并入了一個由幾個惡性案件組成的非法挖礦網(wǎng)絡。這個網(wǎng)絡會利用被入侵設備的計算資源從而非法挖掘比特幣。而這些設備中有很多是因為PHP上傳漏洞而被攻擊。
那么,PHP上傳漏洞都有哪些形式呢?其中最常見的就是通過修改文件后綴名來上傳可執(zhí)行腳本。攻擊者將可執(zhí)行腳本的文件后綴名改為PHP、ASP等可執(zhí)行的文件后綴名,然后再通過上傳將這些可執(zhí)行文件放到服務器上。當用戶請求該文件時,服務器就會將它解釋為可以被執(zhí)行的PHP腳本并運行。這樣一來,攻擊者就可以在服務器上執(zhí)行惡意腳本了。
接下來我們來看一下最常見的上傳漏洞攻擊代碼。攻擊者可以通過上傳下面的代碼來上傳可執(zhí)行腳本:
$allowedExtensions = array("gif", "jpeg", "jpg", "png"); foreach ($_FILES as $file) { $temp = explode(".", $file["name"]); $extension = end($temp); if ((($file["type"] == "image/gif") || ($file["type"] == "image/jpeg") || ($file["type"] == "image/jpg") || ($file["type"] == "image/pjpeg") || ($file["type"] == "image/x-png") || ($file["type"] == "image/png")) && ($file["size"] < 50000) && in_array($extension, $allowedExtensions)) { if ($file["error"] > 0) { echo "Return Code: " . $file["error"] . "<br />"; } else { echo "Upload: " . $file["name"] . "<br />"; echo "Type: " . $file["type"] . "<br />"; echo "Size: " . ($file["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $file["tmp_name"] . "<br />"; if (file_exists("upload/" . $file["name"])) { echo $file["name"] . " already exists. "; } else { move_uploaded_file($file["tmp_name"], "upload/" . $file["name"]); echo "Stored in: " . "upload/" . $file["name"]; } } } else { echo "Invalid file"; } }
上述代碼中,攻擊者只需要將可執(zhí)行文件的后綴名改為其中的一個,然后將其上傳到服務器就可以實現(xiàn)入侵。實際上,攻擊者也可以采用其他方法,比如通過在上傳表單中添加注入腳本、添加多個文件保護漏洞等等來實現(xiàn)通過上傳入侵服務器的目的。
如何避免PHP上傳漏洞呢?除了小心謹慎選擇第三方上傳組件之外,更重要的是開發(fā)人員需要適當限制上傳文件的類型、大小、文件類型后綴名等等,確保上傳的文件都是安全的。
如果您是個人用戶,可以在FTP上傳時將對應目錄設置為只讀屬性以避免漏洞被利用。如果您是企業(yè)用戶,建議您咨詢專業(yè)的互聯(lián)網(wǎng)安全公司,通過外包安全人員或認證安全產(chǎn)品來確保網(wǎng)站的安全。
總的來說,PHP上傳漏洞可以被視為互聯(lián)網(wǎng)安全領域中的老大難問題。如果網(wǎng)站管理員或者開發(fā)人員不重視這個問題,那么就會造成非常大的損失。因此,我們要保持警惕,防范于未然。