hrefjs改变link_link标签href属性DOMXSS笔记场景:获取 url query string 中的参数 url 作为 标签 href 属性的值
⼤致代码:
// 获取参数
s = urlQuery("url");
// url decode ⼀次
url = decodeURIComponent(s);
// 字符串拼接
back = '
e.html(back);
这⾥的 escapeURL 函数会对 &<>'" 符号进⾏html实体编码
{&: "&", <:>: ">", ": """, ': "'"}
所以⽆法闭合,但是可以通过 javascript: 伪协议来执⾏ js 代码
html href属性javascript: alert(document.domain)
某开发想的 正则修复⽅案 ,⼤致代码如下:
function check(e) {
var t = /(javascript|data)(:|:)/i;
st(e) ? "" : e
}
即忽略⼤⼩写匹配 javascript: 字符串
但浏览器有⼀个特性,在解析时,会忽略换⾏,⽐如下列代码,仍会执⾏
所以 url 参数设置为 j%0d%0aavascript: alert(document.domain) , 解码后
s = "j%0d%0aavascript: alert(document.domain)";
url = decodeURIComponent(s);
"j
avascript: alert(document.domain)"
绕过了正则修复⽅案
这⾥给出⼀种不需要其他依赖库的⽅案,代码如下
// 检查 url 是否在⽩名单
function check(url) {
// 域名⽩名单
var n = ["baidu", "baidu"]
, t = ateElement("a");
t.href = url,
t.href = t.href;
var o = t.hostname.split(".")
, r = o.length;
return n.indexOf([o[r - 2], ".", o[r - 1]].join("")) > -1
}
即使⽤ url 创建⼀个 标签,然后获取到 hostname 属性,截取⼀级域名,检查是否在⽩名单中
当 url 参数不为真正的 url 时, t.hostname 属性会为空字符串,解决了 javascript: 伪协议执⾏ js 的问题另外,这⾥使⽤浏览器的 API 解析 url,解决了因 url 解析不正确导致⽩名单绕过的各种问题
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论