Insecure CAPTCHA DVWA (Low) adlı bu writeup ta Damn Vulnerable Web Application ın odalarında biri olan Insecure CAPTCHA odasının Low seviyesinin çözümü gösterilmektedir.
Insecure CAPTCHA ekranına gelindiğinde config.inc.php dosyası içerisinde reCAPTCHA API key inin olmadığı uyarısı alınmıştır. Dolayısıyla bu durumu çözmek için öncekikle reCAPTCHA dan key alınması gerekir.
Yazılan ve seçilen işlemlerin aynısı yapıldığına elinizde bir API key olacaktır.
Submit e tıklayarak API Key lerine ulaşılmaktadır.
Bu reCAPTCHA API Key leri, DVWA nın kurulu olduğu dizindeki config.inc.php içerisindeki belirtilen alana yazılmalıdır.
reCAPTCHA API Key bilgileri yazılıp kaydedilmiştir.
Ardından DVWA web tarayıcıdan açıldığında ve sayfa yenilendiğinde reCAPTCHA aktif olarak çalışır duruma gelmiştir.
Ardından parola değişikliği için input alanları doldurulduğunda ve reCAPTCHA kutucuğu onaylandığında giden paket incelenmektedir.
‘Change’ e tıklandığındaysa istek reCAPTCHA tarafından onaylanıyor ve reCAPTCHA isteğe cevap veriyor Sonraki adımda doğrulamasız değişim onay isteği sunucuya gidiyor.
Bu istek yakalanıyor ve default olarak bu istekle her şifre değişiminde reCAPTCHA atlatılmış oluyor.
📋Kaynak Kod Analizi
Insecure CAPTCHA DVWA (Low) da bu sistemin nasıl çalıştığına dair daha fazla bilgiye ulaşabileceğimiz bir yer olan kaynak kod analizi kısmına gelelim.
‘View Source’ a tıklayarak sayfanın PHP kaynak kodlarını incelemekle başlıyoruz.
<?php
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
// Hide the CAPTCHA form
$hide_form = true;
// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];
// Check CAPTCHA from 3rd party
$resp = recaptcha_check_answer(
$_DVWA[ 'recaptcha_private_key'],
$_POST['g-recaptcha-response']
);
// Did the CAPTCHA fail?
if( !$resp ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
echo "
<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
<form action=\"#\" method=\"POST\">
<input type=\"hidden\" name=\"step\" value=\"2\" />
<input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
<input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
<input type=\"submit\" name=\"Change\" value=\"Change\" />
</form>";
}
else {
// Both new passwords do not match.
$html .= "<pre>Both passwords must match.</pre>";
$hide_form = false;
}
}
}
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true;
// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];
// Check to see if both password match
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Feedback for the end user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with the passwords matching
echo "<pre>Passwords did not match.</pre>";
$hide_form = false;
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
PHPGelin bu sistemin arka planında neler çalıştığını daha detaylı inceleyelim:
- Eğer
POST
isteği ‘Change’ adında bir düğmeye tıklanmışsa ve ‘step’ değeri ‘1’ ise, buif
bloğu çalışır. Bu, CAPTCHA’nın doğruluğunu kontrol etmeye başlayacağımız aşamadır. - CAPTCHA doğrulama için, $_DVWA dizisinden (muhtemelen bir çerçeve veya uygulama çerçevesine ait bir değişken) özel bir anahtar kullanılarak, Google’ın reCAPTCHA hizmetiyle sunulan bir fonksiyon çağrılır.
- CAPTCHA doğrulaması başarısız olursa, kullanıcıya uygun bir hata mesajı gösterilir ve formun tekrar gösterilmesi sağlanır.
- CAPTCHA doğrulaması başarılıysa, kullanıcıdan alınan yeni şifrelerin eşleşip eşleşmediği kontrol edilir.
- Yeni şifreler eşleşiyorsa, kullanıcıya şifre değiştirme işleminin sonraki adımı için bir form gösterilir. Bu form, kullanıcıya şifreyi değiştirme işlemini onaylaması için bir düğme sunar.
- Eğer yeni şifreler eşleşmiyorsa, kullanıcıya bir hata mesajı gösterilir ve formun tekrar gösterilmesi sağlanır.
- İkinci bir durum kontrolü, eğer POST isteği ‘Change’ adında bir düğmeye tıklanmışsa ve ‘step’ değeri ‘2’ ise gerçekleştirilir. Bu, kullanıcının yeni şifreleri onayladığı adımdır.
- Yeni şifreler eşleşiyorsa, veritabanındaki kullanıcının şifresi güncellenir ve kullanıcıya bir başarılı bildirimi gösterilir.
- Eğer yeni şifreler eşleşmiyorsa, kullanıcıya bir hata mesajı gösterilir.
- Son olarak, veritabanı bağlantısı kapatılır.
DVWA (Low) nın diğer write up larına buraya tıklayarak ulaşabilirsiniz.
Erkan Çekiç
HacktorX YazarıMerhaba. Henüz çocukluk dönemimde yanmaya başlayan siber güvenlik ateşini lise ve üniversite dönemlerinde de harlayan, zamanının büyük bir bölümünü çalışmak ve bir şeyler üretmek üzerine kullanan biriyim.