1. 项目概述:一次由“无害”跳转引发的深度入侵
最近在复盘一些内部渗透测试的案例时,一个由302状态码跳转引发的连锁攻击链让我印象尤为深刻。表面上看,这只是一个普通的HTTP重定向,但当我们把它和CRLF注入、SSRF漏洞串联起来,最终目标直指内网脆弱的Redis服务时,整个攻击的杀伤力就完全不一样了。这绝不是纸上谈兵的理论,而是我在实际红队评估中多次验证过的有效路径。很多开发者和运维人员对302跳转的认知可能还停留在“页面临时移动”的层面,对CRLF(回车换行)注入的危害性也估计不足,更别提将它们组合起来作为SSRF的跳板,去攻击内网那些默认配置、毫无防护的Redis实例了。这篇文章,我就来拆解这套“302跳转 -> CRLF注入 -> SSRF -> Redis未授权访问”的组合拳,从漏洞原理、环境搭建、手工利用到自动化脚本,给你一份可以直接上手复现的实战手册。无论你是安全工程师想提升实战能力,还是开发/运维同学想加固自己的系统,相信都能从中找到有价值的东西。
2. 攻击链核心原理深度拆解
要理解这套组合拳,我们必须先拆解其中的每一个技术环节,以及它们是如何环环相扣的。整个攻击链的起点,往往是一个可以被用户控制输入,并最终会触发302跳转的功能点。
2.1 302状态码:不只是重定向那么简单
HTTP 302 Found状态码,俗称“临时重定向”,是Web开发中最常用的跳转机制之一。服务器通过响应头 Location: [目标URL] 来告诉浏览器:“你要的资源暂时不在这里,去另一个地方找”。常见的场景包括用户登录后跳回原页面、短链接服务、第三方登录回调等。
问题的关键在于,这个 Location 字段的值,很多时候是拼接了用户输入生成的。例如,一个简单的跳转接口: https://victim.com/redirect?url=https://target.com 后端代码可能这样处理(以Python Flask为例):
from flask import request, redirect
@app.route('/redirect')
def do_redirect():
target_url = request.args.get('url', '/')
return redirect(target_url, code=302)
看起来人畜无害,对吧?但如果攻击者传入的 url 参数不是简单的 https://target.com ,而是一个精心构造的字符串,故事就开始了。服务器在拼接响应头时,如果没有对用户输入进行严格的过滤和编码,就可能将攻击者注入的特殊字符原样输出到HTTP响应流中。这正是CRLF注入的突破口。
2.2 CRLF注入:在HTTP响应中“夹带私货”
CRLF是“Carriage Return”和“Line Feed”的缩写,即 \r\n ,在HTTP协议中用于标识头部字段的结束和头部与正文的分隔。一个标准的HTTP响应看起来是这样的:
HTTP/1.1 302 Found
Location: https://target.com
Content-Type: text/html
...
[空行 \r\n]
[响应正文]
如果攻击者能够控制 Location 字段的部分内容,并注入 \r\n 字符,他就可以提前结束当前的响应头,并开始写入新的响应头,甚至直接写入响应正文。
假设攻击者传入这样的参数: url=https://target.com\r\nSet-Cookie: admin=true\r\n\r\n<h1>Hacked</h1> 后端未过滤直接拼接,生成的响应可能变成:
HTTP/1.1 302 Found
Location: https://target.com
Set-Cookie: admin=true
<h1>Hacked</h1>
Content-Type: text/html
...
你看,攻击者成功注入了一个新的 Set-Cookie 头和一个HTML正文。这被称为“HTTP响应头拆分”攻击。在本次攻击链中,我们利用CRLF注入的主要目的,是篡改响应体,为后续的SSRF攻击做准备,而不仅仅是添加一个头。
注意 :现代Web框架和中间件对CRLF注入的防护已经加强,直接注入
\r\n字符可能会被转义或拦截。因此,实战中我们需要进行编码绕过。最常用的是URL编码:%0d%0a分别代表\r和\n。所以上面的攻击载荷会写作:https://target.com%0d%0aSet-Cookie: admin=true%0d%0a%0d%0a<h1>Hacked</h1>。
2.3 SSRF:打通内网通道的利器
服务器端请求伪造(SSRF)允许攻击者诱使服务器向任意地址发起网络请求。如果这个存在CRLF注入的302跳转接口,其最终请求是由服务器后端发起的(例如,用于获取跳转目标页面的标题进行预览,或者进行合法性校验),那么它就可能演变成一个SSRF漏洞。
结合CRLF注入,我们可以构造一个特殊的URL,使得服务器在发起请求时,请求的不是我们指定的 Location ,而是内网地址。但这里有一个更巧妙的利用方式:我们并不直接让302跳转去访问内网IP,而是利用CRLF注入,在302响应的 正文 里,嵌入一个指向内网资源的HTML标签(如 <img src=”http://172.16.0.10”> )。当某些浏览器或客户端(如旧版爬虫、某些预览功能)在处理这个302响应时,可能会解析响应正文中的HTML并自动加载其中的资源,从而由 客户端 发起到内网的请求。这属于一种间接的SSRF利用方式。但更直接、更通用的方式,是寻找那些后端服务会主动请求 Location 地址的场景。
2.4 Redis未授权访问:内网的“致命一击”
Redis因其高性能常被用作缓存或数据库,但它的默认配置存在一个巨大风险:绑定在 0.0.0.0:6379 且无需密码认证。这意味着,任何能够连接到该端口的客户端,都可以执行任意命令,包括写入文件、执行系统命令等。
当SSRF漏洞允许我们访问内网时,探测和攻击Redis服务就成了一个高价值目标。通过SSRF向 http://172.16.0.10:6379 发送精心构造的HTTP请求(Redis协议可以封装在HTTP请求中,或者利用某些SSRF技巧直接进行TCP交互),我们可以实现:
- 信息泄露 :连接Redis,获取所有键值对。
- 写入Webshell :如果知道Web目录路径,可以通过Redis将恶意代码写入一个
.php或.jsp文件。 - 写入SSH公钥 :向目标Redis服务器的
~/.ssh/authorized_keys文件写入攻击者的公钥,直接获取SSH权限。 - 定时任务反弹Shell :通过Redis写入Crontab任务,执行反弹Shell命令。
将这四个环节串联起来,攻击路径就清晰了: 找到一个可控的302跳转点 -> 利用CRLF注入污染响应 -> 结合服务端或客户端的请求行为触发SSRF -> 通过SSRF探测并攻击内网无认证的Redis服务。
3. 靶场环境搭建与漏洞复现
理论讲完了,我们动



被折叠的 条评论
为什么被折叠?



