Dom Xss挖掘思路


原文:
https://www.secpulse.com/archives/92286.html

常见场景

url带入页面

// url获得用户输入
var r = window.location.search.substr(1).match(reg);
// 将输入写入界面
document.getElementById('foo').innerHTML = getUrlParam('foo')

跳转类

location.href = urlparams.redirecturl;

这样的跳转通常会出现在登录页、退出页、中间页。

如果开发者让用户可以控制 redirecturl 参数,就可以使用 javascript:alert(1) 的形式进行XSS攻击。

最近几年的APP开发比较热门,通过web唤起APP的操作也是越来越多,跳转的协议也是多种多样,例如 webview:// , myappbridge:// 等等。 仅仅使用 http 和 https 来判断URL是否合法已经不适用了,于是由跳转所产生的DOM-XSS漏洞也逐渐增多。

缓存类

开发者在缓存前端数据的时候,通常会存在 sessionStorage , localStorage , cookie 中,因为 sessionStorage 在页面刷新时就失效的特性,利用方式相对简单的只有后面两种。
一旦我们发现在 http://example.com/setCookie.php?key=username&value=password 下可以设置Cookie,就可以结合一些读取Cookie的页面进行XSS攻击。

function getCookie(name) {   
    var arr = document.cookie.match(new RegExp("(^|; )" +name + "=([^;]*)(;|$)"));    
    if (arr != null) 
        return unescape(arr[2]);    
    return null; 
}

localStorage 的特性和Cookie类似,但它和Cookie不同的是,Cookie被设置过之后,具有有效期这个特性,而localStorage被设置过后,只要不手动清除或覆盖,这个值永远不会消失。 Cookie中通常会存放少量的缓存信息,像用户的头像URL,用户名等等,而localStorage中通常会存放一些大量,需要重复加载的数据,如搜索历史记录,缓存JS代码等等。

这些值被修改过以后,大部分开发者都不会去校验它的合法性,是否被修改过。

postMessage

postMessage 可以跨域使用,使用场景比较广泛,如支付成功的回调页面。

window.addEventListener("message", function (e) { eval(e.data); })

这段代码中,监听了message事件,取了 e.data 的值,也就是来自于其他页面上的message消息,但是没有检测来源。如果页面允许被嵌套,即可嵌套该页面,再使用 window[0].postMessage 即可向该窗口发送数据。

window.name

window.name 与其他 window 对象不同,它在窗口刷新后会保留。

<iframe src="example.com" name="Foo"></iframe>

当这个页面刷新跳转到其他网站时,如果这个网站没有对 window.name 进行设置,那么当前window.name的值仍然是Foo

Dom XSS优势

一、避开WAF

正如我们开头讲的第一种DOM-XSS,可以通过 location.hash 的方式,将参数写在 # 号后,既能让JS读取到该参数,又不让该参数传入到服务器,从而避免了WAF的检测。

我们可以使用 ja%0avasc%0aript:alert(1) , jx61vascript:alert(1) 的形式绕过

可以利用 postMessage,window.name,localStorage 等攻击点进行XSS攻击的,攻击代码不会经过WAF。

二、长度不限

当我们可以用当前页面的变量名作为参数时,可以使用 <iframe src="http://example.com/?poc=name">的方式进行攻击。

三、隐蔽性强

攻击代码可以具有隐蔽性,持久性。例如使用Cookie和localStorage作为攻击点的DOM-XSS,非常难以察觉,且持续的时间长。

防御手段

1.对于写标签类的DOM型XSS,输出到HTML中例如

document.getEelementById(“id”) = innerHTML = "<img src=x onerror=alert(1)>"只需要将<>实体化即可,将<>替换成<>

2.对于跳转类的XSS,例如

location.href = "javascript:alert(1)"有一个简单的方法,就是将这个url创建成一个a标签,检查它的host是否合法,是否以http或指定的协议开头,否则视为非法跳转。

3.对于eval(string)类的XSS

不建议使用这种写法,一个负责的开发不应该写这种代码出来。

如果实在要用,需要过滤非常多的字符,双引号,单引号,反引号,等于号,小括号,点,加减乘除,和一些特殊的字符,例如name,top,parent,opener等等(以上列出不完全)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值