Skip to content

Latest commit

 

History

History
78 lines (75 loc) · 8.85 KB

0x15|Yeni_Burp_Suite_2020.11_ve_SSRF_Giriş.md

File metadata and controls

78 lines (75 loc) · 8.85 KB

SSRF Giriş

İşinize yarayabilecek bazı eklentiler: hackvertor, hackbar

Okuyabileceğiniz makaleler:

  1. https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery#bypassing-filters
  2. https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf
  3. https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery#bypassing-filters

Lab: SSRF with blacklist-based input filter

  • Bir ürüne gidip “Stock Check” yap. Parametre olarak bir URL gönderiyor bunu da decode et. image
  • Öncelikle götürmek istediğimiz domaini çözmesi gerekiyor vatandaşın.

Deneyebileceğin Yaklaşımlar:

  1. Blacklisting yaklaşımlı SSRF çözmek için ilk olarak DNS çözdürmeyi deneyebilirsin(localhostpentest.pentes.blog/admin).
  2. İp adresini HEX karşılığında verebilirsin ya da domaini HEX karşılığında verebilirsin.
  3. Portu yazarsan arka tarafta backending URL parser’ı ile ilgeliniyorsun demek. image
  • localtest.me yapmasının sebebi arka tarafta 127.0.0.1’e çözümlemesini sağlamak. Bunu başka bir sürü kodla da yapabilirsin(nslookup ile de sağlamasını yaparsın.) github linkinde var.
  • Burada anlamaya çalıştığı şey, string.contains() metodu gibi bir şey mi var arkada ona göre güvenlik önlemi almış yoksa URL’i parse edip mi bakıyor?
    • bunu anlamak için “admin”i alıp http://localtestadmin.me/ yapıp öyle deneyince security reasons hatası geldi yine demek ki burda string kontrolü var. image
  • ADMIN’i büyük yazıp denedi, “CouLd not connect to external check service” hatası geldi. Case sensitive mi diye kontrol etti yani
  • “admin” i 2 kere URL encode edip yolladı. İlkinde öndeki engeli atlayacak admini göremediği için, bu URL’i ikinci encode halinde de bir backend’e(Java) tekrardan HTTP requesti göndertecek. Ama şuanki backend Java galiba ve bu isteği atarken otomatik decoding yapmıyor bu yüzden hata alındı. image
  • İlk decodingi Nginx, apache gibi önde duran uygulamalar yapar. Sonra 2. web uygulamasının gördüğü değer de encoded bir şey, burada bulunan nginx, apache, tomcat gibi uygulamalar tekrar bunu decode ediyor. image
  • 127.1 yazınca oldu. gerisi /admin encoded şeklinde.
  • Sonra carlosu tekrar istek atarak sildi.

Lab: SSRF with whitelist-based input filter

  • Whitelisting yöntemleri : domain şu olması gerekli, port olarak bu olmalı ve path olarak da bu olmalı diyerek sıkılaştırılabilir.
  • Bunu atlatmanın da tek yöntemi backend’in URL parser function’ını buglaman gerekli. image
  • Normal şartlarda x:y# kullanıcı adı parola demek URL şemasında. Ama # den sonrasını location hash olarak görüp bundan sonrasını kale alma diyebilir. Burdaki logic bugı kullanman lazım. URL parser stock.weliketoshop . net i domain sanacak ama full URL’i HTTP kütüphanesine verince ben z.com’a gidicem benim domain bu diyecek, oraya da localhost’u yerleştireceksin.
  • Hangi parametreleri whiteliste almış onu dene. image
  • Parametresini (storeId) silince kızıyor. & URL encoding yaptı.
  • productId yi de görmek istiyor
  • pathi değiştirince kızmıyor, admin yazınca kızmaz.
  • Port’u değiştirince “CouLd not connect to external check service” hatası verdi yani buna da kızmıyormuş.
  • domain’i değiştirince kızıyor. stock.weliketoshop.net olmalı diyor. sonuna .asd falan yazınca anlaşılıyor bu. URL’i parse ettikten sonra comparasion yapıyor
  • Parse olayını daha detaylı incelemeye al. image
  • username:paswd kısmına burp collabrator koydu, pek mantıklı bir yaklaşım değil ama kızmadı yine.
  • boş @ işareti yolladı. invalid URL döndü
  • @ işaretinden önce # koydu, kafası karışmaya başladı.
    • URL parse edip denedi.
  • 2 tane @ koydu. image
  • Protokol ile de ilgilenmiyor arkadaş
  • Diyez # koyunca olmuş dendi, ama kafası karışıyor. image
  • @ den sonrasını parse etse, whitelist hatası verecek zaten. image
  • Buna fuzzing yapıyormuş reis. Ama Parser kızdı zaten. Sitede, altındaki tabloda fuzzingi göstermiş zaten image
  • Double encoding yaptı / işaretine ve oldu.
    • Payload, 127.0.0.1:80/admin@stock….. image
  • Parser @ den öncesini kul adı ve parola olarak görüyor yani çalışıyor o kısımda sıkıntı yok. Ama / işaretini koyunca burdan sonrasi itibariyle benim için path’dir diyor URL parser. 127.0.0.1 i algılamış oluyor.
  • Öndeki URL parser diyor ki @ den öncesi kullanıcı adı, parola ben @ den sonrasına giderim aga.
  • Sonra tam URL HTTP req. yapan fonksiyona gidince, URL decoding yapıyor ki parametreleri görebilsin. HTTP librarylerinin GET metodları default olarak URL decoding yapar. Sonra decode olmuş tam URL arka tarafa gidiyor o da bir kere daha decoding yapınca /admin ile karşılaşıyor.
    • Normade bunun böyle çalışmaması lazım çünkü @ işaretinden sonra orayı path algılayıp kafası karışmalı. Bunu çözümü de /admin?@ şeklinde yazmaktır ki ? den sonra query string olsun ve geri kalan her şey GET parametresine dönüşsün. ? ini de encode etmen lazım. image
  • Özetle, HTTP web server bunu decode etti ve şuna dönüştü: image
  • backend(/product/stock endpointi) image
  • URL’i parse ettiğinde, /admin? encoded olduğu için 127.0.0.1:80 kullanıcı adı, paroladır. stock.weliketoshop.net benim domainimdir. Bu URL’i HTTP Client Library’sine verdi ve destination URL olarak bunu SET etti. Bu kütüphaneler de URL’den hangi host’a gitmeleri gerektiğini tespit etmek için bir daha URL parsing yaparlar ama yapmadan önce decode ederler ki “query stringleri “bulabilsin. Decode edince de parser, /admin ile karşılaşıyor ve destination 127.0.0.1 e dönüyor. ? sonrasını query stringe çevirmek için önemlidir. image
  • :80/admin/delete falan o kısımları sildik çünkü diğer /admin parametresi admin sayfasını getiriyor. Ona da /delete parametresini ekleyince ve username’i de en sona eklediğinde çözülmüş oluyor. image image
  • Öndeki uygulamaya giden payloadı şu şekilde görüyor: image image
  • 127.0.0.1 den sonra / koymayınca işler değişiyor: image