React2Shell (CVE-2025-55182): 10 Puanlık Kritik Zafiyeti Nasıl İnceledim?

Read in English

Siber güvenlik dünyasında bazı zafiyetler vardır, çıktığı gün ortalığı ayağa kaldırır. Geçtiğimiz günlerde duyurulan CVE-2025-55182 (React2Shell) tam olarak böyleydi. CVSS skoru 10.0 olan bu zafiyet, React ve Next.js altyapılarını etkileyerek kimlik doğrulaması olmadan uzaktan kod çalıştırmaya izin veriyor.

Ben de TryHackMe’nin bu konu için hazırladığı odayı çözerek, teoride okuduğum şeyin pratikte nasıl işlediğini görmek istedim. Bu yazıda, React Server Components mimarisindeki bu açığın mantığından ve laboratuvar ortamındaki sömürü adımlarımdan bahsedeceğim.

Sorun Nerede? (Teknik Özet)

Olayın kökünde “Insecure Deserialization” (Güvensiz Veri İşleme) yatıyor. React 19 ile gelen sunucu bileşenleri, istemciyle haberleşirken özel bir format kullanıyor. Ancak sunucu tarafındaki requireModule fonksiyonu, gelen veriyi işlerken yeterince sıkı bir filtrelemeden geçirmiyor.

React Server Components

Özetle; bir saldırgan olarak özel hazırlanmış bir veri paketi gönderdiğimizde, sunucuyu manipüle edip JavaScript’in global fonksiyonlarına erişebiliyoruz. Bu da bize sunucunun komut satırında istediğimiz komutu çalıştırma kapısını açıyor.

Adım 1: İsteği Yakalamak ve Payload Hazırlığı

Zafiyeti sömürmek için elimizde bir PoC kodu vardı. Ancak bunu doğrudan tarayıcıdan değil, Burp Suite kullanarak göndermem gerekiyordu çünkü HTTP isteğinin başlıklarını ve gövdesini manuel olarak düzenlemeliydim.

Hedef sunucuya giden bir POST isteğini yakaladım ve multipart/form-data formatındaki gövde kısmına zararlı kodumu yerleştirdim. Bu payload, sunucu veriyi işlemeye çalıştığında arka planda Node.js’in child_process modülünü tetikleyecek şekilde ayarlanmıştı.

Burp Suite payload

Adım 2: İlk Temas ve Erişim Kontrolü

Bir RCE zafiyeti bulduğumuzda ilk refleksimiz genellikle “Ben kimim?” sorusunu sormaktır. Sistemin hangi kullanıcı yetkileriyle çalıştığını görmek, sonraki adımları belirlemek için kritiktir.

Oda içerisinde verilen payload’ı kullandım ancak execSync('whoami', ... şeklinde modifiye ederek. Dönen cevapta, hatanın detayları arasına gizlenmiş şekilde çıktıyı (ilk sorunun cevabını) aldım. Bu, sunucuda komut çalıştırabildiğimi ve standart bir kullanıcı yetkisine sahip olduğumu doğruladı.

whoami çıktısı

Adım 3: Bayrağı (Flag) Okumak

Erişimi doğruladıktan sonra hedefim, laboratuvarın amacı olan “flag”i bulmaktı. Genellikle bu tür sistemlerde bayraklar /etc veya /root gibi dizinlerde saklanır.

Payload’ımı şu komutu çalıştıracak şekilde güncelledim: execSync('cat /etc/flag.txt'. İsteği gönderdiğimde sunucu yine beklenen hatayı verdi ama bu hatanın içinde dosyanın içeriği, yani aradığım flag açıkça görünüyordu.

Flag

Sonuç ve Çıkarımlar

React2Shell, modern web teknolojilerinde bile temel güvenlik prensiplerinin (girdi doğrulama gibi) ne kadar hayati olduğunu gösteriyor. Özellikle varsayılan ayarlarla kurulan Next.js projelerinin bile etkilenmesi riskin boyutunu artırıyor.

Benim için bu çalışma, sadece bir odayı tamamlamak değil, popüler bir framework üzerindeki deserialization mantığını anlamak açısından öğretici oldu. Eğer React veya Next.js kullanıyorsanız, sürümlerinizi (19.0.1+ / 19.1.2+) güncellemeyi unutmayın.