但凡对网络有一些了解,很容易理解一个URL地址。我们理解的结构是:
protocol://domain/path?parameters
URL,"统一资源定位符"是URI(统一资源标识符)的子集
我们通常的认为:它只是一个字符串,每个人都能理解它的定义,我们都应该能够区分钓鱼网站和真实网址,我们理算当然的认为它就应该是这样。
但事实并非如此,我们发现了许多问题?
下边来研究一个公开的漏洞:CVE-2018-6128
- 漏洞描述:在67.0.3396.62之前的iOS上的谷歌浏览器中,WebKit中的URL解析不正确允许远程攻击者通过精心设计的HTML页面执行域欺骗。
- 参考资源:https://bugs.chromium.org/p/chromium/issues/detail?id=841105
引用自Tomasz Bojarski的一篇报告,该问题的标题是"IOS上Chrome中的uXSS(通用XSS)"。
什么是uXSS?
通常在我们基本的认知中,XSS就是一个网站可以以某种方式注入自己的恶意Javascript代码。然后,javascript基本上可以冒充用户做一些事情。
现在假设我们想要从mail.163.com中窃取某些电子邮件。javascript只能访问当前运行的域上的内容,因此,必须找到mail.163.com网站中XSS漏洞,我们不能在自己的网站上写javascript来访问其它人的电子邮件。可以使用控制台进行模拟测试.
尝试在CSDN上边访问 mail.163.com,在控制台执行javascript的payload从mail.163.com获取数据,不出意外的我们得到一个报错:跨源请求被阻止,我们无法加载https://mail.163.com,这就必须要有一个mail.163.com域上的XSS漏洞。
然而,universal XSS通常会滥用浏览器中的错误并以某种方式绕过来源检查。正常情况下浏览器会阻止从CSDN站点到mail.163.com域的访问。这时,我们以某种方式欺骗浏览器允许我们执行该请求并加载响应内容,这就是一个通用XSS。这样,我们就可以在任何地方放置javascript来访问任何其它的网站上的数据。如果Chrome中有uXSS,那么Chrome无法正确检查域名并阻止跨域访问的发生,所有的恶意站点都可以从任意的站点窃取数据,这是非常糟糕的事情。
Tomasz在IOS上的Chrome中发现了一个uXSS错误: - 通用XSS的使用 “…;@ within the url ”
- 举例:运行javascript代码"history.replaceState(",",’…;@mail.163.com:%3443/’) "网站地址将修改
- HTML5引入了history.pushState()和history.replaceState()方法,它允许我们添加和修改历史记录条目。replaceState()修改当前历史记录条目,而不是创建新条目。当我们想要更新状态或URL时,响应某些用户操作,此时replaceState()特别有用。上边代码的执行后,网址将被替换为https://mail.163.com.但实际还是由我们控制。因此,我们能运行不受限制的XHR请求.浏览器在内部看到的URL看起来像是
web-safety.net/..;@mail.163.com
,不知何故,这让浏览器误以为目前的网站是mail.163.com,这就意味着javascript具有访问该网页的权限,就像在mail.163.com上运行一样 - 这个bug似乎是URL解析中的一个错误。在webkit中,“https://web-safety.net/…;…;@mobile.twitter.com/robots.txt”被正确解析为以下部分:
-主机:“web-safety…net”
-路径:“/…;…;@mobile.twitter.com/robots.txt”
-用户:“”
-密码:“”
但是,当此URL发送到网络层时,返回的数据来自https://mobile.twitter.com/robots.txt。因此,我怀疑当在webkit->networkprocess ipc中序列化该URL时会发生错误,并且在重新解析时,它的解释会有所不同。
在处理替换状态URL时,WebKit可能应该转义“;”和“@”。这似乎就是当“https://web safety.net…;…;@mobile.twitter.com/robots.txt”直接输入iOS Safari中的地址栏时发生的情况。
同样类型的错误也出现在SSRF中,
一个快速有趣的例子:考虑使用一个典型的python库来解析一个URL:
http://1.1.1.1 &@2.2.2.2# @3.3.3.3/
python将访问哪个地址?
不同的python库以不同的方式使用相同的URL。
在RFC 3986中有对URI的定义,参考链接:https://tools.ietf.org/html/rfc3986