PHP开发安全问题之信息屏蔽

88 阅读3分钟

由于PHP在不同的版本中会移除一些过时的特性,这导致更换PHP版本可能会使得PHP发生大量报错,因此一个庞大且已经上线了的业务很难进行版本升级,研发人员需要学会信息屏蔽,来防止服务器信息泄露,例如:使用的是哪一个版本的PHP。

在生产环境中将这些信息显示出来是非常危险的,攻击者可能会通过提交非法的参数,诱导服务器进行报错,有可能会将 WebServer、数据库、PHP代码部署路径甚至是数据库连接、数据表等关键信息暴露出去。

01 屏蔽 PHP 错误信息

在未关闭错误显示之前,如果PHP代码中发生报错,用户端就会显示如下报错信息。

Notice: Undefined index: search in /home/wwwroot/xxx.xxx.com/index.php on line 10

这个提示信息直接暴露了程序路径以及安装的服务,很容易被攻击者利用来了解服务器的目录结构。

做法也很简单,找到php的安装目录,参考路径:/usr/local/php/etc

通过修改 php.ini 文件中的 display_errors 参数,来关闭 PHP 错误显示。

02 防止版本号暴露

PHP 5.6.26版本和7.0至7.0.13版本中存在远程拒绝服务漏洞(CNNVD-201612-759,CVE-2016-7478)。攻击者可利用该漏洞造成拒绝服务。

PHP 7.0至7.0.13版本中存在拒绝服务漏洞(CNNVD-201612-760,CVE-2016-7479)。攻击者可利用该漏洞造成拒绝服务(无限循环)。

PHP 7.0.12之前的版本中存在远程代码执行漏洞(CNNVD-201612-761,CVE-2016-7480)。远程攻击者可利用SplObjectStorage对象的反序列化函数使用未初始化变量,导致修改内存数据,执行任意代码。

在 PHP 的 mysqlnd 拓展中存在堆缓冲区溢出漏洞(CVE-2022-31626),利用该漏洞需要攻击者有连接 php 连接数据库的权限,通过建立恶意MySQL 服务器,使受害主机通过 mysqlnd 主动连接该服务器,触发缓冲区溢出,从而在受害主机上导致拒绝服务或远程执行代码。

在 PHP_FUNCTION 中分配在堆上的的 char* 数组没有被清除(CVE-2022-31625),如果发生转换错误,将会调用_php_pgsql_free_params()函数,由于数组没有初始化,导致可以释放之前请求的值,导致远程代码执行。

从上述漏洞中可以看到,不同的 PHP 版本存在着不同的安全问题,如果你将PHP的版本信息直接展示出来(默认就是打开的),攻击者就可以很容易利用已知的漏洞问题,对你的服务进行攻击。

因此建议在生产环境中务必将PHP版本号隐藏。

关闭方式:将 php.ini 中的 expose_php 参数设置为 Off 即可。

当然,不是隐藏版本号就万事大吉了,如果当前的PHP版本已经暴露出有严重漏洞问题,就一定要抓紧时间去做修复。

想要了解更多PHP开发的安全问题可以关注我哟,或者加入下面的社群也是ok的,

信息屏蔽 - 乐述云享 (aleshu.com)

【社群】PHP开发(安全问题) - 乐述云享 (aleshu.com)