keac's Bolg.

Xss bypass waf 并且构造函数 使危害更大

字数统计: 1.3k阅读时长: 4 min
2020/05/31 Share

前言

Xss bypass waf 并且构造函数 使危害更大,一般我们找到一个在js里面的可控点往往不能使危害更大,比如打开页面就执行

正文

正在干活,同事法来一条消息

xss-waf

XSS?搞起

随手试了下,发现网站存在WAF

xss-waf

XSS利用第一步,寻找可控点

根据提供的链接,找到了两个可控点

xss-waf

xss-waf

首先来看下第一个可控点,是一个input,来看看又没过滤 "

" 没有被过滤和转义,好家伙走起

xss-waf

构造一波,在Chrome高亮显示帮助我们看清楚,我们已经把前面的 " 给截断了

xss-waf

oncange 没被识别为攻击拦截,但是onclick 被拦截了,应该是对组合关键词进行了识别

xss-waf

这里给两个参考资料,一个是我自己整理的绕过XSS bypass方法,另一个是 owasp 的

https://www.loongten.com/2019/12/29/pentest-learn-xss-bypass/

https://owasp.org/www-community/xss-filter-evasion-cheatsheet

发现这个函数没被waf拦截

xss-waf

Nice 走起 输入payload " onInput=prompt(83936)

xss-waf

但是在页面上面好像看不到,仔细观察下发现type是hidden,被隐藏了,我们把他给改了

" onInput=prompt(83936) type="input

看到页面上面可以显示出来了我们刚刚构造的框

xss-waf

出来了,很棒,尝试输入几个字看看

xss-waf

拼接函数

但是这样子只能让人去输入东西的时候才会触发,这种危害很明显不怎么打,本来就是反射型XSS再加上还要手动触发,这样不行。

我们刚刚还看到有一个可控点,我们来看看

xss-waf

可以看到这边也是没过滤的情况,而且%0D%0成功截断了前面的注释,但是这个东西在一个方法里面才能被调用,还是得手动才能触发,鸡肋,这个看起来是翻页的时候可以触发。

我们来分析下这个函数

xss-waf

我们可以看到,这个可控点被 1、2 这两个地方的方法限制在了里面。

这时候我们就可以尝试下截断上面的方法,绕出来,让他能直接执行。

截断方法

首先我们得截断掉离可控点最近的一个,就是 1 的标记 使用 }

xss-waf

显示400,并不是被WAF拦截,看来是程序内部识别的时候是json形式的,我们url转义下

xss-waf

没有报错,我们再来看看代码

xss-waf

成功绕过了第一个

xss-waf

再加个 ; 让他一行可以执行多条语句

此时payload 为 %0D%0A%7D;prompt(83936)//

再接下来绕过第二个 加上 %7D%7D) 就是 }})

可以看到前面的方法已经给我们闭合了

xss-waf

Console里面也产生了报错,提示没结尾

构造结尾方法

这个时候我们的代码是这样子的

xss-waf

可以看到后面有 } }) 需要闭合掉,还有后面一大串字符得想办法让他不生效,达到不报错的时候就能执行我们的语句了

首先我们加个 function 来构造方法试试

xss-waf

很好,waf拦截了。。

{} 闭合还有一种方式就是把他给构造进json里面去,变成json变量的一部分

var a={

我们来构造下 }});prompt(83936);var a={ url编码后 %0D%0A%7D%7D);prompt(83936);var a=%7B

然后我们再来看看

xss-waf

可以看到一个 { 已经和下面的 } 形成闭合

这时候直接把剩下的 }) 给闭合了

xss-waf

可以看到已经闭合了后面两个,但是存在报错

xss-waf

再进行url输解决报错就太麻烦了,我们直接放到console里面

xss-waf

我们先来检查下,每个符号是不是对应上了,这里chrome提供了提示,很方便

xss-waf

检查下来没有问题,尝试删除中间的一段东西看看

xss-waf

xss-waf

发现问题是我复制多东西了。。。

删掉最后多复制的东西,在看看

xss-waf

还是在报错,我们继续做减法

xss-waf

xss-waf

Nice 看来是
{"+"&search_channel="+"&area="+"&page="+curPage+"&pageSize="+pageSize; }
的问题

在json里面的格式是有key和value 那么得构造

1
2
3
{
Abc:{}
}

xss-waf

可以看到报错换了一个,这个应该是我多加的一个 " 的问题,去掉他

xss-waf

又换了个报错,还是刚刚那个问题,json字符串没对上,我们改改

xss-waf

有点烦,我们看看能不能直接干掉最后一个 ;

xss-waf

构造一个字符串,然后把后面的一串直接注释掉

最后Payload 为

}});prompt(83936);var a=({a:{a:""//

xss-waf

xss-waf

最后编码下,成功触发

xss-waf

着时候我们看到,函数已经绕过了其他括号限制,成功可以直接打开页面的时候触发了,不再需要手动去触发。

总结

总结下几个点

  1. 寻找可控点
  2. 尝试特殊符号是否被过滤拦截
  3. 有waf尝试waf没被过滤的函数
  4. 然后尝试触发

那么构造直接打开页面触发的也是一一样,上面几步之后

  1. 分析方法体
  2. 尝试特殊字符 }{“// 有没有被过滤
  3. 尝试闭合方法
  4. 解决报错情况

(前端js基础还是挺重要的)

CATALOG
  1. 1. 前言
  2. 2. 正文
  3. 3. 拼接函数
    1. 3.1. 截断方法
  4. 4. 构造结尾方法
  5. 5. 总结