URL跳转漏洞

本文阅读 4 分钟

一般分为两种,客户端跳转和服务端跳转,两种跳转对用户来说,都是指向或者跳转到另一个界面,页面发生了变化。

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">

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

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/sycamorelg/article/details/118108974
-- 展开阅读全文 --
Web安全—逻辑越权漏洞(BAC)
« 上一篇 03-13
Redis底层数据结构--简单动态字符串
下一篇 » 04-10

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复