BlackHat 2019 Web小结
/0x00 前言
最近整理下BlackHat 2019 Web相关议题,做下学习笔记。
0x01 Make Redirection Evil Again - URL Parser Issues in OAuth
PDF:
https://i.blackhat.com/asia-19/Fri-March-29/bh-asia-Wang-Make-Redirection-Evil-Again.pdf
http://i.blackhat.com/asia-19/Fri-March-29/bh-asia-Wang-Make-Redirection-Evil-Again-wp.pdf
简介
本议题主要介绍利用URL解析问题来绕过限制进行各种任意URL跳转攻击。
作者先介绍了什么是OAuth 2.0。OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。
OAuth 2.0协议细节如图:
但是,如果OAuth 2.0登录时的重定向页面参数如上图的redirect_uri参数可被攻击者控制,那么将会造成任意URL跳转攻击:
针对这种攻击场景,开发者往往会采取一系列的校验措施,但是仅有校验完整的URL时才是无风险的,其他的校验方法会存在缺陷:
后面就看下几种绕过URL校验的技巧。
Evil Slash Trick(恶意反斜杠)
如图,攻击者在redirect_uri参数中注入https://evil.com\@good.com
,该URL在服务端校验时解析的Host识别的是good.com
并将该URL内容作为302重定向响应返回给浏览器,由于浏览器会将反斜杠转换为斜杠,因此在客户端实际访问的Host为evil.com
:
这是因为大多数浏览器都会将/
和\
视为路径分隔符,当用户在地址栏输入URL时,浏览器都是自动将\
替换成/
。
Server Decoding Error(服务端解码错误)
如图,攻击者在redirect_uri参数中注入https://evil.com%ff@good.com
,这里%ff
为超出ASCII范围的字符、并不是正常的URL编码内容,在服务端进行URL校验时由于解码错误导致识别的Host为good.com
,当响应给浏览器重定向时该不可打印的字符被统一转换为了?
,从而浏览器解析的时候被截断跳转到evil.com
:
Browser Decoding Error(浏览器解码错误)
同上类似,不同之处在于用到%bf
+:
来组合使得浏览器URL解码错误,然后统一将不可见字符转换为?
,从而绕过检测:
Domain Matching+Prefix Matching(域名和前缀匹配)
如图,服务端用startsWith()函数以及url.host来检测Host和前缀名;Host部分的绕过可以利用前面的反斜杠绕过;前缀部分的校验可以通过注册一个good.com.evil.com
即包括前缀弱校验白名单作为子域名:
Malformed Scheme(畸形的Scheme)
如图,可以利用浏览器自动补全Scheme的特性,攻击者在redirect_uri参数中注入evil.com://good.com
,服务端校验URL识别的是good.com
,返回浏览器后URL被补全为https://evil.com://good.com
从而成功绕过:
IPv6 Address Parsing Bug(IPv6地址解析Bug)
如图,某些URL解析器会将[]
内的任何字符串视为IPv6主机而没有任何校验:
0x02 Preloading Insecurity In Your Electron
PDF:
Electron历史漏洞:
https://www.freebuf.com/video/207509.html
Electron基本安全测试指南:
简介
Electron是Github开发的一个开源框架,它允许使用Node.js(作为后端)和Chromium(作为前端)完成桌面GUI应用程序的开发。Electron现已被多个开源Web应用程序用于前端和后端的开发,著名项目包括Github的Atom和微软的VSC。
本议题作者提出来一个新的漏洞类别,即:针对新版本的Electron应用,在没有Bypass nodeIntegration限制的情况下,可以通过BrowserWindow的Preload来扩展攻击面,实现绕过隔离来访问Node.js的原语,再次实现从XSS到RCE的攻击利用。
基本原理
Electron的nodeIntegration属性是用来开启Node API访问权限的,默认不开启,因此XSS无法访问底层OS。但是Electron创建浏览器窗口时传入属性preload,preload属性能够在WebView内所有脚本执行之前先执行指定的脚本,preload环境可以使用Node API。
简单地说,和PHP中利用LD_PRELOAD绕过disable_function是异曲同工之妙。
具体的怎么利用看官方文档即可。