Основное предназначение WAF — выявлять атаки на веб-приложение. Мы пошли дальше и реализовали систему виртуального патчинга, позволяющую накладывать заплатки «на лету», не дожидаясь выпуска обновлений вендором. В статье будут рассмотрены примеры поиска уязвимостей в веб-приложении и создания виртуальных патчей к ним.
Система виртуального патчинга в Nemesida WAF представлена в виде сканера уязвимостей и функционала, позволяющего конвертировать обнаруженные уязвимости в виртуальный патч.
Nemesida Scanner
Для выпуска патча необходимо сперва найти уязвимости. Чтобы во время их поиска работа веб-приложения не была нарушена, мы разработали специальную «облегченную» версию Nemesida Scanner для Nemesida WAF. В таблице ниже представлено сравнение версий.
Nemesida Scanner (Full version) | Nemesida Scanner (Nemesida WAF version) |
---|---|
— выявляет уязвимости: SQL-инъекции, XSS, LFI/RFI, XXE, Оpen-redirect; — выявляет компоненты с известными уязвимостями; — обнаруживает критичные данные (файлов, каталоги, поддомены) в открытом доступе; — определяет версий и типов установленных CMS, их плагинов; — выявляет недостатки конфигурации веб-приложения; — подбирает пароли; — сканирует порты. |
— выявляет SQL-инъекции, XSS; — обнаруживает критичные данные (файлы, каталоги, поддомены) в открытом доступе; — выявляет компоненты с известными уязвимостями. |
Версия сканера для Nemesida WAF, в отличие от полной версии, не несет опасную «полезную нагрузку», таким образом способна производить поиск уязвимостей не нарушая штатной работы веб-приложения, используя метод файзинга передаваемых параметров с подстановкой множества типов запросов (payloads), наличие уязвимости определяется по таким симптомам, как типы ответов веб-приложения, задержка ответов и т.д.
Симптомы наличия SQL injection
- Sql syntax
- System.Data.OleDb.OleDbException
- [SQL Server]
- [Microsoft][ODBC SQL Server Driver]
- [SQLServer JDBC Driver]
- [SqlException
- System.Data.SqlClient.SqlException
- Unclosed quotation mark after the character string
- '80040e14'
- mssql_query()
- odbc_exec()
- Microsoft OLE DB Provider for ODBC Drivers
- Microsoft OLE DB Provider for SQL Server
- Incorrect syntax near
- Sintaxis incorrecta cerca de
- Syntax error in string in query expression
- ADODB.Field (0x800A0BCD)<br>
- ADODB.Recordset'
- Unclosed quotation mark before the character string
- '80040e07'
- Microsoft SQL Native Client error
- SQL Server Native Client
- Invalid SQL statement
- SQLCODE
- DB2 SQL error:
- SQLSTATE
- [CLI Driver]
- [DB2/6000]
- Sybase message:
- Sybase Driver
- [SYBASE]
- Syntax error in query expression
- Data type mismatch in criteria expression.
- Microsoft JET Database Engine
- [Microsoft][ODBC Microsoft Access Driver]
- PostgreSQL query failed:
- supplied argument is not a valid PostgreSQL result
- unterminated quoted string at or near
- pg_query() [:
- pg_exec() [:
- supplied argument is not a valid MySQL
- Column count doesn\'t match value count at row
- mysql_fetch_array()
- mysql_
- on MySQL result index
- You have an error in your SQL syntax;
- You have an error in your SQL syntax near
- MySQL server version for the right syntax to use
- Division by zero in
- not a valid MySQL result
- [MySQL][ODBC
- Column count doesn't match
- the used select statements have different number of columns
- DBD::mysql::st execute failed
- DBD::mysql::db do failed:
- com.informix.jdbc
- Dynamic Page Generation Error:
- An illegal character has been found in the statement
- [Informix]
- Warning: ibase_
- Dynamic SQL Error
- [DM_QUERY_E_SYNTAX]
- has occurred in the vicinity of:
- A Parser Error (syntax error)
- java.sql.SQLException
- Unexpected end of command in statement
- [Macromedia][SQLServer JDBC Driver]
- could not prepare statement
- Unknown column
- where clause
- SqlServer
- syntax error
- Microsoft OLE DB Provider
- MariaDB
Информация о выявленных уязвимостях отображается в личном кабинете Nemesida WAF.
Пример работы Nemesida Scanner (WAF module)
В качестве примера работы Nemesida Scanner можно привести уязвимость типа SQLi в приложении DVWA (Damn Vulnerable Web Application):
http://example.com/vulnerabilities/sqli/?id=2&Submit=Submit
В данном примере «id» является уязвимым параметром, который будет выявлен сканером путем подстановки различных значений. Например, при подстановке вместо значения обычной кавычки веб-приложение выдаст ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''''' at line 1
позволяя Nemesida Scanner по симптому ответа выявить уязвимость класса «Error based sql-injection».
Virtualpatching
После того, как Nemesida WAF выявит уязвимость в защищаемом веб-приложении, производится ее ручная валидация. Если уязвимость существует, выпускается правило виртуального патчинга, блокирующее возможность эксплуатации уязвимости злоумышленником.
Виртуальный патчинг – это механизм, который исключает возможность использования уязвимости в ПО и не требует внесения изменений в исходный код ПО. Реализуется этот механизм в слое обеспечения безопасности, который осуществляют анализ и фильтрацию входящего трафика.
Виртуальный патчинг — защищает приложения сайта от неисправленных уязвимостей, обнаруживая попытки эксплуатации уязвимостей, что позволяет не нарушать работу веб-приложения. Применения правил виртуального патчинга позволяет разработчикам спокойно заниматься исправлением уязвимости, без необходимости срочного изменения кода (который может повлечь за собой проблемы в безопасности. Виртуальный патчинг позволяет «на лету» блокировать все попытки эксплуатации известной уязвимости, особым образом контролируя зону атаки.
Пример 1. PHP Melody 2.7.1 — 'playlist' SQL Injection
Передача значения «foo» в параметре «id» может привести к эксплуатации уязвимости, причём значение «foo» может не входить в «классические сигнатуры» из-за своей специфичности.
Эксплуатация уязвимости CVE-2018-5211 (PHP Melody 2.7.1 — 'playlist' SQL Injection) будет заблокирована сигнатурным анализом (без обфускации), либо модулем искусственного интеллекта «Nemesida AI» — при обфускации кода.
GET /ajax.php?p=video&do=getplayer&vid=randomid&aid=1&player=detail&playlist='+(select*from(select(sleep(20)))a)+' HTTP/1.1
Правилом виртуального патчинга для параметра «playlist» будет являться запрет использования любых параметров, кроме допустимых (верных). В данном случае правило патча не допустит иных параметров, кроме цифровых:
playlist=123
Пример 2. Классическая SQL-инъекция
Использование ограниченного набора символов для уязвимого параметра применимо и к указанному выше примеру (выявленному по симптому ответа веб-приложения):
http://test/vulnerabilities/sqli/?id=2&Submit=Submit
использование символов, отличных от 0-9 (белый список), либо ограничение использования символов или запросов, приводящих к эксплуатации уязвимости (черный список), например таких, как одинарная и двойная кавычки, спецсимволы (%,&), скобки, синтаксис MySQL команд и т.д. Большинство из них входит в сигнатуры (первичная модель работы, до обучения «Nemesida AI»), но использование всех или группы вхождений такого рода (в базе сигнатур) приведет к появлению ложных срабатываний (false positive), поэтому применение этих запросов допустимо в конкретной зоне и в уязвимом параметре. При достаточно высоком количестве запросов. После того, как модуль искусственного интеллекта произведет обработку достаточного для построения модели веб-приложения запросов, подобные атаки будут автоматически блокироваться модулем Nemesida AI без ложных срабатываний.
Пример 3. CVE: 2017-5638 — Apache Struts2 S2-045
Часть исходного кода эксплоита приведёна в качестве примера, в нем отсутствуют признаки классических веб-уязвимостей:
payload = "%{(#_='multipart/form-data')."
payload += "(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)."
payload += "(#_memberAccess?"
payload += "(#_memberAccess=#dm):"
payload += "((#container=#context['com.opensymphony.xwork2.ActionContext.container'])."
payload += "(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))."
payload += "(#ognlUtil.getExcludedPackageNames().clear())."
payload += "(#ognlUtil.getExcludedClasses().clear())."
payload += "(#context.setMemberAccess(#dm))))."
payload += "(#cmd='%s')." % cmd
payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."
payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))."
payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
payload += "(#p.redirectErrorStream(true)).(#process=#p.start())."
payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
payload += "(#ros.flush())}"
Правилом виртуального патчинга для данной уязвимости будет использование специфичных, присущих данной эксплуатации, вхождений и их возможных модификаций, а также зон применения. Например, это может быть вхождение «struts2.ServletActionContext».
Заключение
В то время, как Nemesida WAF обнаруживает и блокирует широкий спектр уязвимостей, применение виртуального патчинга позволяет значительно сузить область действия правила блокировки, минимизируя ложные срабатывания. На базе виртуального патчинга могут быть созданы новые сигнатурные методы блокирования атак, необходимые для первичной защиты веб-приложения, пока модуль искусственного интеллекта «Nemesida AI» производит построение моделей.
Предыдущие статьи:
Искусственный интеллект Nemesida WAF
Улучшаем работу искусственного интеллекта в Nemesida WAF
Nemesida WAF — это мощный инструмент для выявления и блокирования атак на веб-приложения на основе искусственного интеллекта. Чтобы ощутить это на практике — запросите предустановленную VM с Trial-версией Nemesida WAF или активируйте облачную защиту на 2 недели бесплатно.