皮卡丘靶场解题记录-URL重定向

1、漏洞原理总结:

略,见后文

2、我的测试过程:

image-20260903150942470

把url参数修改为外部url即可

image-20260903151028791

成功

3、核心漏洞代码分析:

1
2
3
4
5
6
7
8
9
if(isset($_GET['url']) && $_GET['url'] != null){
$url = $_GET['url'];
if($url == 'i'){
$html.="<p>好的,希望你能坚持做你自己!</p>";
}else {
header("location:{$url}");
// 接收前端传的 url,直接跳过去,没做任何白名单校验
}
}

靶场代码如上,同样是跟前面的关卡类似的原理,总之,用户可控制的信息都不可信。

这里的url是外部传入的,可以被修改

4、实战延伸:

参数名 出现的场景
redirect / redirect_to / redirect_uri 登录、第三方授权
next / return / return_url 登录后回跳上一页
target / to / goto 通用跳转
callback / callback_url OAuth 授权回调
jump / jumpUrl 老系统
rurl / ret_url 各种

常见场景:

登录后回跳:

1
https://www.xxx.com/login?redirect_to=/user/home

第三方登录/授权回调(危害最大):

1
https://www.xxx.com/oauth/qq?redirect_uri=https://evil.com/callback

如果 redirect_uri 可控,攻击者能把用户的授权码/token 转发到自己的服务器 → 直接盗号。

跳转中台:

很多大站有统一跳转接口:

1
https://www.xxx.com/jump?u=https://evil.com

但可能没做域名白名单

这些参数藏在业务流程里,得去测登录成功跳哪、分享链接怎么生成、第三方登录回调收不收这些地方,而不是像靶场一样扫一眼 URL 就行。

黑盒姿势:

方法 做法
抓登录/回跳包 登录、退出、分享时抓包,看 URL 带不带 redirect/next/return 参数
改参数试探 把参数值改成 https://evil.com (或 //evil.com),看会不会跳
测回调 第三方登录时改 redirect_uri,看授权码发去哪
浏览器 F12 看网络请求里的 Location 响应头

一般会拦截外域(白名单校验),但常常能绕过,绕过姿势:

绕过写法 原理
//evil.com 省掉协议,骗过必须 http(s) 开头的校验
https://evil.com@xxx.com 只查了字符串里含 xxx.com
https://xxx.com.evil.com 域名相似欺骗(这个不一定算绕过,看校验逻辑)
URL 编码 / 双重编码 绕过简单黑名单

判断标准:最终浏览器 Location 停在哪。用 Burp 看响应头 Location: 最直观。