10 May 2016 - fridayy
[+] Author: fridayy [+] Team: n0tr00t security team [+] From: http://www.n0tr00t.com [+] Create: 2016-05-10
文章翻译自 Anastasios Stasinopoulos 在 2014 年发表的 《Bypassing XSS Auditor: Taking Advantage of Badly Written PHP Code》,由于是学术 Paper ,所以翻译多处有删改,更侧重于攻击与利用。
XSS过滤器的目的是发现如下两种XSS攻击:
<img>
, <script>
等) XSS过滤器,在WebKit浏览器引擎中被称为XSS Auditor,存在于Chrome、Safari等浏览器;从IE8到最新版本的IE浏览器,也提供了一个XSS过滤器;Mozilla Firefox不会预安装XSS过滤器,但有一个免费的插件叫做NoScript。以上每一个XSS过滤器都采用不同的技术检测XSS攻击。更具体地说:
XSS Auditor置于HTML解析器(渲染引擎负责解析HTML到DOM树中)和JavaScript解释器(解释执行JavaScript代码的虚拟机)之间,如图1所示。
XSS Auditor的一个重要特性是它仅检查GET/POST的HTTP响应。如果同一个可执行的JavaScript在HTTP请求和响应中均被检测到,则XSS Auditor会提出警示,防止注入的脚本被执行。更具体地说,过滤过程包括三部分:
onerror
, onclick
, onload
等),或者包含一个JavaScript的URL。因此,如果一个HTML事件属性被找到,XSS Auditor检查相应的HTTP请求的返回值,如果找到匹配值,过滤器认为事件属性是恶意的,并且删除属性值。 <script>, <object>, <param>, <embed>, <applet>, <iframe>, <meta>, <base>, <form>, <input> 和 <button>
等。 <script></script>
标签内的内容,如果对应内容同样存在于在HTTP请求包中,则认定为内联脚本注入,并且会用空字符串替换对应内容。 任何在 <script>
和 </script>
之间的字符串,如果由单引号或双引号包围,都被视为注释。
// chrome console > console.log(23333);"]=" 23333 < "]="
有意思的是,以上Payload允许把;”换成与下图中的任何元素。
JavaScript这种特性可以用于一些特定场合,如过滤了 #
、 //
时的代码闭合。而在本文后续Bypassing XSS Auditor的过程中,也有很重要的作用。
错误编写的PHP代码实例如下,我们的目标是执行 <script>alert(1)</script>
。
<?php $get = print_r($_GET['x']); // var_export() echo htmlspecialchars($get, ENT_QUOTES, 'utf-8');
首先进行最简单的尝试:
x[<script>alert(1);</script>] = Value x[key] = <script>alert(1);</script> x=<script>alert(1);</script>
毫无意外的,全都被XSS Auditor拦截。根据 <a href="http://blog.securitee.org/?p=37">Bypassing Chrome’s Anti-XSS filter</a>
,我们发现XSS Auditor不能检测分散的多个参数类型的注入。因此我们尝试把攻击向量 <script>alert(1);</script>
为两个或多个部分,然后让JavaScript引擎忽视 "] ="
。起初,我们认为这可以通过使用JavaScript的多行注释符 /* */
来实现,因为任何文本之间的 /*
和 *
将被JavaScript忽略。因此,我们试图执行payload:
x[<script>alert(1);/*]=*/<script>
然而,再次失败。在对XSS Auditor源代码进行一次广泛的搜索后,我们发现XSS Auditor阻止每一个包含HTML和JavaScript的注释部分的尝试,如 <!--
、 //
、 /*
。如果网址或HTTP请求包中包含注释字符,则该过滤器被激活,并且该尝试被阻塞。根据上个章节提到的引用劫持,我们构造出了新的payload:
x[<script>alert(1);"]="</script>
为了测试攻击的可用性,我们审计了各种PHP应用程序的源代码。我们发现许多开源CMS是含有PHP类数组注入攻击。我们已确定文件和图像管理插件“Ajax File Manager v1.0”含有此类漏洞。这个插件在TinyMCE和FCKeditor编辑器中被广泛使用。同时还在如“XOOPS,OSclass 3.4.3,zenphoto 1.4.1.4,phpmyfaq <= 2.7.0,等等应用中广泛使用。在新版本中,这些应用程序的易受攻击的插件已经得到纠正。