Выступления энергичного и обаятельного Симы, в которых он как семечки раскалывает парольную защиту некоторых Web-сайтов, всегда пользуются большим успехом у аудитории, но достойно внимания, что за несколько лет некоторые предметы этих выступлений остаются неизменными. Механизм проверки сайта на уязвимость к SQL-инъекции, например, был подробно описан Симой в статье Locking the Door Behind You: Hacker Protection for Your Web Applications в 2005 году, однако и на форуме «Программные миры HP 2009» демонстрация подобного и других взломов вызвала живой интерес и аплодисменты. Означает ли это, что хорошо известная угроза остается по-прежнему актуальной, в частности потому, что многие компании продолжают использовать приложения, написанные несколько лет назад? Сима свидетельствует, что дело обстоит именно так. Впрочем, начать с SQL-инъекции в этот раз он решил в основном потому, что на этом примере очень легко показать людям, не являющимся экспертами в области безопасности, угрозы и риски Web-уязвимостей.
«Всего три месяца назад был пойман взломщик, совершивший крупнейшее в истории хищение персональных данных — 130 млн реквизитов кредитных карт, используя именно эту уязвимость, SQL-инъекцию», — подтвердил Сима сохраняющуюся актуальность угрозы в беседе с обозревателем Computerworld. «Это позор, что даже спустя столько времени обсуждений проблема продолжает существовать», — добавил он.
Опасность SQL-инъекции возникает тогда, когда параметр, отсылаемый серверному приложению в запросе GET протокола HTTP (куда он попадает из гиперссылки или строки браузера), напрямую передается в систему управления базой данных. Например, если к адресу www.site.com/script.php?text=1 после единицы добавить апостроф (признак начала и конца текстовой константы), а серверное приложение не проверяет корректность параметра, то при определенных настройках сервера пользователю может быть выдано сообщение СУБД об ошибке. В этом случае можно добавить более сложное выражение, включая разного рода функции преобразования типов. Сервер базы данных, отвечая на ввод, может выдавать названия таблиц, строк, выполнять разные команды, а полная информация о содержимом таблиц может быть получена с помощью запросов, предполагающих ответ «истина» или «ложь».
На форуме Сима продемонстрировал работу приложения, которое, используя описанную уязвимость, быстро выгружает с сервера содержимое всей базы данных.
Примечательно, что в описании протокола HTTP метод GET определен как «безопасный», так как предполагается, что он не должен изменять состояние сервера. Однако этим правилом сплошь и рядом пренебрегают: из-за простоты соблазн использования GET как универсального метода слишком велик. Но, даже если соблюдать это правило, вышеописанные опасности все равно остаются в силе.
Сима советует придерживаться очень простого принципа: «Говорите вашим разработчикам, чтобы они всегда выполняли надлежащую проверку входных данных. Если они будут следовать этому правилу, то без каких-либо инструментальных средств или технологий, без специальных знаний в области безопасности вам удастся избежать до 80% уязвимостей в Web-приложениях».
Указанные уязвимости инвариантны по отношению к языку, на котором написано приложение, хотя, как отметил Сима, в Microsoft, например, многое сделали, чтобы повысить защищенность приложений, разрабатываемых на .Net. Системы разработки на Java также имеют ряд библиотек со средствами защиты, однако анализ кода — исключительно сложная задача, подчеркнул вице-президент HP.
HP развивает целый набор полученных с покупкой SPI Dynamics инструментов для диагностики уязвимостей Web-приложений. Например, HP Assessment Management Platform позволяет распространить программу обеспечения безопасности Web-приложений на весь цикл их разработки и поставить ее под контроль руководителей, не являющихся экспертами в области безопасности. А программа HP WebInspect обеспечивает анализ сложных Web-приложений на целый ряд уязвимостей, включая SQL-инъекцию, переполнение буфера, передачу кода через формы и т. д., и поддерживает AJAX, Flash, SOAP и целый ряд других технологий. К сожалению, далеко не все ошибки могут быть выявлены автоматически. Но, по крайней мере, поиск фрагментов, содержащих операторы ввода, которые затем могут быть просмотрены программистом, легко автоматизируется.