Rails应用出现${ip}异常请求及不安全重定向的排查与模拟问题
问题分析与解决方案
1. 漏洞类型判断
这个现象大概率是**开放重定向(Open Redirect)**漏洞的探测行为。攻击者构造包含${ip}的请求,试图诱导应用跳转到指定外部IP的/signin页面,以此实施钓鱼攻击——比如让用户误以为是官方登录页,进而泄露账号密码。
Rails抛出的「Unsafe redirect」提示,正是框架检测到重定向目标为不可信外部地址时的安全警告,说明应用内可能存在未校验重定向目标的逻辑(比如直接使用请求参数中的URL完成跳转)。
2. 模拟请求验证
用curl或wget模拟这类请求的核心是构造包含恶意重定向参数的请求,具体需结合应用接收跳转目标的参数名(常见如redirect_to、return_url、next等):
用curl模拟
假设应用通过redirect_to参数指定跳转目标,发起请求的命令如下:
curl -v "https://你的站点域名/login?redirect_to=https://${ip}/signin"
查看响应头的Location字段,若返回值为https://${ip}/signin,则说明存在开放重定向漏洞;若Rails拦截了该跳转,会返回安全提示或默认跳转地址。
若攻击者是通过请求头嵌入恶意目标,可尝试模拟带异常Host头的请求:
curl -v -H "Host: ${ip}" "https://你的站点域名/"
观察应用是否生成指向https://${ip}/signin的重定向。
用wget模拟
添加--max-redirect=0阻止自动跳转,便于查看重定向目标:
wget --max-redirect=0 --server-response "https://你的站点域名/login?redirect_to=https://${ip}/signin"
查看响应中的Location行即可判断是否存在漏洞。
3. 修复建议
- 严格校验重定向目标:仅允许跳转到本站域名或可信白名单域名,禁止直接使用用户可控参数作为跳转地址。
- 利用Rails内置安全机制:使用
redirect_to时添加allow_other_host: false(Rails 6+支持),或通过URI.parse解析目标地址后校验Host是否在白名单内。 - 启用Rails安全防护:确保
config/environments/production.rb中config.action_controller.default_protect_from_forgery = true已开启,同时及时跟进Rails安全更新。
内容的提问来源于stack exchange,提问作者ShockwaveNN
相关产品推荐
相关产品推荐

