一、URL跳转
一般分为两种,客户端跳转和服务端跳转,两种跳转对用户来说,都是指向或者跳转到另一个界面,页面发生了变化。
1、客户端跳转
response.sendRedirect()
属于重定向,用户浏览器的地址栏URL会发生明显变化,比如,当前页面为http://www.xxx.com/news.php
,当点击登录按钮后,变成了http://www.xxx.com/login.php
,且页面发生了变化,这就是客户端跳转。相当于客户端向服务端发送请求之后,服务器返回一个响应,客户端接收到响应之后又向服务端发送一次请求,一共是2次请求,前后页不共用一个request,不能读取转向前通过request.setAttribute()设置的属性值。
可以重定向到本web页面之外的页面和网站。
2、服务端跳转
request.getRequestDispatcher().forward(request,response)
属于转发,也可以称为内部重定向,相当于方法的调用,服务端跳转时,用户浏览器的地址栏的URl是不会变化的。比如,当前页面URL为http://www.xxx.com/new.php
,当点击登录按钮后,浏览器地址栏URL不会发生改变,但是页面会发生变化。在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,前后页共用一个request,可以通过此来传递一些数据或者session信息,request.setAttribute()和request.getAttribute()
。
这个请求不能转向到本web应用之外的页面和网站。
3、其他
直接向服务器发送请求
例如:
<a href ="http://www.xxx.com/news.jsp">新闻列表</a>
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
二、URL跳转漏洞
1、原理
URL跳转漏洞也叫做开放重定向,是指服务端未对传入的跳转url进行过滤和控制,导致用户跳转到恶意网站,由于是从可信的站点跳转出去的,用户会比较信任。
例如:
https://example.com/login.php?link=https://test.com/
后端代码形如:
response.sendRedirect(request.getParameter("url"))。
2、常见的URL跳转代码:
Java:response.sendRedirect(request.getParameter("url"));
Flask:redirect_url = request.form['url']redirect(redirect_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)
Rails:redirect_to params[:url]
3、挖掘技巧:
1、在抓包历史中搜索返回状态码为302的请求包;
2、功能处:登录、注册、注销、改密,第三方应用交互,页面切换,业务完成跳转、返回上级、账号切换、保存设置、下载文件等;
3、常见的参数值有return、redirect、url、jump、goto、target、link、callback等;
4、输入任意URL地址看是否可以任意跳转,若后台进行过滤,探测过滤规则,绕过过滤;
三、绕过方法
源地址:www.xxx.com 跳转地址:www.hack.com
1. 单斜线"/"绕过
http://www.xxx.com/login.php?url=/www.hack.com
2. 缺少协议绕过
http://www.xxx.com/login.php?url=//www.hack.com
3. 多斜线"/"前缀绕过
http://www.xxx.com/login.php?url=///www.hack.com
http://www.xxx.com/login.php?url=www.hack.com
4. 利用"@"符号绕过
http://www.xxx.com/login.php?url=http://www.xxx.com?@www.hack.com
5. 利用"\"绕过
http://www.xxx.com/login.php?url=http://www.hack.com\www.xxx.com
6. 利用"#"符号绕过
http://www.xxx.com/login.php?url=http://www.hack.com#www.xxx.com
7. 利用"?"号绕过
http://www.xxx.com/login.php?url=http://www.hack.com?www.xxx.com
8. 利用"."绕过
http://www.xxx.com/login.php?url=.hack (可能会跳转到www.xxx.com.hack域名)
http://www.xxx.com/login.php?url=.hack.com (可能会跳转到hack.com域名)
9.重复特殊字符绕过
http://www.xxx.com/login.php?url=///www.hack.com//..
http://www.xxx.com/login.php?url=www.hack.com//..
10.编码;利用IP地址;对IP地址进行8进制、10进制、16进制编码;IPV6地址;更换协议(ftp://、gopher)等等。
四、防御
1、对输入进行验证,严格控制要跳转的域名,不让用户对跳转地址进行任意输入;
2、严格限制子域名,跳转地址采用白名单;
2、从体系架构和涉及规范上进行防范。
参考:
http://cwe.mitre.org/data/definitions/601.html
https://landgrey.me/static/upload/2019-09-15/mofwvdcx.pdf