phpinfo页面那些有用的信息
date
Mar 11, 2021
slug
useful-phpinfo-info
status
Published
tags
PHP安全
安全研究
Website
summary
简单地学习整理一下
type
Post
phpinfo的标题会展示当前的版本信息php.ini 相关配置Server APIRegistered PHP StreamsRegistered Stream Filtersfastcgi相关的配置session相关信息:
参考: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函数
这里可以找到一些旧版的trtick:http://www.cnblogs.com/iamstudy/articles/study_from_php_update_log.html
类似的还有很多:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2Fab7e9c9a-b4b5-480f-b467-59ea32ee378e%2FUntitled.png%3Fid%3D29a22b49-0525-4494-841c-63c3fdfe5509%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DfvZrh5ei1lzfZLs6IRBcxPiPibNwygRUU903i9KeMu4?table=block&id=29a22b49-0525-4494-841c-63c3fdfe5509&cache=v2)
php.ini 相关配置
php.ini是一个PHP配置文件,但其实并不一定每个php环境都会有这个文件
在php的这个属性就会展示是否指定了该文件,下图的Loaded Configuration File为None,说明并没有被加载
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F2ab34157-ca43-4542-962f-681ce5b17bee%2FUntitled.png%3Fid%3D88494907-e9e7-49c8-a64a-04e23665b0c2%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3Dr4PtzJPsAqcUUULmgpF3QRBJfFnvwUt7fnq4Qr6mg7s?table=block&id=88494907-e9e7-49c8-a64a-04e23665b0c2&cache=v2)
没有指定,就相当于使用默认配置,但是默认配置的含义是需要注意的:
1.没有任何php.ini时,某个配置项默认的值 2.用apt等源管理工具安装php后,默认php.ini里配置的值
上述两个“默认配置”在大部分情况下是相同的,但还是有些许不同。
其中一个就是$REQUEST这个变量包含的内容:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F9123402a-4821-441c-be41-657402c3aeaa%2FUntitled.png%3Fid%3Da46a558b-a5ce-41b3-8899-36a281ab9ab7%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DKvjh9l8ZLetg0o-mZvOT8_KC6G5nSsojyVLWIJMZlog?table=block&id=a46a558b-a5ce-41b3-8899-36a281ab9ab7&cache=v2)
除了默认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](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2Fe966b58d-9824-464d-a275-f13a82933d43%2FUntitled.png%3Fid%3D1609f503-fd4e-4c4b-99d8-13e5a399e776%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DOf7TLeKRjbQKJbWhMYYAvpC3hpmoSDTpAfgYADA6vP0?table=block&id=1609f503-fd4e-4c4b-99d8-13e5a399e776&cache=v2)
Registered Stream Filters
这个属性列出了一些默认支持的filter流
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2Fb1774792-07cb-4865-882a-a8c02e0815ff%2FUntitled.png%3Fid%3Dbc93d34d-8e54-451c-b2cc-6875a7e64e9c%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3Dr2WC9MDuHGyppm0EN72g990bE_9lXviU0GI73NUztEQ?table=block&id=bc93d34d-8e54-451c-b2cc-6875a7e64e9c&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F31621fe2-66cb-4aae-a828-9f6a20ad160a%2FUntitled.png%3Fid%3D6a3b3732-3040-467b-baa5-b8e64ff75ce9%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3D9flsGX4g0ZBkfLBlzX7zukfgie07q0ADTCMOQUyjJqg?table=block&id=6a3b3732-3040-467b-baa5-b8e64ff75ce9&cache=v2)
fastcgi相关的配置
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F33efdd60-2036-460f-9744-a932d8381ed6%2FUntitled.png%3Fid%3D06c13226-2b9f-4e94-ad33-e058345d10fd%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3D_SUjiLiOmkhU_tr70BO0NDcPxZnox1E6KIePfaCgpx4?table=block&id=06c13226-2b9f-4e94-ad33-e058345d10fd&cache=v2)
运行fastcgi环境的会存在下面的phpinfo信息
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F18293c5e-1f6f-4635-afea-6faa9c647bca%2FUntitled.png%3Fid%3D60cd91f0-39b1-4d3f-9488-c4581c2194fb%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DMLu8stiEDAaq_mb2tkNMGbTOdc88uuBQCmlQNSCjqSg?table=block&id=60cd91f0-39b1-4d3f-9488-c4581c2194fb&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F8944b29a-de65-44f6-bd7c-fa9b4ac464e1%2FUntitled.png%3Fid%3Dcaf0d002-935a-4209-a3a6-f1984900ef09%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DFIwLzwvs3HQCjjUh281pZGWSKd7fXiJ5uWmwdguONFs?table=block&id=caf0d002-935a-4209-a3a6-f1984900ef09&cache=v2)
fastcgi其中的cgi.fix_pathinfo配置可能会产生的解析问题
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2Fca5df85f-78c2-469f-a0e5-8f3ba7aa90dc%2FUntitled.png%3Fid%3D1f6ee770-ad0b-4c71-b8ca-4a5b32608662%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3Dn_r10eW3Ewns0j0A_7yVNQzgd9lpL-FxuRia3SLSEBQ?table=block&id=1f6ee770-ad0b-4c71-b8ca-4a5b32608662&cache=v2)
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将存储在/tmpdebian或ubuntu下应该是编译的时候就把/var/lib/php5/sessions硬编码到二进制文件里了,我们用strings /usr/bin/php | grep /var/lib/php5/sessions的确能找到这个字符串
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2Fae9e01de-93bd-4547-b0ee-5a258eae6c3a%2FUntitled.png%3Fid%3D9b72ad30-48e9-4fc9-bb92-20a79823b616%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DRrzcDzVbWgU8fvkxUR5yb2r3EZ9Bd-ENv-bW4n2LkqU?table=block&id=9b72ad30-48e9-4fc9-bb92-20a79823b616&cache=v2)
另外,save_path完整的配置如下:
N;MODE;/path
N是session存储的目录深度,指定了这个值后,session会被分散在一些子目录里,避免因为session文件过多导致目录太大进不去的情况,MODE是session文件的权限,默认是600
session_path的初值是不受open_basedir影响的,但如果中途修改其值,还是会受影响。
session的存储方式:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2Fd4ea8ad6-97da-404e-aab9-ed13ea368873%2FUntitled.png%3Fid%3D5e19e5fb-1148-4501-a2fc-efe017eede26%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DOUuImTXjGR-z3IZ9Eoy8nzRCM9X8d8RdMDgorF8277Y?table=block&id=5e19e5fb-1148-4501-a2fc-efe017eede26&cache=v2)
指定的方法:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F3a5744cd-6a03-4fd3-b9be-12a8320b1358%2FUntitled.png%3Fid%3D3acbc9ce-0a88-4a4b-899c-3f2c6f61ae25%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DvjoTQUHkIHOjCyNbU4xKkQSuLc3yJjbJxCTKOjwp-yI?table=block&id=3acbc9ce-0a88-4a4b-899c-3f2c6f61ae25&cache=v2)
session 的利用方式:
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2Fd3e64420-aa0e-437b-8481-b253a394b3a1%2FUntitled.png%3Fid%3De801b527-1d28-486e-8e2c-a10073558005%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DsbYiC6qh6gbBEt-gOLnOAmv5uoRoEDeGww6YFeYEvxI?table=block&id=e801b527-1d28-486e-8e2c-a10073558005&cache=v2)
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](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F90821c10-bcd3-438c-9b1c-1aafdf3f7144%2FUntitled.png%3Fid%3D9cbd510e-553a-4749-8ae2-bf914329db88%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DvQOtgGGC7FKhLUkft0bWPOF06nv9JF7nSjMc0M9HVzo?table=block&id=9cbd510e-553a-4749-8ae2-bf914329db88&cache=v2)
session.cookie的一些属性:
这个问题经典:
Cookie是否遵守同源规则呢? 答案是否定的,Cookie有一套自己的安全机制,这也是很多前端问题的根源。
判断两个页面是否同源,需要scheme、domain、port三者完全相同,而在Cookie中,限制其能不能被读取的是如下几个选项:
cookie_domain
,设置Cookie的域名
cookie_httponly
,设置HTTPONLY
cookie_path
,设置Cookie在哪个PATH下才能被读取
cookie_secure
,设置Cookie只能在https页面中被传输与读取
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2Fc113620e-b4a6-4a92-bee1-d70b242f1a2f%2F2306c64b-2a01-44b1-928c-e9714228ae34%2FUntitled.png%3Fid%3Da579b2ec-20c8-4050-85eb-ec115b05cc01%26table%3Dblock%26spaceId%3Dc113620e-b4a6-4a92-bee1-d70b242f1a2f%26expirationTimestamp%3D1722146400000%26signature%3DQ83DzCwlaw1ZgmEZ7Qqkk_dIuGD0VSy5s8_ekg2N3hg?table=block&id=a579b2ec-20c8-4050-85eb-ec115b05cc01&cache=v2)