用 curl 重放请求

在安全分析和接口测试中,我们经常需要脱离浏览器图形界面,直接通过命令行工具 curl 来构造、重放和调试 HTTP 请求。 掌握 curl 之后,我们可以更自由地观察请求细节、重放浏览器发出的请求,并快速验证接口行为。

准备命令行环境

打开本机终端,或 WSL、Kali Linux 等环境中的终端,将实验任务中给出的 Web 入口地址保存到环境变量中。 请将下面命令里的 https://你的实验入口URL 替换为你自己的真实实验地址:

crow@kali:~$ target_url="https://你的实验入口URL"
crow@kali:~$ target_url=${target_url%/}

这里使用 ${target_url%/} 的目的是去掉 URL 末尾可能存在的斜杠,避免后续拼接地址时出现双斜杠。

接下来,使用 curl 获取网站首页的 HTML,并保存到本地文件中:

crow@kali:~$ curl -sS "$target_url/" -o home.html
crow@kali:~$ head -n 3 home.html
<!doctype html>
<html lang="zh-CN">
<head>

命令说明如下:

  • -sS:静默模式,隐藏下载进度条,只在发生网络错误时显示错误信息;
  • -o home.html:将服务器返回的响应体保存到 home.html 文件中;
  • "$target_url/":使用双引号包裹 URL,避免 Shell 将特殊字符错误解析。

浏览器与 curl 的联动:Copy as cURL

浏览器自带的开发者工具可以帮我们更轻松地还原真实请求。 在 Network 面板中,我们可以右键点击任意一条已经捕获的请求,选择 Copy → Copy as cURL:

在搜索请求上选择 Copy as cURL

将复制出来的 curl 命令粘贴到终端中直接执行,就可以尽量完整、准确地重现浏览器刚才发出的请求,包括请求方法、请求头、查询参数、表单数据等信息。

对于需要复现登录状态、携带特殊请求头或测试异常参数的场景,这个能力非常实用。

curl 常用实战参数速查

参数选项功能与核心用途
-i同时显示响应头和响应体
-I发送 HEAD 请求,只获取响应头
-D -发送 GET 请求,并将响应头输出到终端;配合 -o /dev/null 可以只显示响应头
-v详细调试模式,显示 TCP 连接、TLS 握手、请求头 > 和响应头 < 等完整过程
-A "自定义UA"自定义或修改 User-Agent 请求头
-H "Header: Value"添加任意自定义请求头,例如 -H "Content-Type: application/json"
-d "data"发送 POST 请求,并携带请求体数据
-c cookies.txt将服务器返回的 Set-Cookie 保存到本地文件,相当于写入 Cookie
-b cookies.txt在请求中自动携带本地文件里的 Cookie,相当于读取 Cookie
-L自动跟随服务器返回的 3xx 重定向

这些参数组合起来,可以覆盖大多数接口测试和请求调试场景。 例如,想只看响应头,可以使用 -I;想同时保留 Cookie 并继续请求,则可以先用 -c 保存 Cookie,再用 -b 读取 Cookie。

其中最常用到的是 -H,它让我们自己指定请求头。服务器有时会根据请求头返回不同内容,用 curl 就能改一个头再看结果。

用 curl 换个请求头拿到抢先章节

Lab

启动笔趣城,点 TARGET Web 打开网站,把入口地址复制到本机 curl。

《我在医院学斩鬼》有一章抢先内容在 /vip。用浏览器直接打开它会返回 403,因为这一章只发给笔趣城的手机客户端。用 curl 给这次请求带上手机客户端的 User-Agent(值为 BiquApp)重放,读出响应里给出的内容授权码,提交这个以 COIN 开头的值。

测试范围是当前实例,提交成功会结束会话。

加载会话状态…

提交 coin

题解 Hint