Payload

()https://attacker.com
()index.php/index.php.attacker.com
()参数修改如:noredirect=false
()//x:1/:///%01javascript:alert(document.cookie)/
()https://attacker.com%ff@domain
()@attacker.com/?a=
()上传重定向
();url=http://www.baidu.com"http-equiv="refresh (meta标签+双引号被过滤)
()/\attacker.com
()// attacker.com
()//// attacker.com
()whitelist.com@ attacker.com
()//%2F/attacker.com
()#attacker.com
()?attacker.com
()ip
http://
()进制数
()更换协议
ftp://example.com
()去掉协议
()超链接
()协议一致性:https://www.attacker.com
()子串包含: https://www.domain.com/redirect.php?url=https://www.domain.com.attacker.com
()域名结尾必须为当前域名: https://www.domain.com/redirect.php?url=http://www.attacker.com/www.domain.com
()多次重定向:
.先重定向到子域名
https://www.domain.com/redirect.php?url=https://subdomain.com/jump.do?url=http://www.evil.com
.直接重定向到恶意域名
https://www.domain.com/redirect.php?url=https://www.attacker.com/jump.do?url=http://www.evil.com ()https://www.domain.com/%2Fevil.com%253Ecom
()http://www.domain.com\.evil.com
()http://www.domain.com////www.evil.com/..
()http://www.domain.com///www.evil.com
()http://www.domain.com////www.evil.com
()https://www.domain.com@www.evil.com
()http://www.domain.com//www.evil.com
()https://www.evil.com\www.domain.com
()https://www.evil.com#www.domain.com
()https://www.evil.com?www.domain.com
()https://www.evil.com\\www.domain.com
()https://www.domain.com.attacker.com
()https://www.domain.com/www.attacker.com
()https://www.domain.com///www.evil.com//..
()https://www.domain.com////www.evil.com//..
()http://attacker.com//%0d%0ahttp://domain.com/
()特殊字符:Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪①②③④⑤⑥⑦⑧⑨⑩

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)
Rails:
redirect_to params[:url]

0x01:利用方法

后面假设源域名为:www.landgrey.me 要跳转过去的域为:evil.com

1. 直接跳转

没做任何限制,参数后直接跟要跳转过去的网址就行:

https://www.landgrey.me/redirect.php?url=http://www.evil.com/untrust.html

2. 协议一致性

当程序员校验跳转的网址协议必须为https时(有时候跳转不过去不会给提示):

https://www.landgrey.me/redirect.php?url=https://www.evil.com/untrust.html

3. 域名字符串检测欺骗

01. 有的程序员会检测当前的域名字符串是否在要跳转过去的字符串中,是子字符串时才会跳转,php代码如:

<?php
$redirect_url = $_GET['url'];
if(strstr($redirect_url,"www.landgrey.me") !== false){
header("Location: " . $redirect_url);
}
else{
die("Forbidden");
}

绕过:

https://www.landgrey.me/redirect.php?url=http://www.landgrey.me.www.evil.com/untrust.html

一个京东的实例:

02. 还有的会检测域名结尾是不是当前域名,是的话才会跳转,Django示例代码如下:

redirect_url = request.GET.get("url")
if redirect_url.endswith('landgrey.me'):
HttpResponseRedirect(redirect_url)
else:
HttpResponseRedirect("https://www.landgrey.me")

绕过:

https://www.landgrey.me/redirect.php?url=http://www.evil.com/www.landgrey.me

或者买个xxxlandgrey.me域名,然后绕过:

https://www.landgrey.me/redirect.php?url=http://xxxlandgrey.me

03.可信站多次重定向绕过

利用已知可重定向到自己域名的可信站点的重定向,来最终重定向自己控制的站点。

一种是利用程序自己的公共白名单可信站点,如www.baidu.com,其中百度有个搜索的缓存链接比如https://www.baidu.com/linkurl=iMwwNDM6ahaxKkSFuOG,可以最终跳转到自己网站,然后测试时:

https://www.landgrey.me/redirect.php?url=https://www.baidu.com/linkurl=iMwwNDM6ahaxKkSFuOG

就可以跳转到自己站点了。

另一种类似,但是程序的跳转白名单比较严格,只能是自己域的地址,这时需要有一个目标其它域的任意跳转漏洞,比如https://auth.landgrey.me/jump.do?url=evil.com,然后测试时:

https://www.landgrey.me/redirect.php?url=https://auth.landgrey.me/jump.do?url=evil.com

4. 畸形地址绕过

这一部分由于各种语言、框架和代码实现的不同,防护任意跳转代码的多种多样;导致绕过方式乍看起来很诡异,有多诡异?举三个案例:

案例一:这个案例 ,通过添加多余的"/"(%2F)符号,再对"."两次url编码成"%252E"绕过代码中对域名后".com"的切割, 构造类似

https://landgrey.me/%2Fevil%252Ecom

达到了任意URL跳转的目的。

案例二:这个案例,通过添加4个"/"前缀和"/.."后缀,构造类似

https://landgrey.me/redirect.php?url=////www.evil.com/..

进行了绕过。

案例三:这个案例,通过"\."字符,构造类似

https://landgrey.me/redirect.php?url=http://www.evil.com\.landgrey.me

进行绕过。

手工测试时,主要结合目标对输入的跳转处理和提示,根据经验来绕过;
自动化测试时,通常是根据目标和规则,事先生成payload,用工具(如burpsuite)在漏洞点处自动发包测试;

复杂的案例,在当时测试时一般有相关提示信息,不然就是自动化fuzzing出的,实际中手工bypass的难度和花费太大。

URL跳转漏洞复杂的真实例子也比较难找。黑盒测试,经常是测试成功也不能确定到底是哪里出的问题。要达到绕过效果,主要涉及以下9个特殊字符:

";", "/", "\", "?", ":", "@", "=", "&", "."

一个“协议型”的网址示例:

http://user:pass@testweb.com/path/;help.php?q=abc#lastpage

10种bypass方式:

1. 单斜线"/"绕过
https://www.landgrey.me/redirect.php?url=/www.evil.com
2. 缺少协议绕过
https://www.landgrey.me/redirect.php?url=//www.evil.com
3. 多斜线"/"前缀绕过
https://www.landgrey.me/redirect.php?url=///www.evil.com
https://www.landgrey.me/redirect.php?url=////www.evil.com
4. 利用"@"符号绕过
https://www.landgrey.me/redirect.php?url=https://www.landgrey.me@www.evil.com
5. 利用反斜线"\"绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com\www.landgrey.me
6. 利用"#"符号绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com#www.landgrey.me
7. 利用"?"号绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com?www.landgrey.me
8. 利用"\\"绕过
https://www.landgrey.me/redirect.php?url=https://www.evil.com\\www.landgrey.me
9. 利用"."绕过
https://www.landgrey.me/redirect.php?url=.evil (可能会跳转到www.landgrey.me.evil域名)
https://www.landgrey.me/redirect.php?url=.evil.com (可能会跳转到evil.com域名)
10.重复特殊字符绕过
https://www.landgrey.me/redirect.php?url=///www.evil.com//..
https://www.landgrey.me/redirect.php?url=////www.evil.com//..

上面的方法有些是有案例,有些是别人总结的,有些是有原理依循的,比如第4条,利用"@"符号前的"www.landgrey.me"是指"www.evil.com"域的一个用户名来绕过。

5. 其它绕过思路

1. 跳转到IP地址,而不是域名;
2. 跳转到IPV6地址,而不是IPv4地址;
3. 将要跳转到的IP地址用10进制、8进制、16进制形式表示;
4. 更换协议,使用ftp、gopher协议等;
5. 借鉴SSRF漏洞绕过的tricks;
6. CRLF注入不能xss时,转向利用任意URL跳转漏洞;

6. 自动化利用

参考Github上已总结的测试payload(很杂,一些可能根本没有实例,完全是YY),按情况替换里面的域名。在黑盒情况下,可以用来批量发包测试。

0x02:防护方法

1. 代码固定跳转地址,不让用户控制变量
2. 跳转目标地址采用白名单映射机制
比如1代表auth.landgrey.me,2代表www.landgrey.me,其它不做任何动作
3. 合理充分的校验校验跳转的目标地址,非己方地址时告知用户跳转风险

url跳转漏洞(1)的更多相关文章

  1. Web安全之url跳转漏洞及bypass总结

    0x01 成因 对于URL跳转的实现一般会有几种实现方式: META标签内跳转 javascript跳转 header头跳转 通过以GET或者POST的方式接收将要跳转的URL,然后通过上面的几种方式 ...

  2. URL跳转漏洞

    URL跳转原理: 由于越来越多的需要和其他第三方应用交互,以及在自身应用内部根据不同的逻辑将用户引向到不同的页面,譬如一个典型的登录接口就经常需要在认证成功之后将用户引导到登录之前的页面,整个过程中如 ...

  3. Url跳转漏洞常见

    Url跳转漏洞常见出现点: 1.用户登录.统一身份认证处,认证完后会跳转. 2.用户分享.收藏内容过后,会跳转. 3.跨站点认证.授权后,会跳转. 4.站内点击其它网址链接时,会跳转. Url跳转漏洞 ...

  4. PHP代码审计笔记--URL跳转漏洞

    0x01 url任意跳转 未做任何限制,传入任何网址即可进行跳转. 漏洞示例代码: <?php $redirect_url = $_GET['url']; header("Locati ...

  5. WEB安全番外第一篇--其他所谓的“非主流”漏洞:URL跳转漏洞与参数污染

    一.URL跳转篇: 1.原理:先来看这段代码: <?php if(isset($_GET["url_redircetion_target"])){ $url_redirect ...

  6. Django < 2.0.8 任意URL跳转漏洞(CVE-2018-14574)

    影响版本 Django < 2.0.8 抓包 访问http://192.168.49.2:8000//www.example.com,即可返回是301跳转到//www.example.com

  7. URL重定向及跳转漏洞

    URL跳转漏洞 URL 跳转漏洞是指后台服务器在告知浏览器跳转时,未对客户端传入的重定向地址进行合法性校验,导致用户浏览器跳转到钓鱼页面的一种漏洞. 使用场景    现在 Web 登录很多都接入了QQ ...

  8. 安全测试4_客户端的安全漏洞(XSS、CSRF、点击劫持、URL跳转)

    那个fanh前面学习的都是基础,现在开始正式学习下安全的知识,这一章主要讲解客户端常见的安全漏洞. 看到这个不错,给大家记一下: 1.常见的安全事件: 2.XSS(跨站脚本),英文全称:Cross S ...

  9. [WEB安全]绕过URL跳转限制的思路

    0x00 简介 说起URL跳转漏洞,有些人可能会觉得,不就是单纯的跳转到某一个其他网页吗?有什么用??? 给大家一个链接,你们进去看一下就明白了: http://www.anquan.us/searc ...

随机推荐

  1. 序列化、time、random、hashlib、sys模块

    •很多常用和内置模块,我们只需要掌握他们的用法而暂时不用考虑内部是如何实现的,这些模块大大提升了开发效率 ! 1.json模块与pickle模块 •json 如果你有这样的困扰,当希望把一种数据存到硬 ...

  2. vim的学习

    vi和vim的关系: vim是vi发展而来的. 2.vim的三种模式: 1>.命令模式 -- 打开文件后,默认进入命令模式. 2>.编辑模式 -- 需要输入一些命令,切换到编辑模式. 3& ...

  3. 转:Excel—“撤销工作表保护密码”的破解并获取原始密码

    在日常工作中,您是否遇到过这样的情况:您用Excel编制的报表.表格.程序等,在单元格中设置了公式.函数等,为了防止其他人修改您的设置或者防止您自己无意中修改,您可能会使用Excel的工作表保护功能, ...

  4. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  5. http options 请求

  6. mycat 安装 分表 分库 读写分离

    简单的 理解 一下 mycat :如图 mycat 是一个 连接数据库的中介.一个独立安装的 工具,他连接着真实的数据库,并且 把自己伪装成一个数据库. 程序连接 mycat ,mycat 连接 到真 ...

  7. maven+eclipse+jboss+oracle 12c+memcached+AngularJS

    Maven 参考梁总的: Eclipse Java EE IDE for Web Developers集成的Maven 3 指向自己安装的 Maven Maven下载.安装和配置(二) 在本地配置ma ...

  8. 【转】搭建和配置Syncthing发现和中继服务器

    搭建和配置Syncthing发现和中继服务器     折腾借口 Syncthing好是挺好的,但就是同步不给力,公共网络服务其质量参差不齐,网络也说不清.最好的解决方案还是自己搭建发现服务器Synct ...

  9. 关于栈、队列、优先队列的应用——UVa11995

    这本来是上一篇博客里的内容,但不知道什么原因breakdown了……我就简单放上一道题好了 题意:这道题的题目是“猜猜数据结构”,题意就是给你一些输入输出数据,让你根据这些数据判断是什么数据结构.要猜 ...

  10. xxl-job源码分析

    1 调度中心API服务 1.任务结果回调服务: 2.执行器注册服务: 3.执行器注册摘除服务: 4.触发任务单次执行服务,支持任务根据业务事件触发: API暴露代码:com.xxl.job.admin ...