İçeriğe atla
Noroxi
Araştırma8 dk

Login LockDown 2.18: Yerleşik CAPTCHA Tekrar Oynatma Zafiyeti

Login LockDown 2.18 CAPTCHA cevabını istemciye token olarak gönderiyor; yakalanan tek çift süresizce tekrar oynatılıyor. Kök neden, çözüm, tespit.

Noroxi EkibiSızma testi ve güvenlik danışmanlığı

Özet. Login LockDown, 100.000'den fazla etkin kuruluma sahip bir WordPress eklentisi. Sunduğu korumalar arasında giriş formuna yerleşik bir matematik CAPTCHA'sı ekleme seçeneği de var. 2.18 sürümü bu CAPTCHA'yı, onu etkisiz bırakacak biçimde doğruluyor. Eklenti, beklenen cevabı tarayıcıya istemci tarafı bir token olarak gönderiyor; girişi de ikisi de aynı istekle gelen iki değer üzerinde bir karma yeniden hesaplayarak onaylıyor. Cevap/token çifti hiçbir sunucu tarafı duruma bağlı olmadığı için sınırsızca tekrar oynatılabiliyor ve CAPTCHA'nın vaat ettiği otomasyon karşıtı koruma sessizce yok oluyor. Aşağıda kök nedeni ve site sahipleriyle geliştiricilere yönelik savunmacı bir rehberi bulacaksınız. Koordineli açıklama gereği tam çalışan kavram kanıtı, bir yama çıkana kadar bizde kalıyor.

Anahtar sözcükler: Login LockDown, WordPress, CAPTCHA atlatma, yakala-tekrarla, CWE-294, CWE-804, güvenlik denetimi atlatma, otomasyon karşıtı.

1. Giriş

Kaba kuvvet ve kimlik bilgisi doldurma, her WordPress giriş ucuna yönelen en istikrarlı baskı. Login LockDown gibi eklentiler otomatik tahminin maliyetini yükseltmek için var: IP kilitlemeleri ve dileyen yöneticinin giriş formuna (ve WooCommerce girişine) ekleyebildiği bir CAPTCHA.

Atlatılabilen bir koruma, baştan yok olandan daha tehlikelidir. Yerleşik CAPTCHA'yı açan yönetici, otomatik giriş denemelerinin artık bir insan doğrulama adımına takıldığını düşünür. Oysa o adım bir kez açılıp sonsuza dek tekrar oynatılabiliyorsa bu beklenti boşa çıkar; kapattığını sandığı kaba kuvvet yüzeyi hiçbir uyarı vermeden yeniden açılır.

Sorun, Login LockDown 2.18'in yerleşik matematik CAPTCHA seçeneğinde; test sırasında güncel olan sürüm buydu. Varsayılan olmayan bir ayara bağlı: yöneticinin yerleşik CAPTCHA'yı (captcha = builtin) seçmiş olması gerekiyor. IP kilitleme özelliğini ayrıca inceledik ve sağlam bulduk.

2. Etkilenen bileşen

EklentiLogin LockDown — slug login-lockdown
Test edilen sürüm2.18 (test sırasında güncel/son sürüm)
Etkin kurulum100.000+
Zafiyet türüGüvenlik denetimi atlatma — yetersiz CAPTCHA doğrulaması (yakala-tekrarla)
CWECWE-804 (Tahmin edilebilir CAPTCHA), CWE-294 (Yakala-tekrarla ile kimlik doğrulama atlatma); üst CWE-287
Gerekli yetkiYok — kimliği doğrulanmamış, uzaktan
Ön koşulYönetici, CAPTCHA seçeneğini yerleşik matematik CAPTCHA'sına ayarlamış olmalı (captcha = builtin; varsayılan değil)
CVSS 3.1~5.3 (Orta) AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
DurumTaze — yamalanmamış; güncel sürümde kodda doğrulandı ve yalıtılmış localhost laboratuvarında yeniden üretildi

3. Teknik analiz

Yerleşik matematik CAPTCHA'sı ziyaretçiden küçük bir toplamı çözmesini ister. Her şey beklenen cevabın nerede tutulduğuna bağlı ve Login LockDown onu sunucuda hiç tutmuyor. Ne bir oturum kaydı var ne de geçici (transient) bir değer. Bunun yerine giriş formu her meydan okuma için iki alan yayımlıyor:

  • loginlockdown_captcha[<id>] — kullanıcının yazdığı cevap;
  • loginlockdown_captcha_token[<id>] — wp_hash(<cevap>) değerine ayarlanmış gizli bir token.

Form oluşturulurken token doğrudan cevaptan türetiliyor:

php
// libs/functions.php  (login_form_fields — token üretimi, ~satır 244)$output .= '<input ... name="loginlockdown_captcha['.$captcha_id.']" ...>';$output .= '<input type="hidden" name="loginlockdown_captcha_token['.$captcha_id.']" value="'. wp_hash($captcha['value']) .'" />';

Doğrulama ise gönderilen cevabın wp_hash()'ini yeniden hesaplayıp gönderilen token ile karşılaştırıyor:

php
// libs/functions.php  (handle_captcha — doğrulama, ~satır 180)foreach ($captcha_responses as $captcha_id => $captcha_val) {    if (wp_hash($captcha_val) === $captcha_tokens[$captcha_id]) {   // HER İKİ işlenen de $_POST'tan gelir        return true;    } else {        return new WP_Error('lockdown_builtin_captcha_failed', ...);    }}

Karşılaştırmanın her iki işleneni de istekten geliyor. Bu denetim yalnızca gönderenin bir değeri ve onun wp_hash()'ini bildiğini gösteriyor; o değeri de sunucu bir an önce zaten kendisi dağıtmıştı. Söz konusu etkileşim hakkında hiçbir kanıt üretmiyor: oturum bağlama yok, nonce yok, süre sonu yok, tek kullanımlık işaret yok. CAPTCHA'nın güvence vermesi gereken şey, her meydan okumanın bir kez ve o anda çözülmesi; burada (cevap, wp_hash(cevap)) çifti yeniden kullanılabilir bir kimlik bilgisine dönüşüyor.

Eksik durum iki sonucu doğrudan getiriyor.

  1. Tekrar oynatma. Meşru bir form yüklemesinden yakalanan tek bir geçerli (cevap, token) çifti, sonraki tüm gönderimlerde doğrulamayı süresizce geçer.
  2. Tam tablo hasadı. Matematik cevap uzayı çok küçük (0–20 aralığındaki toplamlar), dolayısıyla bir avuç form yüklemesi her (cevap, token) çiftinin eksiksiz arama tablosunu çıkarır. Bundan sonra hiçbir meydan okumayı yeniden çözmeye gerek kalmaz.

4. Kusura nasıl ulaşılır (kavramsal)

Kusura ulaşmak için kimlik doğrulama gerekmiyor. Giriş formu herkese açık, doğrulama da herkese açık giriş POST'unda çalışıyor. Kimliği doğrulanmamış bir ziyaretçi, giriş sayfasını sıradan bir tarayıcı gibi isteyip dönen HTML içinden eşleşen bir (cevap, token) çiftini okuyabilir. Cevap, görünen matematik meydan okuması; token ise hemen yanında gizli bir alan. Token wp_hash(cevap)'ten ibaret olduğu ve sunucu hangi çiftlerin harcandığını kaydetmediği için doğrulayıcı, taze bir insan gönderimi ile bir betiğin tekrar oynattığı saklanmış çifti birbirinden ayıramıyor.

Kapı artık kapı olmaktan çıkar. Anahtarı kapının üzerine basılmış bir kilide döner. Geçerli herhangi bir çift bilindiği anda, ki o çift sayfayı yükleyen herkese görünür ve tüm cevap uzayında yalnızca birkaç farklı değer vardır, CAPTCHA adımı otomatik bir istemcinin her isteğe iliştirdiği bir sabite küçülür. Otomasyon karşıtı denetim bir formaliteye iner; wp-login.php'ye yönelik betikli giriş denemeleri, sanki hiç CAPTCHA tanımlanmamış gibi akar. Birebir istek dizisini ve değerleri bilerek dışarıda bırakıyoruz. Savunucuların riski ölçebilmesi için gereken şey, yukarıdaki mekanizma.

5. Etki değerlendirmesi

Pratikte giriş formu otomasyon karşıtı güvencesini kaybeder. Yerleşik CAPTCHA seçiliyken yönetici, otomatik giriş denemelerinin bir insan doğrulama adımıyla kısıtlandığını sanır. Yakalanan tek bir çift ya da o küçük eksiksiz tablo, otomatik bir istemcinin bu adımı sınırsız denemede geçmesine yeter. WordPress ve WooCommerce girişine yönelik kaba kuvvet ve kimlik bilgisi doldurma yeniden gündeme gelir; yani eklentinin kurulma amacı olan saldırılar.

Dürüst önem derecesi Orta. AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N (~5.3) vektörü, ağdan erişilebilir, düşük karmaşıklıklı, kimliği doğrulanmamış bir atlatmayı tarif eder; doğrudan gizlilik veya erişilebilirlik kaybı yoktur. Puan, garantili bir hesap ele geçirmesine değil, denetimi etkisizleştirmenin bütünlük etkisine verilmiştir. Ön koşul derecesi biraz daha düşürür, çünkü yerleşik CAPTCHA varsayılan kapalıdır ve sorun yalnızca yöneticinin onu açıkça açtığı yerlerde geçerlidir. Atlatma tek başına kimlik doğrulaması sağlamaz; yalnızca kimlik doğrulamanın önündeki bir katmanı kaldırır.

Bağlam olarak: ayrı bir inceleme IP kilitleme mantığının etkilenmediğini doğruladı. İstemci adresini yalnızca REMOTE_ADDR'den alır, X-Forwarded-For/Client-IP'ye güvenmez; bu nedenle sahte IP ile kilitleme atlatma geçerli değildir. Veritabanı erişimi de beyaz listeli sütunlarla parametreli sorgular kullanır, yani SQL enjeksiyonu söz konusu değildir.

6. Giderme

İki değişiklik sorunu kapatır: beklenen cevap için istemciye güvenmeyi bırakmak ve her meydan okumayı tek kullanımlık yapmak. Cevabın yeri sunucudur; orada üretilip saklanmalı, ister oturumda ister sunucunun ürettiği bir kimliğe bağlı kısa ömürlü bir geçici değerde, ve doğrulama çalışır çalışmaz silinmeli. wp_hash(cevap)'ı tarayıcıya gönderip iki istemci değeri üzerinde karşılaştırma yeniden hesaplama alışkanlığı kalkmalı. Meydan okuma ayrıca oturuma bağlanmalı ve bir süre sonuyla sınırlanmalı.

php
// Örnek sağlamlaştırılmış akış — cevabı sunucu tutar; istemci onu asla görmez.
// Form oluşturulurken:$captcha_id  = wp_generate_uuid4();$answer      = /* matematik cevabını sunucu tarafında hesapla */;set_transient( 'lld_captcha_' . $captcha_id, (string) $answer, 5 * MINUTE_IN_SECONDS );// yalnızca meydan okuma metnini ve $captcha_id'yi yayımla — cevabı ya da karmasını asla.
// Doğrulamada:$expected = get_transient( 'lld_captcha_' . $captcha_id );delete_transient( 'lld_captcha_' . $captcha_id ); // tek kullanımlık: sonuç ne olursa olsun tüketif ( $expected !== false && hash_equals( $expected, (string) $submitted_answer ) ) {    return true;}return new WP_Error( 'lockdown_builtin_captcha_failed', /* ... */ );

Yamalı bir sürüm çıkana dek yöneticiler, yerleşik matematik CAPTCHA'sı yerine iyi bakım gören üçüncü taraf bir CAPTCHA ya da otomasyon karşıtı seçeneği tercih etmeli; yerleşik CAPTCHA'yı tek kaba kuvvet savunması olarak görmemeli.

7. Site sahipleri için tespit ve sıkılaştırma

  • Yerleşik matematik CAPTCHA'sını şimdilik koruyucu saymayın. Otomasyon karşıtı korumaya güveniyorsanız IP kilitlemeyi açık tutun (sağlamdır) ve yanına yerleşik seçenek yerine bakımlı, sunucuda doğrulanan bir CAPTCHA veya harici bir meydan okuma koyun.
  • Eklentiyi güncel tutun. Login LockDown'ın bunu gideren gelecek sürümlerini uygulayın ve satıcının değişiklik günlüğünü takip edin.
  • En az yetki ve güçlü kimlik doğrulama uygulayın. Asıl risk yeniden canlanan kaba kuvvet ve kimlik bilgisi doldurma olduğundan, güçlü benzersiz parolalar ve yetkili hesaplarda iki aşamalı doğrulama, CAPTCHA atlatılsa bile aşağı akıştaki zararı köreltir.
  • Günlüklerde otomasyonu izleyin. Çok sayıda denemede aynı CAPTCHA cevap/token alan değerlerini taşıyan yoğun giriş POST'ları — özellikle bir veya birkaç kaynak adresten, ya da meydan okuma kimliği pek değişmiyorsa — tekrar oynatılan bir çiftin imzasıdır. wp-login.php'ye makine hızında tekrarlanan başarısız girişler, CAPTCHA tanımlı olsun olmasın aynı dikkati hak eder.
  • Kenarda hız sınırlayın ve sanal yama koyun. wp-login.php'yi hız sınırlayan ve tekrar eden aynı CAPTCHA token gönderimlerini işaretleyen bir WAF veya ters vekil kuralı geçici sanal yama görevi görür. Meşru trafiği etkilememek için kuralı yalnızca giriş ucuyla sınırlayın.

(Bu göstergeler kusurun mekaniğinden çıkarılmıştır; belirli bir günlükleme ürünü veya özelliği varsaymazlar.)

8. Daha geniş ders

İlke basit ama sık çiğnenir: bir doğrulayıcı, kontrol etmesi gereken sırrı taşıması için istemciye güvenmemelidir. Doğrulanan şey — bir CAPTCHA cevabı, tek seferlik bir kod, bir fiyat, bir rol — tarayıcıya gönderilip karşılaştırma için geri alınıyorsa, denetim süsten ibarettir. Yetkili olması gereken güvenlik durumu sunucuya aittir: belirli oturuma ve etkileşime bağlı, bir süre sonuyla, bir kez tüketilip tekrar oynatılamayacak şekilde. Bir istemci değerinin karması durum değildir; aynı istemci değerinin kılık değiştirmiş halidir. Meydan okuma–yanıt denetimleri güvenliğini bir karmayı tersine çevirmenin zorluğundan değil, yalnızca tazelik ve tek kullanımdan alır.

9. Sorumlu açıklama

Bu araştırma koordineli açıklamayı izler. Satıcı özel olarak bilgilendirildi; tam operasyonel teknik ayrıntı — birebir yeniden üretim dizisi ve yük değerleri — bir yama çıkana ya da koordineli son tarihe ulaşılana kadar bu herkese açık yazıdan çıkarıldı. Buradaki hiçbir şey çalıştırılabilir bir saldırı sunmaz.

Tüm testler Noroxi LLC tarafından, yalnızca kendi kontrolümüzdeki bir kuruluma karşı, yalıtılmış ve localhost'a bağlı bir laboratuvarda yapıldı. Hiçbir üçüncü taraf ya da üretim sistemine dokunulmadı; eklenti test biter bitmez kaldırıldı. Noroxi LLC yalnızca yetkili güvenlik araştırması yürütür. İzinsiz sistem test etmeyiz ve yamalanmamış yazılıma karşı silahlaştırılmış ayrıntı yayımlamayız.

Kaynaklar


Savunma ve eğitim amacıyla yayımlanmıştır. Noroxi LLC yalnızca yetkili güvenlik araştırması yürütür; operasyonel istismar ayrıntısı bir yama çıkana kadar paylaşılmaz.

Bu hafta sömürülenler · her pazartesi

KEV'e girenler, yeni PoC'ler, WordPress triyajı ve bu hafta ne yapmalı. Hesap gerekmez.

Adresiniz yalnızca bu e-posta için kullanılır; üçüncü tarafla paylaşılmaz.

Sıradaki

Loginizer: Taklit IP Başlığıyla Kaba Kuvvet Kilidini Atlatma