UDN-企业互联网技术人气社区

板块导航

浏览  : 384
回复  : 3

[原生js] link标签href属性DOM XSS笔记

[复制链接]
白青青的头像 楼主
发表于 2017-1-3 15:37:43 | 显示全部楼层 |阅读模式
  场景:获取 url query string 中的参数 url 作为 <a> 标签 href 属性的值

  大致代码:
  1. // 获取参数
  2. s = urlQuery("url");
  3. // url decode 一次
  4. url = decodeURIComponent(s);
  5. // 字符串拼接
  6. back = '<a spm-auto="回退" href="' + escapeURL(url) + '">';
  7. e.html(back);
复制代码

  这里的 escapeURL 函数会对 &<>'" 符号进行html实体编码
  1. {&: "&", <: "<", >: ">", ": """, ': "'"}
复制代码

  所以无法闭合,但是可以通过 JavaScript: 伪协议来执行 js 代码
  1. JavaScript: alert(document.domain)
复制代码

  某开发想的 正则修复方案 ,大致代码如下:
  1. function check(e) {
  2.     var t = /(JavaScript|data)(:|:)/i;
  3.     return t.test(e) ? "" : e
  4. }
复制代码

  即忽略大小写匹配 JavaScript: 字符串

  但浏览器有一个特性,在解析时,会忽略换行,比如下列代码,仍会执行
  1. <a href="j
  2. avascript: alert(document.domain)">test</a>
复制代码

  所以 url 参数设置为 j%0d%0aavascript: alert(document.domain) , 解码后
  1. s = "j%0d%0aavascript: alert(document.domain)";
  2. url = decodeURIComponent(s);
  3. "j
  4. avascript: alert(document.domain)"
复制代码

  绕过了正则修复方案

  这里给出一种不需要其他依赖库的方案,代码如下
  1. // 检查 url 是否在白名单
  2. function check(url) {
  3.                 // 域名白名单
  4.       var n = ["baidu.com", "baidu.cn"]
  5.         , t = document.createElement("a");
  6.       t.href = url,
  7.       t.href = t.href;
  8.       var o = t.hostname.split(".")
  9.         , r = o.length;
  10.       return n.indexOf([o[r - 2], ".", o[r - 1]].join("")) > -1
  11. }
复制代码

  即使用 url 创建一个 <a> 标签,然后获取到 hostname 属性,截取一级域名,检查是否在白名单中

  当 url 参数不为真正的 url 时, t.hostname 属性会为空字符串,解决了 JavaScript: 伪协议执行 js 的问题

  另外,这里使用浏览器的 API 解析 url,解决了因 url 解析不正确导致白名单绕过的各种问题

相关帖子

发表于 2017-1-3 15:38:13 | 显示全部楼层
感觉JavaScript很有前途
使用道具 举报

回复

发表于 2017-1-3 15:38:14 来自手机 | 显示全部楼层
回帖支持下楼主,请眼熟我,我叫“吸血伯爵“
使用道具 举报

回复

发表于 2017-1-3 15:38:15 来自手机 | 显示全部楼层
我完全是被标题<<link标签href属性DOM XSS笔记>>吸引过来的
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部