Friday, November 27, 2015

ZN2015: HQLi


Вчера с Мишей делали доклад на конференции. Выкладываю презентацию:




демонстрационное видео, и скрипты, традиционно, доступны.

Судя по общению после доклада есть необходимость прояснить некоторые моменты.
1. Причина работы всех показанных эксплуатаций - ошибка программиста приложения:
 
Т.е. уязвимость, которую мы здесь эксплуатировали связана не с ошибками в Hibernate. Защита от таких уязвимостей стандартна, как и в SQLi, - использование параметризованных запросов. Вариант с атакой на параметризованные запросы мы не рассматривали, так как в этом случае не будет работать и SQLi, а доклад, главным образом, о том, как HQLi сводится, в частности, к bSQLi. Дополнительный аргумент "ЗА" исключение из рассмотрения варианта атак на параметризованные HQL-запросы в том, что для "эскейпинга" параметров HQL, очевидно, используется функция драйвера СУБД, поэтому если в этой функции есть ошибки, то их можно эксплуатировать не только в HQL, проблема в этом случае будет намного более глобальная*. Тем не менее, у меня в планах есть пофаззить юникодом то же приложение, но переписанное через параметризованный запрос, - в этом случае, если что-то получится, уже будет проблема даже не в самом Hibernate, а в СУБД, и ее можно будет зарепортить :)

2. Что здесь нового? Нового здесь то, что продемонстрировано как свести HQLi к bSQLi, т.е,. фактически,  забайпассить Hibernate. Здесь показано, что несмотря на то, что HQL имеет очень ограниченный синтаксис, что не позволяет нам формировать сложные HQL-запросы, как это можно в SQL, есть техники, позволяющие "обмануть" Hibernate, пробросить запрос непосредственно в СУБД и выполнить там инъекцию.

В докладе мы показали эти техники и рассказали для каких СУБД какие работают. В целом, техники не новы, однако, ново их применение для байпасса Hibernate.

 3. После доклада подбежали ребята от которых я узнал, что задачка байпасса Hibernate через эскейпинг ковычки была на каком-то хак-квесте, ребята просили пояснить как это работает. Поскольку ковырялся в основном с MSSQL и юникодом,  я затупил и не смог это пояснить (хотя уже позже сообразил, что на слайде 8 все предельно понятно :) ), однако, Миша все рассказал, ребята ушли довольные. В целом, коллеги хак-квест-разработчики, можете брать все приведенные в презентации трюки на вооружение и включать их в новые хак-квесты.



Традиционно хочу поблагодарить моего напарника Мишу за обнаружение этой, на мой взгляд, интересной темы, а также, конечно же, супругу, которая в очередной раз мне обещала, что эта конференция для меня последняя, но по глазам было понятно, что продолжение, обязательно, последует...

* HQL-запрос: SELECT p FROM hqli.persistent.Post p where p.name =:name
запрос SQL, к которому его приводит Hibernate: select post0_.id as id1_0_, post0_.name as name2_0_ from post post0_ where post0_.name=?
Hibernate не фильтрует параметры и не строит запрос, это все делает СУБД => ломать параметризованные запросы в Hibernate - все равно что ломать их в СУБД.