转载
https://landgrey.me/open-redirect-bypass/
0x00:漏洞场景
URL跳转漏洞的出现场景还是很杂的,出现漏洞的原因大概有以下5个:
1. 写代码时没有考虑过任意URL跳转漏洞,或者根本不知道/不认为这是个漏洞; 2. 写代码时考虑不周,用取子串、取后缀等方法简单判断,代码逻辑可被绕过; 3. 对传入参数做一些奇葩的操作(域名剪切/拼接/重组)和判断,适得其反,反被绕过; 4. 原始语言自带的解析URL、判断域名的函数库出现逻辑漏洞或者意外特性,可被绕过; 5. 原始语言、服务器/容器特性、浏览器等对标准URL协议解析处理等差异性导致被绕过;
在没有分清楚具体场景时,一味的堆积姿势常常是费力不讨好。总结完常见的漏洞场景,就可以根据总结情况,写个脚本,生成所有可能的payload,再放到工具(如burpsuite)里批量尝试,既省事,又不会人为遗漏。
由于不同语言对HTTP协议的实现和跳转函数的实现不一致,所以可能会出现对某种语言或框架特定的利用方式。
漏洞通常发生在以下几个地方:
1. 用户登录、统一身份认证处,认证完后会跳转 2. 用户分享、收藏内容过后,会跳转 3. 跨站点认证、授权后,会跳转 4. 站内点击其它网址链接时,会跳转
常见的参数名:
redirect redirect_to redirect_url url jump jump_to target to link linkto domain
几种语句和框架版本常见的URL跳转代码如下,可用作白盒代码审计参考:
Java: response.sendRedirect(request.getParameter("url"));
PHP: $redirect_url = $_GET['url']; header("Location: " . $redirect_url);
.NET: string redirect_url = request.QueryString["url"]; Response.Redirect(redirect_url);
Django: redirect_url = request.GET.get("url") HttpResponseRedirect(redirect_url)
Flask: redirect_url = request.form['url'] redirect(redirect_url)