当前位置: 首页 > 科技观察

PHP7和PHP5在安全方面的区别

时间:2023-03-23 11:14:52 科技观察

前言在之前的测试中,发现很多菜刀都不能再用了,几乎3/4的大马都无法在php7上正常运行。百度了一下,网上没有找到太多相关的文章,所以自己总结测试了一下安全性的区别。函数修改1.preg_replace()不再支持/e修饰符使用\e修饰符执行后面codedoorofthecode你已经用过很多了,详见官方说明:如果设置了这个deprecated修饰符,preg_replace()会用反向引用替换被替换的字符串作为php代码(eval函数方法)进行求值和执行,将执行结果作为实际参与替换的字符串。替换反向引用时,单引号、双引号、反斜杠()和NULL字符将使用反斜杠进行转义。不幸的是,PHP7以上的版本不再支持\e修饰符,官方给了我们一个新的函数preg_replace_callback:这里稍微修改一下就可以作为我们的后门:2.create_function()isobsolete少了一种可以作为后门函数,其实就是通过执行eval来实现。可有可无。3.删除mysql_*系列的所有成员。如果想在PHP7上使用老版本的mysql_*系列函数,需要自己安装。正式版不再收录。现在官方推荐的是mysqli或者pdo_mysql。这是不是预示着以后PHP中的SQL注入漏洞会大大减少呢~4.unserialize()添加一个可选的白名单参数$data=unserialize($serializedObj1,["allowed_classes"=>true]);$data2=unserialize($serializedObj2,["allowed_classes"=>["MyClass1","MyClass2"]]);实际上是一个白名单,如果反序列化数据中的类名不在这个白名单中,就会报错。像这样的错误!它可以是类名或布尔数据。如果为FALSE,所有对象将被转换为__PHP_Incomplete_Class对象。TRUE是无限的。也可以传入类名实现白名单。幸运的是,它是可选的但不是强制性的。如果默认为FALSE,逼着程序员做白名单,那可真要吐血了。5.assert()不再能够默认执行代码。这就是很多马用不上的罪魁祸首。太多的马使用assert()来执行代码。本次更新基本被淘汰。一般可以改成eval。跑起来了~提一下菜刀在实现文件管理器的时候恰好用到了assert函数,导致菜刀在PHP7上无法正常运行。语法修改1.foreach不再改变内部数组指针&$n){echo"";}print_r($a);foreach($aas$k=>$n){echo"";}print_r($a);这种代码在php5中,是执行结果:因为数组最后一个元素的$value引用在foreach循环后还是会保留,第二次循环的时候其实是连续赋值之前的指针。php7中按值遍历时,操作的值是数组的一个副本,不影响后续操作。此更改会影响某些无法在PHP7上利用的cms漏洞...您知道我指的是哪个漏洞。这个问题在PHP7.0.0以后的版本已经改回来了,只影响这个版本。2、降低了八进制字符的容错率。在php5版本中,如果一个八进制字符包含无效数字,无效数字将被静默截断。上述代码在PHP5中运行结果如下:PHP7运行结果如下:你以为我想说这个在后续版本改回来了吗?不行,现在还没有改回PHP7.3的迹象,官方说不会改了。.公平地说,这仍然很痛。4.删除了ASP和scriptPHP标签,现在只有这样的标签才能在php7上运行。字面意思其实影响不大(只是以后节目套路少了点)。5.大浮点数类型转换截断当浮点数转换为整数时,如果浮点值太大而无法用整数表示,在PHP5版本中,转换将直接截断整数和不会触发错误。在PHP7中,会报错。CTF少了一个出题套路。这个问题我只在CTF上看到过,影响应该不大。杂项exec()、system()passthru()函数添加了对NULL的保护。list()不能再解包字符串变量$HTTP_RAW_POST_DATA被移除__autoload()方法被弃用parse_str()不添加第二个参数会直接将字符串导入到当前符号表中,如果添加则转换成数组。现在第二个参数是强制选项。统一不同平台下的整数长度。session_start()可以添加一个数组覆盖php.ini的配置后记本文将长期保持更新和更正。但遗憾的是FB的作者在发布后无权更改,所以后续的更新会发布在博客上。如果有错误或不完整的部分,请通过bad_guys@qq.com与我联系。引用:http://php.net/

最新推荐
猜你喜欢