最近有一個(gè)關(guān)于Php 5.2.11漏洞的警告,Php 5.2.11在處理get_magic_quotes_gpc()時(shí)會(huì)導(dǎo)致堆溢出,攻擊者可以利用這個(gè)漏洞進(jìn)行惡意注入和代碼執(zhí)行。這個(gè)漏洞可能影響用于開發(fā)網(wǎng)站的多個(gè)Web應(yīng)用程序,并可能導(dǎo)致數(shù)據(jù)損失和系統(tǒng)崩潰。下面我們來具體了解一下這個(gè)漏洞。
if (get_magic_quotes_gpc()) { foreach ($_POST as $key =>$value) { if (!is_array($value)) { $_POST[$key] = stripslashes($value); } } }
上面是Php 5.2.11版本中的代碼,其中g(shù)et_magic_quotes_gpc()函數(shù)用于檢查是否已對數(shù)組進(jìn)行轉(zhuǎn)義以防止注入攻擊,如果開啟了轉(zhuǎn)義,將對$_POST數(shù)組的每個(gè)元素執(zhí)行stripslashes()函數(shù),將轉(zhuǎn)義后的斜桿刪除。然而,這里存在一個(gè)漏洞,如果在數(shù)組中放入了一個(gè)巨大的字符串(大于4096字節(jié)),可能會(huì)導(dǎo)致分配垃圾集合中的一塊塊的內(nèi)存,這將在堆上分配大塊內(nèi)存。
$_POST['dobigstring'] = str_repeat('*', 5000);
如上代碼所示,我們放入了一個(gè)大約5000個(gè)字符長度的字符串,該字符串中的每個(gè)字符都是*。這個(gè)字符串被分配到$_POST數(shù)組中,然后被送到get_magic_quotes_gpc()函數(shù)中進(jìn)行處理。由于字符串長度超過4096個(gè)字符,將導(dǎo)致堆分配。然后,攻擊者可以利用堆溢出進(jìn)行惡意注入和代碼執(zhí)行。
要避免這個(gè)漏洞,應(yīng)該使用最新的Php版本。建議使用最新版本的Php(7.0及以上)來保護(hù)Web應(yīng)用程序免受這些類型的攻擊,并采取其他措施來保護(hù)Web應(yīng)用程序。例如,盡可能減少使用數(shù)組和其他 PHP 內(nèi)置機(jī)制來存儲數(shù)據(jù),并使用安全的編碼實(shí)踐來確保輸入數(shù)據(jù)的正確性。
總之,Php 5.2.11版本存在一個(gè)安全漏洞,攻擊者可以利用這個(gè)漏洞進(jìn)行惡意注入和代碼執(zhí)行。建議使用最新版本的Php來保護(hù)Web應(yīng)用程序免受這些類型的攻擊,并采取其他措施來保護(hù)Web應(yīng)用程序。在編寫Web應(yīng)用程序時(shí),我們應(yīng)該盡可能減少使用數(shù)組和其他PHP內(nèi)置機(jī)制來存儲數(shù)據(jù),并使用安全的編碼實(shí)踐來確保輸入數(shù)據(jù)的正確性。