目录
[(1)PHP 版本信息 (PHP Version)](#(1)PHP 版本信息 (PHP Version))
[(3)PHP 指令 (PHP Variables)](#(3)PHP 指令 (PHP Variables))
[(6)HTTP 请求和响应头](#(6)HTTP 请求和响应头)
本文讲解CTFHub的信息泄露-PHPINFO关卡的原理和渗透实战的全过程,系统分析了PHPINFO泄露的安全风险及实战渗透过程。phpinfo()函数会输出PHP环境的详细配置信息,包括系统路径、环境变量等敏感数据。开发者常因调试后未删除临时文件导致该风险。攻击者利用这些信息可实施进一步渗透。文中演示了通过靶场环境访问phpinfo页面,搜索关键词获取flag值的完整渗透流程,强调了及时清理调试文件的重要性。
一、PHPINFO泄露
1、什么是phpinfo?
phpinfo()
是PHP内置的一个函数。当在PHP脚本中调用该函数时,它会生成一个详细的HTML页面,显示关于当前PHP环境的几乎所有配置信息。
<?php phpinfo(); ?>
phpinfo()
的输出被组织成多个模块化的章节,每一部分都揭示了不同层面的信息。以下是其输出的关键内容的详细分解:
(1)PHP 版本信息 (PHP Version)
-
内容 :显示当前安装的 PHP 的确切版本号(如
8.1.12
)。 -
风险:攻击者可以根据已知的 PHP 版本,寻找该版本特有的公开安全风险和 exploits(攻击代码)。使用已停止维护的旧版本(如 PHP 5.x)风险极高。

(2)系统信息 (System)
-
内容 :运行 Web 服务器的操作系统的类型/版本/各种系统信息(如
Linux server01 5.15.0-xx-generic #xx-Ubuntu SMP ...
)。 -
关键风险点:
-
可用于寻找针对特定操作系统版本的攻击手段。
-
显示 PHP 正在使用的
php.ini
主配置文件的绝对路径(如/etc/php/8.1/apache2/php.ini
)。知道了路径,攻击者可能会尝试利用文件包含去获取该配置文件,从而了解所有的环境设置。
-

(3)PHP 指令 (PHP Variables)
-
内容 :这是最庞大的部分,列出了
php.ini
中所有配置指令的当前生效值。 -
关键项与风险:
-
allow_url_include
:如果为On
,PHP 可以通过include()
或require()
函数加载远程 URL 的文件,这为远程文件包含 (RFI) 打开了大门。 -
disable_functions
:显示被禁用的函数列表。攻击者会查看哪些危险的函数(如system
,exec
,passthru
,shell_exec
)未被禁用,从而规划攻击载荷。 -
open_basedir
:定义了 PHP 可以访问文件的目录范围。攻击者可以了解限制的边界,尝试绕过。 -
display_errors
:如果为On
,可能会在网站上泄露敏感的错误信息,帮助攻击者推断程序逻辑和数据库结构。
-
Directive | Local Value | Master Value |
---|---|---|
allow_url_fopen | On | On |
allow_url_include | Off | Off |
arg_separator.input | & | & |
arg_separator.output | & | & |
auto_append_file | no value | no value |
auto_globals_jit | On | On |
auto_prepend_file | no value | no value |
browscap | no value | no value |
default_charset | UTF-8 | UTF-8 |
default_mimetype | text/html | text/html |
disable_classes | no value | no value |
disable_functions | no value | no value |
display_errors | On | On |
display_startup_errors | Off | Off |
doc_root | no value | no value |
docref_ext | no value | no value |
docref_root | no value | no value |
enable_dl | On | On |
enable_post_data_reading | On | On |
error_append_string | no value | no value |
error_log | no value | no value |
error_prepend_string | no value | no value |
error_reporting | no value | no value |
expose_php | On | On |
extension_dir | /usr/local/lib/php/extensions/no-debug-non-zts-20180731 | /usr/local/lib/php/extensions/no-debug-non-zts-20180731 |
file_uploads | On | On |
hard_timeout | 2 | 2 |
highlight.comment | #FF8000 | #FF8000 |
highlight.default | #0000BB | #0000BB |
highlight.html | #000000 | #000000 |
highlight.keyword | #007700 | #007700 |
highlight.string | #DD0000 | #DD0000 |
html_errors | On | On |
ignore_repeated_errors | Off | Off |
ignore_repeated_source | Off | Off |
ignore_user_abort | Off | Off |
implicit_flush | Off | Off |
include_path | .:/usr/local/lib/php | .:/usr/local/lib/php |
input_encoding | no value | no value |
internal_encoding | no value | no value |
log_errors | Off | Off |
log_errors_max_len | 1024 | 1024 |
mail.add_x_header | Off | Off |
mail.force_extra_parameters | no value | no value |
mail.log | no value | no value |
max_execution_time | 30 | 30 |
max_file_uploads | 20 | 20 |
max_input_nesting_level | 64 | 64 |
max_input_time | -1 | -1 |
max_input_vars | 1000 | 1000 |
memory_limit | 128M | 128M |
open_basedir | no value | no value |
output_buffering | 0 | 0 |
output_encoding | no value | no value |
output_handler | no value | no value |
post_max_size | 8M | 8M |
precision | 14 | 14 |
realpath_cache_size | 4096K | 4096K |
realpath_cache_ttl | 120 | 120 |
register_argc_argv | On | On |
report_memleaks | On | On |
report_zend_debug | On | On |
request_order | no value | no value |
sendmail_from | no value | no value |
sendmail_path | -t -i | -t -i |
serialize_precision | -1 | -1 |
short_open_tag | On | On |
SMTP | localhost | localhost |
smtp_port | 25 | 25 |
sys_temp_dir | no value | no value |
syslog.facility | LOG_USER | LOG_USER |
syslog.filter | no-ctrl | no-ctrl |
syslog.ident | php | php |
track_errors | Off | Off |
unserialize_callback_func | no value | no value |
upload_max_filesize | 2M | 2M |
upload_tmp_dir | no value | no value |
user_dir | no value | no value |
user_ini.cache_ttl | 300 | 300 |
user_ini.filename | .user.ini | .user.ini |
variables_order | EGPCS | EGPCS |
xmlrpc_error_number | 0 | 0 |
xmlrpc_errors | Off | Off |
zend.assertions | 1 | 1 |
zend.detect_unicode | On | On |
zend.enable_gc | On | On |
zend.multibyte | Off | Off |
zend.script_encoding | no value | no value |
zend.signal_check | Off | Off |
(4)模块信息 (Modules)
-
内容 :列出所有已编译和加载的 PHP 扩展模块(如
mysqli
,gd
,curl
,openssl
等)。 -
风险:每个模块都可能引入新的函数和潜在的安全风险,攻击者会寻找特定模块的已知风险。

(5)环境变量 (Environment)
-
内容:显示操作系统环境变量。
-
风险:这些变量可能包含由运维人员设置的敏感信息,如数据库连接字符串、API 密钥、加密密钥等。如果配置不当,这些秘密会直接暴露。
-
$_SERVER['SCRIPT_FILENAME']
:这是绝对路径泄露 中最致命的一项。它显示了当前执行的脚本在服务器上的完整路径(如/var/www/html/public/index.php
)。这是利用本地文件包含 (LFI) 的关键,因为很多 LFI 需要知道文件的绝对路径才能成功包含。 -
$_SERVER['DOCUMENT_ROOT']
:显示了 Web 服务器的根目录绝对路径。 -
$_SERVER['PATH']
:系统的 PATH 环境变量。
-

(6)HTTP 请求和响应头
-
内容:显示当前请求的所有 HTTP 请求头和响应头。
-
风险 :可能会泄露使用的 Web 服务器软件版本、PHP 版本(通过
X-Powered-By
头)等,这些信息同样可用于指纹识别和寻找安全风险。

2、为什么phpinfo会泄露?
phpinfo泄露的原理是:开发者将包含 phpinfo()
函数的调试脚本遗留在生产环境的Web目录中,导致任何用户都能访问该页面,从而获取关于服务器PHP环境的极度敏感和详细的配置信息。
(1)根源:开发运维的坏习惯
-
调试目的 :
phpinfo()
是PHP内置的一个极其有用的调试函数。开发者和运维人员会创建一个包含<?php phpinfo(); ?>
的脚本(如info.php
,test.php
,phpinfo.php
),用于:-
验证PHP是否安装成功。
-
检查扩展(如
mysql
,gd
)是否加载。 -
查看
php.ini
配置文件的具体设置。 -
确认环境变量和系统路径是否正确。
-
-
疏忽遗留 :问题在于,在完成调试并将代码部署到生产服务器后,这个临时用于调试的文件没有被删除 。它就被静静地留在了Web根目录(如
/var/www/html/
)下,对互联网上的任何人可见。
(2)技术层面:服务器如何处理请求
-
静态文件 vs. 动态文件:Web服务器(如Apache、Nginx)对待不同文件的处理方式不同。
-
对于
.jpg
,.txt
等静态文件,服务器会直接将其内容返回给浏览器。 -
对于
.php
等动态文件,服务器会先将文件交给 PHP解释器 执行,然后将执行后的 输出结果 返回给浏览器。
-
-
phpinfo()
的执行 :当用户访问http://example.com/phpinfo.php
时:-
Web服务器识别到这是一个
.php
文件。 -
服务器将该文件交给PHP解释器。
-
PHP解释器执行
phpinfo()
函数。 -
该函数生成一个包含大量系统信息的HTML页面。
-
这个HTML页面作为执行结果被发回给用户的浏览器。
-
3、phpinfo泄露的危害
phpinfo()
页面是一个信息宝库,对攻击者来说价值连城。它泄露的信息主要包括:
-
系统路径:
-
_SERVER["SCRIPT_FILENAME"]
: 当前脚本的绝对路径。这是最关键的信息之一。 -
_SERVER["PATH_TRANSLATED"]
: 另一个显示绝对路径的变量。 -
Configuration File (php.ini) Path
:php.ini
配置文件的位置。
-
-
环境变量:
_SERVER
和_ENV
数组中的所有变量,可能包含数据库密码等硬编码的敏感信息。
-
PHP配置:
-
allow_url_include
: 是否允许远程文件包含(RFI)。如果为On,则可以利用文件包含获取Webshell。 -
open_basedir
: PHP可访问的目录限制。 -
disable_functions
: 被禁用的函数列表,帮助攻击者规避防护,选择可用的函数。
-
-
扩展模块: 已安装的PHP扩展,这可以帮助攻击者寻找特定扩展相关安全风险点。
二、PHPINFO渗透实战
1、打开靶场
通过信息泄露-PHPINFO打开靶场题目,本关卡没有提示,只能根据题目名称为phpinfo,分析可能与phpinfo相关,具体如下所示。

点击打开题目,此时系统自动创建Docker环境,下图蓝色部分的URL地址就是靶场环境。

打开靶场链接(challenge-3ed19e9090db0182.sandbox.ctfhub.com),如下所示,提示点击查看phpinfo。
http://challenge-3ed19e9090db0182.sandbox.ctfhub.com:10800/

2、查看phpinfo
点击查看phpinfo,如下所示,当前页面显示phpinfo的执行效果。
http://challenge-3ed19e9090db0182.sandbox.ctfhub.com:10800/phpinfo.php

3、获取flag值
打开浏览器的搜索功能(Ctrl+F),重点搜索以下关键词搜索关键字ctfhub,如下所示找到flag值,渗透成功。

提交flag后如下所示,告知flag正确,说明渗透成功。
