退出登录后重放预订请求

网络安全Beginner
立即练习

介绍

Fieldwork Studio 的会员可以查看已预订的工作坊,并下载预订确认文件。团队新增了 Sign out this browser。返回登录页面看起来很有说服力,但这不能证明之前捕获的会话是否仍然有效。

你将使用 Kali 中的 Burp Suite Community Edition 作为 HTTP 代理,并使用其 Repeater,保留原始请求,在退出登录后测试两个受保护资源。交付成果是私密的请求与响应证据,以及不含密码的简短验收结论。你负责评估应用,不修复其服务器。

本实验只假定你掌握基本终端输入和 Tab 切换。实验会介绍 HTTP 响应、cookie 和 Burp 控件。所有身份和预订均为合成内容,提供的环境是隔离环境。仅使用提供给你的账户和课程目标。包含阅读和普通操作错误在内,预计需要约 65 分钟;这是作者估计,不是初学者试学测量结果。

确认真实的会员预订

本步骤将在测试退出登录前,先确认正常使用流程。打开 Kali 终端 Auditor。起始目录为 /home/labex/project。cat 用于显示文本文件。阅读提供的授权、身份和服务地址:

cat scope.json

基础 URL 是 http://members.test:8080/autumn。使用用户名 morgan 和密码 PaperDay!47。你的会员身份是 Morgan Reed,预订了 Printmaking 的 P12 座位。感叹号是密码的一部分;请将它输入浏览器表单。不要测试其他身份或外部站点,也不要修改目标数据、代码或进程。

如果图形工作区显示 Disconnected,点击顶部的 Reconnect 按钮。这会重新连接现有窗口,并保留浏览器 cookie、Burp 请求和目标进度。

打开 Burp。Burp Community 已安装。在启动向导中保持选中 Temporary project,点击 Next。保持选中 Use Burp defaults,然后点击 Start Burp。如果出现 Burp Suite is out of date,点击 OK,继续使用已准备好的训练版本。等待主窗口出现。临时项目将当前工作区保存在内存中;本课程通过显式导出 XML 保存证据文件,不使用付费的磁盘项目功能。

Burp 是一个代理:准备好的浏览器通过它发送 HTTP 请求,让你能够检查实际通信。在 Burp 中选择主选项卡 Proxy,再选择子选项卡 Intercept。按钮必须显示 Intercept is off。如果显示 Intercept is on,点击一次。拦截会暂停请求;你需要在记录历史的同时让请求正常通过。

切换到 LabEx 的 Browser A Tab。这是与 Burp 位于同一审计容器中、已准备好的 Chromium 浏览器。点击地址栏,输入以下 URL,然后按 Enter:

http://members.test:8080/autumn/

阅读公共工作坊页面,选择 View my booking。在 Username 和 Password 中填写提供的凭据,点击 Sign in。如果 Chromium 询问是否保存密码,选择 Never。你应进入 Your next day of making,看到 Morgan Reed、Printmaking 和 P12 座位。

点击 Download booking。真实的 fieldwork-booking.csv 包含会员、工作坊和座位信息。Chromium 底部的下载栏显示已下载文件;Show all 会打开下载列表。公共工作坊浏览、查看自己的预订以及此下载功能,都是你需要保留的正常功能。

Morgan Reed 已确认的 Printmaking 预订及 Download booking 操作

下载前,检查预订卡片上的会员、工作坊和座位。

密码错误时,会出现 Sign-in unsuccessful,并提供 try again 链接。点击该链接,重新输入提供的值。Page not found 响应表示路径错误;返回上面的准确基础 URL。浏览器连接错误表示没有获得应用响应:检查 URL,完成 Burp 向导,并确保拦截已关闭。不要将连接失败视为安全拒绝。

Browser B 是供下一个实验使用的独立浏览器配置文件;本实验中不使用它。两个浏览器 Tab 和 Burp 是同一审计容器中的窗口,不是独立的虚拟机。切换 LabEx Tab 不会重置目标或你的工作。

在 Repeater 中保留原始请求

本步骤将保留已成功执行过的请求。切换到 Burp,选择 Proxy,然后选择 HTTP history。找到发往 members.test:8080 的 /autumn/account 的 GET 请求。请求是浏览器发送的内容;响应是服务器返回的内容。GET 用于读取资源。HTTP 200 OK 表示该请求获得了成功响应。

点击账户请求所在行。在其请求编辑器中选择 Raw,找到 Cookie 请求头。登录时,服务器签发了名为 studio_session 的会话 cookie:浏览器发送此值来标识已认证的会话。持有旧 cookie 正是你要测试的条件。清除浏览器 cookie,再尝试不带 cookie 的新请求,测试的是另一个问题。

右键点击账户请求所在行,选择 Send to Repeater。Repeater 让你再次发送保留的请求并检查新响应。然后找到发往 /autumn/booking.csv 的 GET 请求,右键点击并选择 Send to Repeater。如果历史过滤器隐藏了 CSV 请求,点击表格上方的过滤栏并启用 Show all,然后关闭过滤对话框,再次找到准确路径。根据主机和路径识别请求,不要只看行的位置。

选择主选项卡 Repeater。按照你发送的顺序,第一个编号请求选项卡 1 是账户请求,2 是预订请求。在 1 中,确认目标为 http://members.test:8080,请求行是 GET /autumn/account HTTP/1.1,且原始 studio_session cookie 仍在。点击 Send。在响应窗格中选择 Raw,读取 HTTP/1.0 200 OK 和预订页面内容。

选择 2 并点击 Send。预期会看到 200 OK、text/csv 内容类型和真实预订记录。服务器使用的 HTTP 版本可能与请求不同;有意义的观察是状态和实际会员预订内容。

两个保留的请求必须使用相同的会话 cookie。在 Burp 中比较这些值,不要复制到报告中。在整个退出登录过程中,保持这两个 Repeater 请求不变:不要删除或替换 cookie,不要替换目标,也不要通过这些选项卡发送退出登录请求。成功的基线使后续比较有意义。

如果发送了错误的历史记录行,只关闭该 Repeater 请求选项卡,再发送正确的记录行。根据路径识别正确请求;选项卡编号可能随之变化。关闭请求选项卡不同于关闭 Burp 或重置 VM。

本步骤将区分浏览器中可见的退出登录与服务器端会话失效。切换到 Browser A。在预订页面点击 Sign out this browser。浏览器返回登录页面 Welcome back。

仅凭页面变化不能证明服务器已停止接受旧 cookie。切换到 Burp,打开 Repeater,选择原始账户请求,再次点击 Send。保持 cookie 不变。预期会看到 200 OK 和 Morgan Reed 的预订内容。退出登录后,旧会话仍可访问账户资源。

选择原始预订请求,再次点击 Send。预期会看到 200 OK、text/csv 和同一会员的预订记录。这是使用旧 cookie 获得的真实成功下载响应;看起来成功的浏览器页面,或只包含登录表单的 HTTP 200,都不能证明这一点。

如果“仅退出当前浏览器”的功能正确工作,两个保留的受保护请求都应改为收到 401 Unauthorized,表示应用拒绝该会话。这里,服务器在两个资源上仍接受它。根据观察到的证据,拒绝验收这次退出登录改动。你证明的是这项具体会话缺陷,而不是应用中所有可能的弱点。

确认普通使用仍然可行。切换到 Browser A,再次使用 morgan 和 PaperDay!47 登录,查看预订,并点击 Download booking。这会签发新会话,并确认正常会员流程仍然可用。返回 Burp,不要替换两个原始 Repeater 请求中的 cookie。它们最近一次的响应仍须是退出登录后的响应,下一步将导出这些响应。

退出登录后,原始预订请求仍返回 Morgan Reed 的 CSV

将左侧 Request 窗格中未变的 Cookie,与右侧 Response 窗格中的 200 OK 和真实会员记录进行比较。仅凭成功状态不能证明能访问这条预订。

如果意外覆盖了原始 cookie,或关闭了两个保留的请求,请重新完成一次完整测试:捕获一个在两个资源上均成功的新会话,保留其请求,退出该会话,再重放完全相同的请求。新登录得到的 cookie 不能替代你已退出的那个会话的 cookie。

交付私密证据和明确结论

本步骤将保存真实 HTTP 证据,同时避免在评估报告中包含凭据。切换到 Auditor。请求与响应证据包含可用的会话 cookie,因此保存前先限制访问。

umask 077 让新建文件和目录仅供你的用户访问。它应用于当前终端会话,不会影响今后的每个 shell。mkdir -p 会按需创建指定目录。chmod 700 赋予所有者读、写及进入目录的权限,不授予组和其他用户任何访问权限。

umask 077
mkdir -p evidence
chmod 700 evidence

切换到 Burp,在 Repeater 中选择原始账户请求。确认当前响应是退出登录后的 200 OK 预订页面。在 Request 编辑器内右键点击,选择 Save item。这会将请求和响应一并保存;Copy to file 保存的是不同内容。

在 Select a file 对话框的 File Name 中输入此绝对路径:

/home/labex/project/evidence/account-after.xml

Save item 对话框中的账户证据绝对路径及已勾选的 Base64 选项

使用靠近底部的 File Name 字段;已勾选的 Base64 选项位于它下方。

保持勾选 Base64-encode requests and responses,然后点击 Save。Base64 能在 XML 中安全表示原始字节,但不会加密 cookie。如果出现成功提示,点击 OK 关闭。对原始预订请求重复 Save item,使用:

/home/labex/project/evidence/booking-after.xml

切换到 Auditor。chmod 600 只允许所有者读写各文件。ls -l 显示权限;两个 XML 文件都应为 -rw-------。

chmod 600 evidence/account-after.xml evidence/booking-after.xml
ls -l evidence

编写下面这份不含密码的评估报告。> 替换指定文件。<<'JSON' 开始一个 here-document:shell 按原样复制后续行,直到独占一行的结束标记 JSON。数值状态不加引号;JSON true 是布尔值。报告中不要包含 cookie、密码或原始请求。

cat > assessment.json <<'JSON'
{
  "decision": "reject",
  "account_after_logout": 200,
  "booking_after_logout": 200,
  "fresh_sign_in_works": true
}
JSON

阅读评估报告,检查普通输入错误:

cat assessment.json

交付成果是两份私密 XML 条目和这份评估报告。条目保留携带原始 cookie 的请求及其真实响应;报告传达有证据支持的结论,不重复秘密。验证会根据现有服务器事实检查这些关系。它不会替你创建缺失的登录、退出登录或重放流量,并保持你的文件不变。其常规公共页面保留检查请求可能追加一条访问记录。

如果文件名错误,重新使用 Save item 保存到指定绝对路径,并再次应用 chmod 600。如果切换过目录,pwd 显示当前目录,cd /home/labex/project 返回工作区。不要用手写的成功提示或截图替代缺失证据。

总结

你建立了真实预订基线,在 Burp Repeater 中保留两个携带原始 cookie 的请求,退出登录后证明了服务器仍接受这两个请求。浏览器返回登录页面不能证明会话已失效。你保留了正常流程,并交付私密 HTTP 证据及不含密码的拒绝验收结论。

下一个实验将检查修正后的部署。独立浏览器将帮助你区分结束当前会话与不必要地结束同一会员的所有会话。