欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

绕过WAF的XSS检测机制

来源:本站整理 作者:佚名 时间:2019-03-22 TAG: 我要投稿

本文提出了一种定义明确的方法来绕过跨站点脚本(XSS)安全机制,通过发送探针并编写payload用于检测恶意字符串的规则。拟议的方法包括三个阶段:确定payload结构,测试和混淆。
为给定上下文确定各种payload结构提供了最佳测试方法,下一阶段涉及针对目标安全机制测试各种字符串。分析目标响应情况以便做出假设。
最后,必要时可以将payload进行混淆或其他调整。
 
介绍
跨站点脚本(XSS)是最常见的Web应用程序漏洞之一。通过清理用户输入,基于上下文转义输出,正确使用文档对象模型(DOM)接收器和源,实施适当的跨域资源共享(CORS)策略和其他安全策略,可以完全阻止它。尽管这些防御技术是公共知识,但Web应用程序防火墙(WAF)或自定义过滤器被广泛用于添加另一层安全性,以保护Web应用程序免受人为错误或新攻击媒介引入的漏洞的利用。虽然WAF供应商仍在尝试机器学习,但正则表达式仍然是最常用的检测恶意字符串的方法。本文提出了一种构建XSS payload的方法,该payload与这种安全机制使用的正则表达式不匹配。
 
HTML CONTEXT
当用户输入被显示在网页的HTML代码中时,它被称为在HTML上下文中。 HTML上下文可以进一步根据显示位置划分为内标签和外标签。
内标签–
外标签–You entered $input
外标签
此上下文的负责启动HTML标签。根据HTML规范,标签名称必须以字母开头。利用此规范,可以使用以下探针来确定用于匹配标签名称的正则表达式:
 – 如果通过,则不进行任何标签检查
 – 如果失败,
x – 如果通过,^
 – 如果失败,
 – 如果失败,
 – 如果失败,
如果安全机制不允许这些探针,则不能绕过它。由于误报率高,这种严格的规则不被鼓励去使用。如果上述的任何一个探针未被禁止,则有许多编写payload的方案。
Payload方案#1
,//,Space,Tab,LF}
找到适当的{tag}值后,下一步是猜测用于匹配标签和事件处理程序之间填充符部分的正则表达式。此操作可以通过以下探针执行:
 – 如果失败,{space}
 – 如果失败,[s]
 -如果失败, s+
 – 如果失败,[s/]+
-如果失败, [sn]+
-如果失败, [snr+]+
 – 如果失败, .*+
事件处理程序是payload结构中最重要的部分之一。它通常与种类的一般正则表达式onw+或黑名单相匹配,例如on(load|click|error|show)。第一个正则表达式非常严格且不可能被绕过,然而有些不太知名的事件处理程序可能不在黑名单中,经常可以被绕过。因此可以通过两个简单的检查来识别所使用的类型。
 – 如果失败,onw+.
如果通过, on(load|click|error|show)
 – 如果通过,则没有事件处理程序检查正则表达式。
如果正则的结果是onw+,则不能绕过它,因为所有事件处理程序都以on开始。在这种情况下,应该继续下一个payload。如果正则表达式遵循黑名单方法,则需要查找未列入黑名单的事件处理程序。如果所有事件处理程序都列入黑名单,则应继续执行下一个payload。
根据我对WAF的经验,我发现一些事件处理程序没有在黑名单中:
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
下一个要执行的组件是JavaScript代码。它是payload的活动部分,但是匹配它不需要假设正则表达式,因为JavaScript代码是活动的,因此无法通过预定义模式进行匹配。
此时,payload的所有组件都放在一起,只需要关闭payload,通过以下方式完成:
应该注意的是,HTML规范允许这表明例如:是有效的HTML标签。因此,HTML标签的此属性使攻击者可以通过上述方式注入标签。
Payload方案#2
,//,Space,Tab,LF}
测试填充符(例如结束字符串)类似先前的payload方案。必须注意的是,?可以在URL的末尾使用(如果在URL之后没有使用填充符),而不是结束标记。每个经过?的字符都将被视为URL的一部分,直到遇到>。通过使用标记,很可能会被大多数安全规则检测到。
标签的payload可以用类似的payload方案编写:
,//,Space,Tab,LF}
Payload方案#3
这个payload方案有两种变体:plain和obfuscatable。
plain变体通常与诸如href[s]{0,}=[s]{0,}javascript:模式相匹配。其结构如下:
,//,Space,Tab,LF}
obfuscatable payload变体有如下结构:
,//,Space,Tab,LF}
这两个变体之间的显著差异是{special}组件和{quote}s。{special}指字符串javascript的混淆版本,这可以使用换行符和水平制表符来混淆,如下所示:
j%0aAv%0dasCr%09ipt:
J%0aa%0av%0aa%0as%0ac%0ar%0ai%0ap%0aT%0a:
J%0aa%0dv%09a%0as%0dc%09r%0ai%0dp%09T%0d%0a:
在某些情况下,数字字符编码也可用于绕过检测。可以使用十进制和十六进制。
Javascript:
javascript:
显然有必要时两种混淆技术可以一起使用。
Java%0a%0d%09script:
可执行和不可执行上下文
根据注入的payload是否可以在没有任何特殊帮助的情况下执行,外标签上下文可以进一步分为可执行和不可执行上下文。当用户输入显示在HTML注释中时,或者在以下标记之间,会发生不可执行的上下文:
style>
title>
noembed>
template>
noscript>
textarea>
为了执行payload,必须关闭这些标签。因此测试可执行和非可执行上下文之间的唯一区别是{closing tag}组件的测试,可以按如下方式进行:
一旦发现有效的结束标签方案,{closing tag}{any payload from executable payload section} 就可以用于成功注入。
内部标签

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载