15 Temmuz 2021’de WooCommerce’de kimliği doğrulanmamış bir SQL Injection ile ilgili haberler ortalıkta dolaşıyordu. WooCommerce, güvenlik açıkları hakkında burada bir blog yazısı yayınladı: https://woocommerce.com/posts/critical-vulnerability-detected-july-2021/# . Güvenlik açıkları 13 Temmuz’da tespit edildi ve WooCommerce 3.3.6 ila 5.5.1 sürümlerinde ve WooCommerce Blocks 2.5.16 ila 5.5.1 sürümlerinde düzeltildi. Bu blog yazısı, güvenlik açıklarının, yamanın ve ardından hatalar için bir PoC’nin kısa bir analizidir!

Yama analizi

Yukarıda bağlantısı verilen WooCommerce güvenlik blog gönderisinde, güvenlik açıklarının WooCommerce ve WooCoomerce Blocks özellik eklentisinde olduğunu görebiliriz. Burada iki düzeltme görebiliriz: https://plugins.trac.wordpress.org/changeset?old_path=/woocommerce&old=2564657&new_path=/woocommerce&new=2564657&sfp_email=&sfph_mail=#file22 her iki ‘class-wc-webhook-data-store’da. WooCommerce’de php’ ve WooCommerce Bloklarında ‘ProductFiltering.php’.

Bu düzeltmelerin ikisi de çok ilginç. Bunu biraz daha takip etmek için, savunmasız sürümlerin kaynağını aldım ve bunun için bir WordPress sitesi kurdum (bu elbette PoC için de faydalı olacaktır). Kaynaktan biliyorum, savunmasız kısım API aracılığıyladır, bu nedenle API yollarının güzel bir listesini almak için ‘woocommerce\packages\woocommerce-blocks\src\StoreApi\RoutesController.php’ adresini ziyaret edebiliriz.

Bunu kullanarak, ‘woocommerce\packages\woocommerce-blocks\src\StoreApi\Routes\ProductCollectionData.php’ altında gidebileceğimiz ‘product-collection-data’ yolunu görebiliriz!

Artık yolumuz /wp-json/wc/store/products/collection-data. Bu dosyadan, bu belirli rotanın nasıl kullanılacağını detaylandırdığı için oldukça kolay bir şekilde tam bir URL oluşturabiliriz. Orijinal yamaya geri dönersek, ‘wc_sanitize_taxonomy_name’ bizi aşağıdaki gibi işleve götürür:

Bu gerçekten ilginç ve sanitize_title kullanımına göz attıktan sonra şunu elde ederiz:

Varsayılan olarak, vurgu karakterlerini ASCII karakterlere dönüştürür ve çıktıyı ‘sanitize_title’ filtresi aracılığıyla alfasayısal karakterler, alt çizgi (_) ve tire (-) ile sınırlar.

Ve bu kod da urldecode kullanıyor, bu nedenle, bunu aşmak için bir yükü 3 kez URL kodlarsak, daha önce oluşturulan URL ile birleştirilmiş tam işlevli bir PoC’ye sahip olmalıyız.

Hatalardan yararlanma

Bulduğumuz bilgilerle artık devam edebilir ve bu güvenlik açıklarından yararlanmaya çalışabiliriz! Edindiğimiz tüm verilerden nihai URL’miz aşağıdaki gibi olacaktır. Yük, basit bir uyku SQL komutu içerir:

http://127.0.0.1:8080/wordpress/wp-json/wc/store/products/collection-data?calculate_attribute_counts[0][taksonomi]=test%252522%252529%252520or%252520sleep%25252810.1%252529%252523

Bu PoC’yi savunmasız bir WooCommerce sürümünde yürütmek gerçekten işe yarıyor!