Next.js Middleware’de SSRFS’den yararlanıyor


Intigriti olarak, Güvenlik Araştırma Topluluğu ile etkileşime geçmenin bir yolu olarak Aylık Web Tabanlı Bayrak (CTF) zorluklarını yakalıyoruz. @0xblackbird tarafından sunulan bu ayki Challenge, bir sonraki.js ara katman yazılımından yararlanan web uygulamalarını etkileyen ilginç bir sunucu tarafı istek Astrama (SSRF) güvenlik açığı içeriyordu.

Bu makale, August CTF Mücadelesini çözmek için adım adım bir adımdır ve bir sonraki SSRF güvenlik açıklarını kullanma teknikleri gösterir.

Hadi dalalım!

Catflix AI lakaplı Ağustos’un meydan okuması, ziyaretçilerin AI tarafından üretilen kedi videolarını yayınlamasına izin vermek için yapıldı. İlk görüşten, ziyaretçilerin platformda herhangi bir video izlemeden önce oturum açmaları gerekmektedir. Buildwith ve Wappalyzer gibi araçları kullanarak, next.js’nin uygulamanın ön uç ve arka uç için kullanıldığını kolayca bulabiliriz.

Parmak izi teknolojilerini Wappalyzer kullanmak

Sayfada daha fazla kaydırarak, kaynak koduna referanslar da bulabiliriz.

Bu ayın meydan okuması kaynak kodu erişimini içeriyordu

Kaynak kodu dosyasının içeriğini çıkarmak, next.js. Bir sonraki mantıklı adımımız, anormallikler için tüm kodları gözden geçirmektir. Bu zorluk, savunmasız sistemde bulunan bayrağı yakalamamızı gerektirdiğinden, dosya sistemine erişmek için bir sunucu tarafı güvenlik açığı türünden yararlanmamız gerekir. Bu, dikkatimizi sunucu tarafı bileşenlerine çeker.

NoSQL enjeksiyonu

Kayıt API uç noktasının içinde, /src/app/api/auth/register/route.tsfark edebiliriz satır 20 Bu ham kullanıcı girişi doğrudan bir MongoDB sorgusu olarak birleştirilir.

Eksik validasyon ve doğrudan birleştirme potansiyel bir NoSQL enjeksiyonu getirdi

NoSQL Enjeksiyon Sömürü Kılavuzumuzdan, bunun doğrudan NoSQL enjeksiyonuna yol açabileceğini öğrendik. Bu, gerekenden daha fazla bilgi çekebilmemiz veya hatta mevcut kayıtları değiştirebilmemiz için sorguyu hareket ettirmemizi etkili bir şekilde geçirmemize izin verir.

Mevcut kullanıcı hesaplarını numaralandırmak için temel NoSQLI sömürüsü

Ancak, daha fazla değerlendirmeden sonra, bu NoSQLI’nin dosya sistemine erişmemize yardımcı olacağını düşünmüyoruz. Öyleyse daha fazla bakalım ve olağandışı başka bir şey tespit edip edemeyeceğimizi görelim.

NextJs Middleware

Bir sonraki birincil odak noktamız middleware.ts dosya. Bu özel dosya, /src/middleware.tsyanıtlar döndürülmeden önce geliştiricilerin kod çalıştırmasına izin verir. Mantere dayalı olarak sunucu tarafı yönlendirmeleri, kimlik doğrulama ve yetkilendirme kontrolleri gerçekleştirmek için kullanışlıdır. Bu durumda, ara katman yazılımı, müşteriye iade edilmeden önce her yanıta güvenlik başlıkları eklemek için kullanıldı.

Next.js Middleware ile güvenlik başlıkları ekleme

Güvenlik başlıklarına ek olarak, ara katman yazılımı da bazı analizler gerçekleştiriyor gibi görünüyor, ancak yorumdan bu eklemenin hala devam ettiğini türetebiliriz.

Aşağıdaki kod snippet, UTM parametrelerinden birinin mevcut olup olmadığını kontrol eder. Bu koşul karşılandığında, tam yanıt istek başlıklarımızla döndürülür. Ancak bu gerçekleşmeden önce, Next.js ara katman yazılımı tüm başlıkları değerlendirecektir.

Next.js ara katman yazılımı yanlış yapılandırma bir SSRF tanıttı

Bu belgesiz özellik, NextResponse.next() dahil olmak üzere belirli başlıkları işleyin Location Dahili bir yönlendirmeyi tetikleyebilecek yanıt başlığı. Yanıt nesnesindeki bu özel başlığı geçmek, çerçevenin bu konuma sunucu tarafı bir isteği gerçekleştirmesine ve bunun yerine bu isteğin yanıtını, yani bir sunucu tarafı istek amorcu (SSRF) döndürmesine neden olacaktır.

Bu ima anlayışını anlayarak, aşağıdaki kavram isteği kanıtını kolayca göndermeye ve yanıtı gözlemlemeye çalışabiliriz:

GET /?utm_source=meta HTTP/2
Host: challenge-0825.intigriti.io
User-Agent: curl/8.14.1
Accept: */*
Location: https://example.com/

Yukarıdaki talebin gönderilmesi bir sonraki işlemi yapar.

Next.js Middleware’de bir SSRF’den yararlanıyor

Sömürü kısmına daha derinlemesine dalalım.

Sunucu tarafı isteği Apgenesi (SSRF) güvenlik açıkları, bir saldırganın savunmasız uygulama, hizmet veya sunucu adına harici (veya dahili) bir kaynak istemesine izin verir. Bu, artık dahili HTTP tabanlı hizmetlere ulaşabileceğimiz için bizim için yeni bir saldırı vektörü açıyor.

Doğrulama olmadığından, Localhost’a bağlantı noktasına temel bir istek göndermek 3000 (Next.js için varsayılan dinleme bağlantı noktası) dahili hizmetlere kolayca ulaşabileceğimizi onaylayabilir:

GET /?utm_source=meta HTTP/2
Host: challenge-0825.intigriti.io
User-Agent: curl/8.14.1
Accept: */*
Location: http://localhost:3000/

Dahili Kaynaklara Next.js ‘Middleware SSRF ile erişmek

Bir sonraki odak noktamız, yerel bir dosya okumasından yararlanmamızı sağlayan bir dahili hizmet bulmaktır. FFUF veya Burp Suite gibi araçlarla bağlantı noktası numarasını kabarabilir ve herhangi bir isabet arayabiliriz. Bu yöntemi kullanarak, Jenkins CI/CD’nin 8080 bağlantı noktasında çalıştığını kolayca anlayabiliriz. Yanıtın daha fazla incelenmesi, kimlik doğrulamasının devre dışı göründüğünü göstermektedir.

8080 bağlantı noktasında çalışan Jenkins CI/CD

SSRF’yi RCE’ye

Jenkins, geliştiricilerin sistem komutlarını yürütme de dahil olmak üzere kodu değerlendirmesine izin veren yerleşik bir harika komut dosyası konsoluna sahip olduğundan, bu noktadan itibaren sömürü açıktır. Kimlik doğrulama devre dışı bırakıldığından, pratikte bir oturum jetonu sağlamadan kullanabilir ve yine de komutumuzu yürütmeyi başarabiliriz.

Aşağıdaki talebin çoğaltılması yürütülecek whoami Sistemde:

POST /?utm_source=meta HTTP/2
Host: challenge-0825.intigriti.io
User-Agent: curl/8.14.1
Accept: */*
Location: http://localhost:8080/script
Content-Type: application/x-www-form-urlencoded
Content-Length: 50

script=println('whoami'.execute().text)

Artık onaylanmış bir uzaktan kod yürütmemiz olduğuna göre, bayrağı aramaya başlayabiliriz. Çoğu durumda, bu sistemin proje köküne kaydedilecektir.

Basit ls Bunu onaylar:

Jenkins Script Konsolu Kodu Yürütme

Önceki komuttan gelen bilgileri kullanarak, içeriğini görüntülemek için başka bir istek oluşturabiliriz. flag.txt dosya:

POST /?utm_source=meta HTTP/2
Host: challenge-0825.intigriti.io
User-Agent: curl/8.14.1
Accept: */*
Location: http://localhost:8080/script
Content-Type: application/x-www-form-urlencoded
Content-Length: 50

script=println('cat /app/flag.txt'.execute().text)

Birçok durumda, tasarlanmamış kullanıcı girişi, tüm enjeksiyon saldırılarının ortak bir kök nedeni olan değerlendirme fonksiyon çağrılarına doğrudan aktarıldı. Sunucu tarafı kodunu dikkatlice inceleyerek, komut yürütme elde etmek için birkaç enjeksiyon güvenlik açıklarını tanımlayabildik, doğrulayabildik ve silahlandırabildik.

Bu yüzden, noSqliS’ten yararlanmak, SSRF’leri silahlandırmak ve güvenlik yanlış yapılandırmalarından yararlanmak için yeni bir şey öğrendiniz … şu anda, becerilerinizi teste koymanın zamanı geldi! Korunmasız laboratuvarlarda pratik yapmaya devam edebilir veya … Intigriti’deki 70’den fazla genel hata ödül programlarımıza göz atabilirsiniz ve belki de bir sonraki gönderiminizde bir ödül kazanırsınız!

Bugün Intigriti’de hacklemeye başlayın



Source link