Page 199 - 《软件学报》2021年第8期
P. 199
罗武 等:浏览器同源策略安全研究综述 2481
与 preAuth-CSRF 攻击不同,Auth-CSRF 攻击发生在用户曾经登录过受害者网站并使得浏览器保存了对应
cookie 的情况下.在 Auth-CSRF 攻击中,用户由于无意或者受到钓鱼攻击等访问了攻击者网站(attacker.com),攻
击者 frame 将自动向受害者网站(如 bank.com)的服务器发送一个转账请求.由于浏览器的 cookie 机制会自动为
网络请求携带上 cookie,而且用户事先登录过 bank.com 的 cookie 还未过期,bank.com 的服务器通过验证 cookie
将会认为转账请求来自于用户,从而在用户不知情情况下实现用户在 bank.com 上的转账.Sudhodanan 等人 [74]
对 Auth-CSRF 攻击方式进行了总结,并对 Alexa 中的 300 个网站进行了检测,在 133 个可实施其实验的网站中,90
个网站(68%)能够通过 Auth-CSRF 方式进行攻击.
XSSI 攻击来源于 Grossman 在 2006 年提出的 JSON 劫持攻击 [75] ,图 4 描述了该攻击的场景与利用过程.具
体来说,用户事先登录过受害者网站(email.com),使得用户浏览器保存了对应的 cookie.在 cookie 没有过期时,用
户被欺骗来访问攻击者网页(attacker.com).攻击者网页的目标是为了获取受害者网站的 JSON 文件(email.com/
contacts.json),该 JSON 文件中包含了用户在受害者网站上的联系人信息.由于浏览器的同源策略,攻击者网页直
接通过 JavaScript 的 API 来访问不同源 JSON 文件的行为会被拒绝.而在该 JSON 劫持攻击中,攻击者网页将利
用同源策略允许的跨源内嵌脚本规则来引入受害者网站的 JSON 文件.受害者网站服务器通过对 cookie 的认证
而返回用户的联系人信息.当浏览器接收到返回的 JSON 文件时,将其在攻击者网页中以脚本形式执行.由于
JSON 在 JavaScript 语言中被认为是定义一个数组,攻击者网页可以事先对数组(array)进行重载,使得在构造数
组时调用重载后的代码,该代码可以读取数组内容(即用户联系人),进而发送给攻击者服务器.最终,攻击者将能
够获取用户在跨源服务器上的联系人信息.Grossman 向 Google 报告了这个问题,Christoph Kern 此后将该攻击
命名为 XSSI 攻击,并在其 2007 年出版的书籍 [76] 中进行了详细描述.其他的一些变种 XSSI 攻击 [77,78] 也随之提出.
攻击者网页 目标网站
https://attacker.com/index.html
正常行为 email.com
// 同源策略拒绝JS访问不同源网络响应 □ 将根据cookie返回
xhr.open(‘GET’,“https://email.com/contact.json”,true) 对应用户的数据
攻击行为
// contact.json
// 1. Array函数重载声明,该函数将窃取数组内容 /*受害者用户登录后保留的
function Array() { /* steal data */ } 联系人信息 */
[
// 2. 引入目标JSON文件 ,从而触发重载的Array函 [”John”, “foo@xyz.com”],
1,2
数,造成JSON文件内容泄漏 [”Jane”, “bar@xyz.com”]
<script src=“https://email.com/contact.json” /> ]
1 JSON文件在JavaScript语言中执行时为定义一个数组
2 浏览器在发送网络请求时将自动携带对应cookie,以便服务器认证用户
Fig.4 One form of XSSI attack through including remote JSON file [75]
图 4 一种通过包含远程 JSON 文件的 XSSI 攻击 [75]
Lekies 等人 [12] 发现:XSSI 攻击可以直接使用受害者网站的 JavaScript 脚本,而非 JSON 文件,这使得发起
XSSI 攻击更加便利与通用.Lekies 等人认为:目前 Web 应用在服务器端不再单一地使用静态脚本,相反,服务器
会根据登录的用户往脚本中填入不同的信息(称之为动态脚本).通过对 150 个网站的实验分析,Lekies 等人发
现:49 个网站使用了动态脚本,其中携带的动态信息包含了用户的数据(如用户名与邮箱地址)以及网页与 Web
应用通信的安全令牌等.与 JSON 劫持攻击类似,为获取这些信息,攻击者可以利用 HTML 的 script 标签将受害
者网站的动态脚本引入到自身的 frame 中(图 4 中攻击行为的步骤 2).该动态脚本将在攻击者 frame 中执行.根
据用户敏感信息在动态脚本中的不同定义方式(如全局变量、数组等),攻击者 frame 可以通过事先重载相应的
JavaScript 函数(图 4 中攻击行为的步骤 1)、或者事后访问全局变量来获取这些敏感信息.利用这些敏感信息,