Прежде всего хочу поделиться ценной ссылкой – http://www.indianz.ch/. Данный ресурс имеет огромный и постоянно обновляемый каталог утилит и программ, имеющих отношение к информационной безопасности и взлому – от полезных скриптов в несколько десятков строк до таких монстров как metasploit. Именно здесь я нашел PoC, реализующий способ, который позволяет извлекать таблицы целиком за один запрос при SQL-инъекциях в MSSQL.
Новая техника называется SFX-SQLi – Select For Xml SQL Injection. В ее основе лежит применение оператора FOR XML для SELECT, который впервые появился в MSSQL 2000 и служит для преобразования результата выборки в формат данных XML, при чем на выходе всегда будет одна строка. Пример:
SELECT * FROM [test].[dbo].[articles] FOR XML RAW
Несмотря на то, что оператор FOR XML известен еще со времен SQL Server 2000, техника SFX-SQLi получила освещение лишь в феврале этого года в работе Daniel Kachakil. Тем не менее, некоторые специалисты указывают на упоминание применения FOR XML в SQL-инъекциях еще в 2007 году.
Новая техника не имеет ограничений на максимальную длину возвращаемых данных, как это происходит в MySQL при использовании функции GROUP_CONCAT(), поэтому применение SFX-SQLi имеет смысл только в UNION-векторах, так как в SQL-инъекциях, основанных на ошибках (error-based SQLi), длина строки с ошибкой имеет ограничение на длину. Алгоритм проведения атаки во многом схож с традиционным:
- Определение количества колонок в исходном запросе:
- С использованием оператора ORDER BY
- С использованием операторов HAVING и GROUP BY
- Последовательный перебор колонок в UNION SELECT
- Определение типов данных каждой колонки
Последовательная подстановка строкового значения в поля таблицы до тех пор, пока не будет найдено поле с выводом. Замечу, что для предотвращения ошибок, связанных с типом данных ntext, следует использовать конструкцию UNION ALL SELECT. - Получение имен таблиц из системной базы данных information_schema
- Получение содержимого таблиц с помощью подзапроса SELECT … FOR XML
Здесь стоит отметить, что FOR XML возвращает данные о структуре таблиц, поэтому знать имена колонок не нужно
Пример SQL-запроса с внедренным кодом, реализующим SFX-SQLi:
SELECT * FROM [test].[dbo].[articles] WHERE [id] = 1 UNION ALL SELECT null, ( SELECT [username] ,[password] FROM [test].[dbo].[users] FOR XML RAW ), null
Большинство языков программирования имеют встроенные средства по работе с XML, именно поэтому автоматизация SFX-SQLi довольно тривиальна, в чем можно убедиться, просмотрев исходные коды PoC (написан на VB.NET). Утилита также реализует метод извлечения данных, позволяющий избежать потерь при больших объемах и высокой нагрузке SQL-сервера.
К сожалению, реализация FOR XML в MSSQL 2000 отличается от более новых версий, что выражается в ряде ограничений. Прежде всего это отсутствие поддержки FOR XML в подзапросах. Более подробная информация доступна в официальной документации SQL Server 2000.
Leave a Reply