url跳转漏洞
URL跳转漏洞的本质是利用web应用中带有重定向功能的业务,将用户从一个网站重定向到另一个网站。其最简单的利用方式为诱导用户访问http://www.aaa.com?returnUrl=http://www.evil.com,借助www.aaa.com让用户访问www.evil.com。
当黑客构造www.evil.com 是钓鱼页面时,用户就会毫不犹豫的点击进去,中了陷阱。跳转链接再配合一些诱惑文字,就可以使用户轻松上当。
漏洞出现点
以下5个地方
- 用户登录、统一身份认证处,认证完后会跳转
- 用户分享、收藏内容过后,会跳转
- 跨站点认证、授权后,会跳转
- 站内点击其它网址链接时,会跳转
寻找url跳转漏洞,要思考哪些功能需要跳转。
登录功能一直是url跳转漏洞的突破口,用户访问网站某个业务,当涉及到账号角色权限的时候一定要跳转到登录界面,为了确保用户体验认证结束之后需要自动返回用户之前浏览的页面,这一去一回之间就产生了url跳转漏洞的危害
例子
比如用户正在访问http://www.aaa.com/shop?sku=123456,认证成功之后浏览器继续返回商品详情页面方便用户进行购买操作。若login.aaa.com对returnUrl参数检查不严格甚至未检查。通过该链接可跳转至任意网站。
比如上图Url后面就跟着是跳转链接 返回包响应的是302跳转,就可以成功跳转到百度首页
此处returnUrl未进行任何检查,可任意跳转到第三方页面。与登录功能同理,网站的退出功能同样存在URL跳转漏洞的风险。其他类似的跳转功能还有短信验证码认证之后跳转、分享或者收藏之后跳转、给第三方授权之后跳转,他们的共同特点都是从一个页面为了某种操作进入另一个页面,操作之后返回原页面继续浏览。有的多步操作业务中,点击下一步按钮时会传递fromUrl参数,该参数会成为返回上一步的超链接
一般的java代码实现重定向功能
是在代码中判断是否为目标域名,通常是用字符串包含来判断
String url = request.getParameter(“returnUrl”);if(url.indexOf(“www.aaa.com”) !=1){response.sendRedirect(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)
Bypass方法
像这种直接判断是否为目标域名的检测是比较好绕过的
http://www.aaa.com?returnUrl=http://www.aaa.com.evil.com
http://www.aaa.com?returnUrl=http://www.evil.com/www.aaa.com
http://www.aaa.com?returnUrl=http://www.xxxaaa.com
最常用的一条
@绕过
http://127.0.0.1/url.php?username=1&redict=http://www.xiaozhupeiqi.com@www.baidu.com
?绕过
http://127.0.0.1/url.php?username=1&redict=http://www.baidu.com?www.xiaozhupeiqi.com
缺失协议:
http://www.aaa.com?returnUrl=/www.evil.com
http://www.aaa.com?returnUrl=//www.evil.com
多次跳转,即aaa公司信任ccc公司,ccc公司同样存在漏洞或者提供跳转服务:
http://www.aaa.com?returnUrl=http://www.ccc.com?jumpto=http://www.evil.com
实际挖掘过程中还可以将上述方法混合使用,甚至使用URL编码、ip地址替代域名等手段。上述介绍的挖掘姿势以GET请求为例,但其在POST请求中也同样适用。
当白名单匹配绕过
比如匹配规则是必须跳转,xiaozhupeiqi.com 域名下,?#等都不行的时候,如果匹配规则为xiaozhupeiqi.com,可以尝试百度inurl:xiaozhupeiqi.com的域名,比如
aaaxiaozhupeiqi.com,这样同样可以绕过。接下来实战中会用到
xip.io绕过
http://127.0.0.1/url.php?username=1&password=1&password=1&redict=http://www.xiaozhupeiqi.com.220.181.57.217.xip.io
.白名单网站可信
如果url跳转点信任百度url,google url或者其他,则可以多次跳转达到自己的恶意界面。
理想化方法
如果有机会在自己的页面设置url跳转,比如目标网站的bbs论坛自己的资料页面设置url跳转,既然是服务器的网站,那么url是不会限制的,可以用一个漏洞去构造另一个漏洞。
漏洞案例 分享
漏洞url :
https://xx.xxx.com/User/Login?redirect=http://xxx.com/
为登陆页面,如果登陆成功那么跳转http://xxx.com/,但是所有方式都无法绕过,但是发现可以跳转aaxxx.com,也就是匹配规则为必须为xxx.com的网址,但是aaxxx.com同样也可以。
2.@绕过
@是最常见的一种绕过。
漏洞url
https://xx.xxx.com/user/goToLogin?toUrl=https://xx.xxx.com@www.baidu.com
这种跳转在chrome浏览器可以直接跳转,但是在火狐会弹框询问,但是并不影响它的危害。
火狐下@的跳转。
还有一些是跳转目录的,
如:
https://xx.xxx.com.cn/?redirect=/user/info.php
修改为
https://xx.xxx.com.cn/?redirect=@www.baidu.com
.漏洞构造漏洞
一次渗透测试中碰到一个任意文件上传漏洞,但是不幸的是没办法解析任何后端语言,没办法进一步利用,只能前端造成一点危害,但是存放文件的服务器一般比较偏远,此时可以利用我们任意文件上传的html,然后来进一步利用,绕过本来无法绕过的url跳转漏洞。因为存放文件的域名肯定是符合网站跳转范围。
参考:https://xz.aliyun.com/t/5189
https://www.secpulse.com/archives/102918.html