
大家好,我是 Vista_AX 👋
最近好多朋友私信问CRLF 注入靶场怎么过,今天干脆统一捋一遍,带大家丝滑通关第一个实战靶场。
这是一类经典却容易被忽视的 Web 漏洞------只要你能往响应头里塞一个回车换行,整个 HTTP 响应就可能变成你的"游乐场"。
抓包工具准备好了吗?直接开整!🔧
天积靶场免费下载地址:
- 国内推荐 Gitee 地址 :https://gitee.com/HeaSec/HeaSecWebLab
- Github 地址 :https://github.com/HeaSec/HeaSecWebLab
第一步:信息收集 --- 读懂题目在说什么 🕵️♂️
进入靶场后,查看靶场说明:
"需要利用CRLF注入漏洞构造特定的钓鱼链接使用户访问后会跳转到指定的页面"
提取关键信息"利用CRLF注入漏洞",CRLF漏洞又名HTTP响应拆分漏洞,因Web应用未严格验证用户输入,导致攻击者可在HTTP头中注入回车换行符,从而篡改HTTP响应头。由此判断本靶场可能和篡改HTTP 响应头有关。

保持着这个思考,再来看看页面用户登录处的提示:
"请构建一个请求链接,点击后会自动跳转到百度"
抓住关键信息"跳转到百度",结合CRLF注入,猜测通关需要改变HTTP响应头的方式实现百度页面的跳转。

接着,既然有测试账号可以登录,那就登录看看呗,尝试用测试账号heasec/123456登录,发现页面存在新提示。
"想一想,有哪些响应头可以实现页面跳转?在什么样的情况下才能生效?"
好,进一步明确漏洞确实和 HTTP 响应头 有关,那接下去进一步抓包看看,看看靶场的请求包构成,看看怎么有机会能够篡改响应包...
第二步:功能分析 --- "用户名"暗藏玄机 🔍
仔细观察进入靶场的页面行为:
- 登录表单的用户名输入框,会 自动填充 heasec 用户名

产生疑问🤔,用户名是如何传入的?
发现浏览器上头URL 中赫然写着:
index.php?username=heasec
用 Yakit 抓包,看看服务端到底干了什么👇:
请求:GET /index.php?username=heasec
响应头中出现了:X-User-Name: heasec

发现关键线索 :服务端把 username 参数的值,直接写进了 HTTP 响应头(X-User-Name)中。((实际场景通常是输出到Set-Cookie中用于设置cookie记住用户名,这里使用X-User-Name头来模拟)
那从这里我们可以猜测,通过修改 username 参数的值,是不是就可以控制响应头了?进一步尝试看看
第三步:理解 CRLF --- 控制响应头
如何控制响应头呢,先来理解CRLF,HTTP 协议中,响应头之间用 \r\n(CRLF,即回车+换行)分隔,头部和响应体之间用 \r\n\r\n(双 CRLF)分隔。
已知服务端把 username 参数的值,直接写进了 HTTP 响应头(X-User-Name)中,当username=heasec时,正常的响应结构如下:
http
HTTP/1.1 200 OK\r\n
Content-Type: text/html\r\n
X-User-Name: heasec\r\n
\r\n
<html>页面内容...</html>
假设 username 参数值里包含 \r\n,服务端又没有过滤,那猜想就可以 注入额外的响应头,被构造的响应结构如下:
http
HTTP/1.1 200 OK\r\n
Content-Type: text/html\r\n
X-User-Name: heasec\r\n
X-Test: hello
\r\n
<html>页面内容...</html>
进一步验证下 猜想是否成立 ,构造测试请求(注意在浏览器地址栏中,\r\n 需要编码为 %0d%0a(URL 编码))
index.php?username=test%0d%0aX-Test:%20hello
查看响应头,成功出现了 X-Test: hello,说明CRLF注入存在,可以凭借此种方式控制响应头。

至此我们发现可以通过CRLF注入的方式成功控制响应头了。
第四步:构造请求 --- 让你跳你就得跳 🏃♂️
在可以控制响应头的情况下,进一步思考有什么响应头可以实现页面跳转?下意识反映是Location头,尝试看看
发现不行,再进一步查看,发现
Refresh响应头是可以的,那我们如何再响应包中另起一行构建Refresh响应头去实现跳转呢?
如果 username 的值里包含特殊的换行字符呢?
再构造通关 Payload ,通关要求是跳转到百度,所以注入 Refresh 头:
index.php?username=test%0d%0aRefresh:%200;url=https://www.baidu.com
解码后的效果等价于:
http
X-User-Name: test
Refresh: 0;url=https://www.baidu.com
访问这个 URL,页面成功跳转到了百度,说明CRLF注入成功。


第五步:获取通关密码
再次进入靶场,重新登录heasec账号,用户信息区域出现通关密码了。

将这串 20 位的通关密码填入 秘密验证 卡片,验证通过即可完成本关。

思路总结
| 步骤 | 做了什么 | 发现了什么 |
|---|---|---|
| 信息收集 | 阅读页面提示 | 漏洞与 HTTP 响应头、URL 参数有关 |
| 功能分析 | 观察"记住用户名"行为 | username 参数被写入X-User-Name响应头 |
| 抓包确认 | F12 查看 Network | 确认参数值未过滤直接进入响应头 |
| 原理利用 | 注入 %0d%0a 构造新响应头 |
成功注入 Refresh 头实现跳转 |
| 完成验证 | 回到页面获取密码 | 提交通关密码完成挑战 |
核心思路 :凡是用户输入被写入 HTTP 响应头的地方,都值得测试 CRLF 注入。
%0d%0a就是打开这扇门的钥匙。
