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)、或者事后访问全局变量来获取这些敏感信息.利用这些敏感信息,
   194   195   196   197   198   199   200   201   202   203   204