Uygun Şekilde Kullanılmayan PHP strcmp Fonksiyonunun İstismar Edilerek Kimlik Doğrulamasının Atlatılması

Web uygulamaları sızma testleri sırasında uygulama geliştiricilerin kullandığı fonksiyonların zafiyetleri istismar edilebilir. Bu yazıda, web hizmeti veren IMF:1 sanal makinesindeki PHP strcmp fonksiyonunun geri dönüş değeri uygun şekilde kontrol edilmemesinden kaynaklı olarak kimlik doğrulaması atlatılarak oturum açılabilecektir.

Yazıda kullanılan IMF:1 sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/imf-1,162/

 

IMF:1 sanal makinesinde bir takım CTF adımları ile oturum açma ekranı keşfedilebilmektedir.

http://10.10.2.181/imfadministrator/

 

İletişim sayfasında da bir takım kullanıcı isimleri keşfedilir.

rmicheals@imf.local
akeith@imf.local
estone@imf.local

Kullanıcı adı olarak “rmichaels” harici bir değer verildiğinde “Invalid username.” hatası dönmektedir. Kullanıcı adı olarak “rmichaels” verilip yanlış parola girildiğinde ise “Invalid password” hatası alınmaktadır. Ancak kaba kuvvet saldırılarına rağmen oturum açılamayabilmektedir.

 

Talep ve dönen cevap sonucu Burp Suite gibi bir vekil uygulama ile görülebilir.

 

Sayfanın kaynak kodu incelendiğinde “user” ve “pass” değişkenleri ile kimlik bilgilerinin alındığı görülmektedir.

 

Oturum açma sayfasında PHP kimlik doğrulamasını atlatma zafiyetine sebep olabilecek “strcmp” fonksiyonu kullanılmaktadır. Bu fonksiyon 2 katarı (string) küçük/büyük harf duyarlı olarak karşılaştırmak için kullanılır. PHP “strcmp” fonksiyonunun detayları için manuel sayfası incelenebilir.

https://secure.php.net/manual/en/function.strcmp.php

 

IMF:1 sanal makinesinin içerisindeki ilgili PHP kodu (index.php) aşağıdaki gibidir.

 

Bu fonksiyon parametre olarak aldığı “pass” girdi alanına karşılık gelen değer ile kullanıcının gömülü (gerçek / mevcut) parolasını karşılaştırmaktadır. Eğer karşılaştırma sonucu SIFIR (“0“) ise oturumun açılabilecektir. Ancak, karşılaştırma sırasında bir hata alınması durumunda, fonksiyonunun geri dönüş değeri “NULL” olarak dönmektedir. Bu gibi bir hata durumunda geri dönüş değeri “==” ile eşitlik şeklinde karşılaştırılırsa, bir uyarı mesajı verilir ve bunun yanında bir zafiyete sebebiyet olunabilir. Alınacak uyarı mesajı aşağıdaki gibi olabilir.

PHP Warning: strcmp() expects parameter 2 to be string, array given in …

 

Kullanılan sanal makinede kullanılan “strcmp($password, $_POST[“pass”]) == 0” şeklindeki karşılaştırma da hata alınması durumunda, “NULL == 0 = TRUE” şeklinde yorumlanarak DOĞRU sonuç verecektir. Eğer karşılaştırma işlemi “==” yerine “===” ile yapılsa idi; “NULL === 0 = FALSE” şeklinde yorumlanarak YANLIŞ sonuç verecektir. Detaylar için PHP manuelindeki yorum incelenebilir.

https://secure.php.net/manual/en/function.strcmp.php#113364

 

Zafiyetin istismarı için hataya sebebiyet verecek şekilde Katar (String) ve Dizi (Array) karşılaştırması yapılabilir. “pass” şeklindeki katar değişkeni yerine “pass[]” şeklindeki dizi değişkeni kullanılacaktır. Böylece oturum açılabilmiştir.

 

Kaynak:

https://reedphish.wordpress.com/2016/11/20/imf-walkthrough/
https://g0blin.co.uk/imf-vulnhub-writeup/

 

 

Yazarın Bilgileri

Ertuğrul BAŞARANOĞLU
Ertuğrul BAŞARANOĞLU

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kullanabileceğiniz HTLM etiketleri ve özellikleri: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Bu sayfada incelenen konulardan doğacak sorunlar kişinin kendi sorumluluğundadır.