来自 wooyun'drops --->呆子不开口

0x00 背景


随着水瓶月的到来,在祖国繁荣昌盛的今天,web系统的浏览器端也越来越重,很多的功能逻辑都放在了js中,前端的漏洞也越来越多。 我今天就说说location.href跳转的一些问题。

前端跳转常见的代码形式是:

#!javascript
location.href = "http://www.baidu.com";

在前端js中有可能是这样:

#!javascript
var hash = location.hash;
if(hash)
{
var url = hash.substring(1);
location.href = url;
}

0x01 常见的跳转漏洞


什么是跳转漏洞?突破了系统预期的跳转,就是跳转漏洞。大多数系统的预期是跳转到当前域url的http访问。

以上面的代码为例,hash值为攻击者可控,常见的漏洞形式可以为:

http://yigezangpao.com/test.html#http://jiajiba.taobao.com

这个地址会利用信任关系跳转到钓鱼网站

http://yigezangpao.com/test.html#javascript:alert(document.cookie)

这个会跳转到浏览器端的javascript协议而执行js,成了一个反射的xss,而且浏览器端的xssfilter对它无效

0x02 跳转漏洞的危害


可能的危害场景如下:

受害用户被骗点击进入了钓鱼站,可导致家破人亡妻离子散被网友拉黑……

在一些sns网站中,点击第三方网站时,可能会有安全提示,恶意网址则可利用信任域的身份,绕过了检查。

很多app带有二维码扫描功能,对本域或白名单域会不做提示,直接跳转访问。

当你扫描一个二维码的时候,你可能已经点击了一个恶意或含有某种攻击代码的网页javascript为协议的反射型xss。

一般的社区发表链接时,不会自动识别浏览器的伪协议,不会形成可点击的链接,但是利用跳转漏洞,则可以欺骗目标用户打开某个浏览器伪协议……

0x03 目前的防护的一些问题


我见到的常见的有防护有:

给变量前加"/"或者只有"/"开头的才跳转
替换变量中的":"
替换"http://"
匹配域名白名单
……

这几类或多或少有些问题,如下:

对于在变量前加/的,或者/开头才跳转的,他们预期的是控制在本域下。但当

#!javascript
location.href = "//diaoyuwangzhan.com"

时,浏览器会把后面的识别成一个标准的url来跳转,而不是一个绝对路径。

对于允许第三方跳转的,匹配域名白名单的,一定要写好正则的逻辑严格匹配url的标准格式,否则可能会被

http://yigezangpao.com.jiajiba.taobao.com
http://yigezangpao.com@jiajiba.taobao.com
http://jiajiba.taobao.com/yigezangpao.com

等绕过

对于替换”:“的防护:

twitter曾经犯过这样的错,twitter的程序员是这样改的:

#!javascript
var c = location.href.split("#!")[1];
 if (c) {
 window.location = c.replace(":", "");
 } else {
 return true;
 }

结果又被如下链接干:

http://twitter.com/#!javascript::alert(document.domain);

比第一次多了个:

因为replace()函数的第一个参数,按照规范中的方式,是要用正则写的。如果第一个参数是一个字符串,javascript默认只会替换掉他找到的第一个字符

0x04 比杨幂还神奇


对于上面的替换":"的方案,如果完全替换,是不是就没有问题了呢?

如果你曾觉得你的女友不可理喻,那么当我告诉你有一个东西的不可理喻程度已经达到你女友的50%时,你一定会惊呼,”天呐,竟然还有这么变态的东西!!!“ 不错,你猜的非常对,这个不可理喻的东西就是ie浏览器

如前文的例子,如果对方已经完全替换":",你试试在ie中访问如下链接

http://yigezangpao.com/test.html#javascript:alert(1)

也就是

#!javascript
location.href = "javascript:alert(1)"

你会惊奇的发现弹了,":"是":"的html编码,至于为什么会这样我不知道,我的是ie11,其他版本没测

0x05 解决方案


对于不允许跳转到第三方的,可以使用location.pathname来跳转,用这个跳转绝对靠谱。

有句成语”path就不是g产党员“就是修饰这个属性的,既然不是g党员,说明path是靠谱的。

对于允许跳转到第三方的,做好白名单的检查规则。

 

(转)调皮的location.href的更多相关文章

  1. 解决安卓微信浏览器中location.reload 或者 location.href失效的问题

    在移动wap中,经常会使用window.location.href去跳转页面,这个方法在绝大多数浏览器中都不会 存在问题,但早上测试的同学会提出了一个bug:在安卓手机的微信自带浏览器中,这个是失效的 ...

  2. window.top.location.href 和 window.location.href 的区别

    "window.location.href"."location.href"是本页面跳转. "parent.location.href" 是 ...

  3. 关于js中window.location.href,location.href,parent.location.href,top.location.href的用法

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  4. window.location.href 中文乱码问题。。。。

    window.location.href 中文乱码问题.... 要解决此问题需要两次解码, 第一次解码: 是在页面中的js脚本中解码:window.location.href = "save ...

  5. javascript 中的location.href 并不是立即执行的,是在所在function 执行完之后执行的。

    javascript 中的location.href 并不是立即执行的,是在所在function 执行完之后执行的. 1 function getUrl(tp) { if (tp == 'd') { ...

  6. window.open和window.location.href的几种用法

    windows.open("URL","窗口名称","窗口外观设定"); <A href="javascript:windo ...

  7. 模板列onclick事件中绑定跳转页参数(onclick location.href Eval)

    <asp:GridView runat="server" ID="gvCheckList" AutoGenerateColumns="false ...

  8. 基于H5的移动端开发,window.location.href在IOS系统无法触发问题

    最近负责公司的微信公众号开发项目,基于H5进行开发,某些页面window.location.href在Android机上能正常运行而IOS系统上无法运行,导致无法重定向到指定页面,查了好久终于找到方法 ...

  9. 安卓微信浏览器中location.href失效的问题

    在移动web中,经常会使用window.location.href去跳转页面,这个方法在绝大多数浏览器中都不会存在问题,但是在安卓手机的微信自带浏览器中,会出现一个奇怪的bug. window.loc ...

随机推荐

  1. linux 在启动时获得专用的缓冲

    如果你真的需要一个大的物理上连续的缓冲, 最好的方法是在启动时请求内存来分配它. 在启动时分配是获得连续内存页而避开 get_free_pages 施加的对缓冲大小限制的唯一 方法, 不但最大允许大小 ...

  2. dotnet 手动解决 json 解析中不合法字符串

    如果使用 Newtonsoft Json 解析字符串,字符串里面有不清真的格式,那么默认的解析将会炸掉.如果想要自己解决字符串中的不清真格式,可以使用传入 JsonSerializerSettings ...

  3. P4556 [Vani有约会]雨天的尾巴 (线段树合并)

    P4556 [Vani有约会]雨天的尾巴 题意: 首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋 ...

  4. Channel 9视频整理【2】

    JadeChang https://channel9.msdn.com/Niners/JadeChang 繁体中文视频 2016 Nano Server / Docker / Containers 打 ...

  5. 使用windows api函数捕获SAP session的左下角消息句柄

    背景:SAP session的左下角消息非常有用,我们在做SAP的自动化脚本时可以设法读到这个消息的内容,作为程序后续动作的判断条件.如下图:        比如小爬之前给财务的同事制作了一个批量导出 ...

  6. 004 ceph存储池

    介绍:前面已经使用deploy和ansble部署了ceph集群,现在对集群的池进行简单介绍和简单操作 一.部分概念 池是ceph存储集群的逻辑分区,用于存储对象 对象存储到池中时,使用CRUSH规则将 ...

  7. C# 初识接口 Interface

    什么是接口? 接口(interface)用来定义一种程序的协定.实现接口的类或者结构要与接口的定义严格一致.有了这个协定,就可以抛开编程语言的限制(理论上).C#接口可以从多个基接口继承,而类或结构可 ...

  8. 修改kubelet启动参数

    我是用kubeadm安装的k8s,现在通过Aqua扫描出相关配置问题,需要修改kubelet的启动参数: 默认配置文件名为:10-kubeadm.conf #vim /usr/lib/systemd/ ...

  9. [工具] Git版本管理(二)(分支)

    一.分支 1.git中如何保存版本 在我们以往使用文件来进行版本控制的时候,都是将上一个版本复制一份,然后在其基础上进行修改. 但在git中,git只保存当前版本和上一个版本之间的差异,这样可以节省存 ...

  10. 【题解】AcWing 110. 防晒(普及题)

    [题解]AcWing 110. 防晒(普及题) AcWing 110. 防晒 你没有用过的全新OJ 嘿嘿水水题. 题目就是一维坐标轴上给定多个线段,给定多个点,点在线段上造成贡献,点可以重复,问最大贡 ...