PHP 5.3.9被發(fā)現(xiàn)存在漏洞,這一消息引起了開發(fā)者和安全專家的強烈關(guān)注。該漏洞在PHP 5.3.9中存在安全隱患,可能會影響PHP Web應(yīng)用程序的安全性。漏洞主要是指在調(diào)用類庫函數(shù)的時候,基于一個編寫的錯誤或隱患將可能導(dǎo)致惡意攻擊的利用。
一個中小型信貸網(wǎng)站(DEMO站)的開發(fā)者發(fā)現(xiàn)了這個重大Bug。該漏洞被成功利用并導(dǎo)致數(shù)據(jù)泄露,攻擊者竊取了用戶數(shù)據(jù)并公布在互聯(lián)網(wǎng)上。開發(fā)者在深度調(diào)查后發(fā)現(xiàn)漏洞根源是由PHP 5.3.9版本的某個函數(shù)的實現(xiàn)問題導(dǎo)致的,該函數(shù)將用戶輸入處理后的數(shù)據(jù)返回到網(wǎng)站服務(wù)器上,攻擊者可以利用該函數(shù)錯誤地處理惡意代碼,從而導(dǎo)致數(shù)據(jù)泄露。
function getUserInput($input) {
return $input;
}
雖然在調(diào)用該函數(shù)前可以處理用戶的輸入數(shù)據(jù),并確保這些數(shù)據(jù)是安全的,但如果后續(xù)的處理是基于getUserInput()函數(shù)返回的結(jié)果進行的,則可能會存在潛在的漏洞。例如,在下面的代碼示例中,使用了getUserInput函數(shù)處理了從表單傳遞的數(shù)據(jù),并將其插入到數(shù)據(jù)庫中:
$name = getUserInput($_POST['name']);
$query = "INSERT INTO users (name) VALUES('$name')";
mysql_query($query);
在該示例中,雖然我們使用了mysql_real_escape_string()方法對用戶輸入進行了處理,但如果getUserInput返回了帶有惡意代碼的內(nèi)容,則mysql_real_escape_string()方法也無法保護應(yīng)用程序免受攻擊。因此,您應(yīng)該在使用 $_POST,$_GET 和 $_REQUEST等PHP變量之前,對其進行適當(dāng)?shù)陌踩^濾處理。
另一個可能在這個版本中存在的潛在問題是通過使用libxml_disable_entity_loader()函數(shù)來處理XML文檔時可能遭受的攻擊。libxml_disable_entity_loader()函數(shù)可以禁用實體加載器,這可能會導(dǎo)致XML注入攻擊,例如XXE(XML外部實體注入)。以下是一個示例代碼,展示了如何使用libxml_disable_entity_loader()函數(shù)處理一個帶有潛在的XXE攻擊的XML文檔:
libxml_disable_entity_loader (false);
$xmlDoc = new DOMDocument ();
$xmlDoc->loadXML ('<!DOCTYPE demo [
<!ENTITY xxe SYSTEM "file: /etc/passwd">]>
<demo>&xxe;</demo>');
PHP 5.3.9漏洞并非非常容易被攻擊者利用,但這并不意味著不需要重視。所以,為了保證PHP應(yīng)用程序的安全性,請盡早升級您的PHP版本,或考慮使用其他安全機制來保護您的應(yīng)用程序。