phpinfo页面那些有用的信息

date
Mar 11, 2021
slug
useful-phpinfo-info
status
Published
tags
PHP安全
安全研究
Website
summary
简单地学习整理一下
type
Post
参考:P牛的知识星球

phpinfo的标题会展示当前的版本信息

PHP 5.6 是官方最后一个支持的PHP 5版本,不过,这个版本也已经于2017年1月19号停止功能性更新,只提供安全更新。到2018年12月31号为止,PHP 5.6也将完全终止更新,PHP5彻底退出历史舞台。 PHP7里提供了很多更好用的语法、函数,也极大改进了安全性。
  • 移除不支持SQL预编译的Mysql扩展:mysql
  • 移除preg_replace中容易导致代码执行漏洞的正则模式:e
  • assert从一个函数变成一个语法结构(类似eval,无法再动态调用。至此,大量PHP一句话木马将失效),7.2中废弃字符串形式的参数
  • hex字符串(如0xf4c3b00c)不再被作为数字,is_numeric也不再认可
  • 7.2中废弃可以动态执行字符串的 create_function
  • 7.2中废弃容易导致变量覆盖的无第二个参数的parse_str
  • 移除<script language="php">和<% %>,这两种另类的PHP标签,但是这种还是支持的<?=”hack”;?>
  • 移除dl函数
类似的还有很多:
notion image

php.ini 相关配置

php.ini是一个PHP配置文件,但其实并不一定每个php环境都会有这个文件
在php的这个属性就会展示是否指定了该文件,下图的Loaded Configuration File为None,说明并没有被加载
notion image
没有指定,就相当于使用默认配置,但是默认配置的含义是需要注意的:
1.没有任何php.ini时,某个配置项默认的值 2.用apt等源管理工具安装php后,默认php.ini里配置的值
上述两个“默认配置”在大部分情况下是相同的,但还是有些许不同。
其中一个就是$REQUEST这个变量包含的内容:
notion image
除了默认php配置,在编译PHP的时候,我们可以指定--with-config-file-path--with-config-file-scan-dir。 这两个配置项的意思是,PHP会在--with-config-file-path指定的目录下寻找php.ini文件,如果找到则加载之;除此之外,PHP还会在--with-config-file-scan-dir指定的目录下,寻找所有以.ini为后缀的文件,加载其为配置文件,这个配置是可以覆盖php.ini中配置的。 所以,通常用apt-get install php-pdo来安装php扩展,都会在--with-config-file-scan-dir下写入新的配置文件,而不是修改php.ini。
用处:所以遇到phpinfo页面,即可用过这两个配置项,来定位php.ini以及额外配置文件的位置

Server API

一般有这几种:Apache 2.0 Handle,FPM/FastCGI,Built-in HTTP server
但是Apache也不一定必须用这种SAPI,他同样也支持用Fastcgi和PHP-FPM通信。所以,即使你在实战中遇到了服务器是Apache的环境,也不能就此认定其一定存在Apache模块。

Registered PHP Streams

这个属性列出了PHP默认支持的一些协议,这些协议会有一些用处
notion image

Registered Stream Filters

这个属性列出了一些默认支持的filter流
notion image
notion image

fastcgi相关的配置

notion image
运行fastcgi环境的会存在下面的phpinfo信息
notion image
notion image
fastcgi其中的cgi.fix_pathinfo配置可能会产生的解析问题
notion image

session相关信息:

session.save_path设置了session的存储路径
debian或ubuntu下用源安装php,默认的php.ini中没有这个配置项,实际session会存储在/var/lib/php5/sessions/var/lib/php/sessions
centos下用源安装php,默认的php.ini中设置了这个值为/var/lib/php/sessions。如果去除这个设置,session将存储在/tmp
debian或ubuntu下应该是编译的时候就把/var/lib/php5/sessions硬编码到二进制文件里了,我们用strings /usr/bin/php | grep /var/lib/php5/sessions的确能找到这个字符串
notion image
另外,save_path完整的配置如下:
N;MODE;/path
N是session存储的目录深度,指定了这个值后,session会被分散在一些子目录里,避免因为session文件过多导致目录太大进不去的情况,MODE是session文件的权限,默认是600
session_path的初值是不受open_basedir影响的,但如果中途修改其值,还是会受影响。

session的存储方式:

notion image
指定的方法:
notion image

session 的利用方式:

notion image
session.lazy_write 属性
这个属性是PHP 7以后引入的,改进了Session的性能。当这个值设置成1时(默认就是1),Session数据只有在请求结束后才写入文件,而且如果没有操作,则不会重新写入文件。
也就是说这样的一段代码是读不了任何东西的:
<?php
session_start();
$_SESSION['a'] = 2;
readfile('/tmp/sess_' . session_id());
因为在执行readfile的时候还没结束请求,所以session.lazy_write还没写入
session.name 属性
session.name是Session设置到Cookie里的键名,默认为PHPSESSID。这也是很多时候,我们发现Cookie中有PHPSESSID,基本就能判断后端是PHP开发的了。
session.use_strict_mode是个有趣的配置,有时候也和安全有一定关系
默认情况下,session.use_strict_mode值是0。此时用户是可以自己定义Session ID的。比如,我们在Cookie里设置PHPSESSID=zsxqzsxq,PHP将会在服务器上创建一个文件:/tmp/sess_zsxqzsxq。
那么,我们自然会想到,如果设置PHPSESSID是../../etc/cron.hourly/test,是不是就能写入任意文件了呢?显然PHP不会犯这样的错误,ID的值仅限于“a-z, A-Z, 0-9 and '-,'”。(其实有一些版本好像有些字符仍然允许,不过我记不得具体是哪些版本哪些字符了)
如果将session.use_strict_mode设置为1,用户就不能自定义Session ID了,Session ID必须是服务器初始化后发送给用户。
默认情况下,session.use_strict_mode值是0会带来很大的帮助,在PHP中,通常初始化Session的操作是执行session_start()。所以我们在审计PHP代码的时候,会在一些公共文件或入口文件里看到上述代码。那么,如果一个网站没有执行这个初始化的操作,一般是不可以创建这个文件了,但是有一个选项可能会影响这个功能,就是session.auto_start这个选项
session.auto_start如果开启这个选项,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,也是通常情况下,这个选项都是关闭的。
那要怎么另类触发呢?
使用session.upload_progress这个属性,这个属性最初是PHP为上传进度条设计的一个功能,在上传文件较大的情况下,PHP将进行流式上传,并将进度信息放在Session中(包含用户可控的值),即使此时用户没有初始化Session,PHP也会自动初始化Session。而且,默认情况下session.upload_progress.enabled是为On的,也就是说这个特性默认开启
这个点一般都是配合文件包含进行利用,在cookie上设置相关内容,就会得到改名字结尾的文件,并且还需要进行竞争才有可能触发文件包含,具体触发步骤如下:
notion image

session.cookie的一些属性:

这个问题经典:
Cookie是否遵守同源规则呢? 答案是否定的,Cookie有一套自己的安全机制,这也是很多前端问题的根源。
判断两个页面是否同源,需要scheme、domain、port三者完全相同,而在Cookie中,限制其能不能被读取的是如下几个选项:
  1. cookie_domain,设置Cookie的域名
  1. cookie_httponly,设置HTTPONLY
  1. cookie_path,设置Cookie在哪个PATH下才能被读取
  1. cookie_secure,设置Cookie只能在https页面中被传输与读取
notion image

© 4me 2021 - 2024