В списке уязвимостей, связанных с различного рода инъекциями (SQL, LDAP, XPath, etc) появилось новое наименование – Expression Language Injection. Новая разновидность инъекций описана в свежем исследовании Стефано ди Паолы (Stefano Di Paola) и Аршана Дабирсиаги (Arshan Dabirsiaghi). Уязвимость затрагивает JSP-приложения, написанные с использованием популярного в этой среде фреймворка Spring MVC. В результате успешной атаки EL Injection может привести к утечке данных как со стороны сервера (пути, значения глобальных переменных, etc), так и пользователя (обход httpOnly, получение идентификаторов сессий). Уязвимость возможна в том случае, когда внутри JSP-тэгов фреймворка Spring используется Expression Language – скриптовый язык, позволяющий получить доступ к Java-компонентам из JSP:
[html]<spring:message scope=”${param.foo}”/>[/html]
В чем заключается уязвимость?
Дело в том, что в Spring MVC выражения Expression Language внутри определенных атрибутов выполняются дважды, поэтому, приложение, получающее входящие данные посредством Expression Language как в примере выше, уязвимо к внедрению произвольных EL-выражений.
Expression Language Injection отлично поддается фаззингу. Проверить приложение на уязвимость можно, отправляя EL-выражения и проверяя на выходе результат их выполнения, например значение параметра ${9999+1} – поиск в ответе 10000. Другим способом является отправка некорректных конструкций Expression Language и проверка строк, свидетельствующих об ошибке:
Parsing of JSP EL expression “${${2*2}” failed
К чему может привести El Injection?
- раскрытие путей в содержании результата выполнения ${applicationScope}:
…
{org.apache.catalina.jsp_classpath=/
home/arshan/ELInjection/target/
ELInjection/WEB-INF/classes/:/
home/arshan/ELInjection/target/
ELInjection/WEB-INF/lib/aopalliance- 1.0.jar:/home/arshan/ELInjection/
target/ELInjection/WEB-INF/lib/
commons-logging-1.1.1.jar
…
javax.servlet.context.tempdir=/ home/arshan/ELInjection/target/ tomcat/work/localEngine/localhost/ELInjection
} - раскрытие данных приложения: строки подключения к базе данных, конфиденциальная информация в результатах SQL-запросов, другие серверные переменные;
- обход httpOnly – вывод в тело html-документа cookie, защищенных параметром httpOnly:
http:///vulnerable.com/spring/foo?param=${cookie[“JSESSIONID”].value}
Благодаря тернарному оператору (expr1?expr2:expr3), Expression Language Injection может быть реализована “слепым” методом. Как и при SQL-инъекциях, данные можно получить последовательным перебором по алфавиту или с использованием бинарного поиска. Пример реализации Blind EL Injection доступен здесь (удаленно извлекается JSESSIONID с помощью кросс-доменных запросов).
Как защититься?
Авторы исследования предлагают решить проблему радикально, отключив Expression Language:
[html]<%@ page isELIgnored ="true" %>[/html]
Разумеется, более предпочтительным вариантом является фильтрация входящих данных: для этого необходимо проводить проверку на наличие строк ${ и #{. В настоящий момент уязвимость в Spring MVC устранена.
Leave a Reply